- 什么是Zuul
Zuul微服务的网关
- 为什么要有zuul
Zuul可以验证用户,负载均衡,压力测试。
- 怎么做
要求:访问的微服务必须有前缀
- 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
- 修改属性文件
server: port: 10000 spring: application: name: getway zuul: routes: provider03: path: /user-service/** url: http://127.0.0.1:8000
- 修改启动类
@EnableZuulProxy
代码实现
面向服务的路由
- 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 修改属性文件
eureka: client: registry-fetch-interval-seconds: 5 service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true
zuul: routes: provider03: path: /user-service/** serviceId: provider03
- 修改启动类
@EnableDiscoveryClient
routes: provider03: path: /user-service/** serviceId: provider03
简化路由:
zuul:
routes:
provider03:
path: /user-service/**
serviceId: provider03
简化:
zuul:
routes:
provider03: /user-service/**
默认路由规则
服务的id形式必须是:xxx-service
访问路径 /xxx-service/
路由前缀
zuul: prefix: /api
访问路径:
http://127.0.0.1:10010/api/user-service/user/2
Zuul过滤器
zuulFilter对象里面有
shouldFilter()返回的是boolen,返回true代表放行,false拦截
Run()执行具体的业务
filterType()
- pre:请求在被路由之前执行
- routing:在路由请求时调用
- post:在routing和errror过滤器之后调用
- error:处理请求时发生错误调用
filterOrder()执行的顺序,值越小,执行越早
过滤器的执行周期:
- pre:请求在被路由之前执行
- routing:在路由请求时调用
- 访问我们的服务
- post:在routing和errror过滤器之后调用
- error:处理请求时发生错误调用
实现过滤器
@Component public class LoginFilter extends ZuulFilter { @Override public boolean shouldFilter() { return true; } //判断请求中是否包含name的参数 @Override public Object run() throws ZuulException { System.out.println("---run---"); //需要获得request对象 RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); //访问路径 String token = request.getParameter("name"); //判断路径参数 if(token==null||"".equals(token.trim())){ //报错 requestContext.setSendZuulResponse(false); //访问失败 requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 返回401,会重新跳转到之前的页面 } //可以把用户的信息,继续保存,向后传 return null; } @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } }
Zuul集成了Ribbon和Hystrix的功能
zuul:
retryable: true
ribbon:
ConnectTimeout: 250 # 连接超时时间(ms)
ReadTimeout: 2000 # 通信超时时间(ms)
OkToRetryOnAllOperations: true # 是否对所有操作重试
MaxAutoRetriesNextServer: 2 # 同一服务不同实例的重试次数
MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 6000 # 熔断超时时长:6000ms