Spring Cloud与微服务之Zuul
文章目录
- Zuul的简介
- Zuul的添加方式
- 添加网关过滤器
Zuul的简介
Zuul是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用。
Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些鱼要求不符的请求。
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
- 动态路由:动态地将请求路由到不同的后端集群。
- 压力测试:主键增加指向集群的流量,以了解性能。
- 负载分配:为每一种负载类型分配对应容量,并启用超出限定值的请求。
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
- 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用者。
Zuul的添加方式
导入Zuul依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
添加网关服务依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
添加配置文件:
zuul:
routes:
item-service: #item-service 这个名字是任意写的
path: /item-service/** #配置请求URL的请求规则
#url: http://127.0.0.1:8081 #真正的微服务地址
serviceId: springcloud-goods-item #指定Eureka注册中心的服务id
启用Zuul:
在ApiGatewayApplication中添加下面的代码:
@EnableZuulProxy
添加网关过滤器
创建过滤器的方式如下,就是创建一个类,这里创建的是UserLoginZuulFilter,使其继承Zuul的ZuulFilter,然后我们重写其中的方法,比如如下面的重写其中的run()
方法。
package com.lyc.filters;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component //加入到Spring容器
public class UserLoginZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; //设置过滤器类型为pre
}
@Override
public int filterOrder() {
return 0; //设置执行顺序
}
@Override
public boolean shouldFilter() {
return true; //该过滤需要执行
}
@Override
public Object run() { //编写业务逻辑
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String token = request.getParameter("token");
if(StringUtils.isEmpty(token)){
requestContext.setSendZuulResponse(false); //过滤该请求,不对其进行路由
requestContext.setResponseStatusCode(401);
return null;
}
return null;
}
}
在上面代码中,我们实现功能是判断当前请求的url信息中是否含有登陆令牌token
,如果含有,则放行,如果不含有,则返回401
错误代码。
然后在启动类ApiGatewayApplication中启用UserLoginZuulFilter。
/** * 即便是所有的配置都写好了,如果不添加这个Bean方法,那还是不会执行任何的过滤方法 * @return */
@Bean
public UserLoginZuulFilter userLoginZuulFilter(){
return new UserLoginZuulFilter();
}
这样当我们通过服务网关访问商品服务时,如果我们含有token
,我们的访问结果是这样的:
当我们去掉token
令牌时,访问被阻止:
还没有评论,来说两句吧...