一、Zuul组件简介
1、基础概念
Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。
2、Zuul的作用
1)按照不同策略,将请求转发到不同的服务上去;
2)聚合API接口,统一对外暴露,提高系统的安全性;
3)实现请求统一的过滤,以及服务的熔断降级;
3、案例结构

启动顺序如下:
1# 注册中心 2node05-eureka-7001 3# 两个服务提供者 4node05-provider-6001 5node05-provider-6002 6# 网关控制 7node05-zuul-7002
启动成功后,注册中心展示如下:

二、Zuul使用详解
1、核心依赖
1<!-- 路由网关 --> 2<dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-zuul</artifactId> 5</dependency>
2、核心配置文件
1server: 2 port: 7002 3spring: 4 application: 5 name: cloud-node05-parent 6eureka: 7 instance: 8 prefer-ip-address: true 9 client: 10 service-url: 11 defaultZone: http://registry01.com:7001/eureka/ 12zuul: 13 # 前缀,可以用来做版本控制 14 prefix: /v1 15 # 禁用默认路由,执行配置的路由 16 ignored-services: "*" 17 routes: 18 # 配置6001接口微服务 19 pro6001: 20 serviceId: node05-provider-6001 21 path: /api-6001/** 22 # 配置6002接口微服务 23 pro6002: 24 serviceId: node05-provider-6002 25 path: /api-6002/**
- 启动类注解:@EnableZuulProxy
3、统一服务降级
实现FallbackProvider接口,自定义响应提示。
1@Component 2public class FallBackConfig implements FallbackProvider { 3 private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ; 4 @Override 5 public ClientHttpResponse fallbackResponse(Throwable cause) { 6 // 捕获超时异常,返回自定义信息 7 if (cause instanceof HystrixTimeoutException) { 8 return response(HttpStatus.GATEWAY_TIMEOUT); 9 } else { 10 return fallbackResponse(); 11 } 12 } 13 private ClientHttpResponse response(final HttpStatus status) { 14 return new ClientHttpResponse() { 15 @Override 16 public HttpStatus getStatusCode() { 17 return status; 18 } 19 @Override 20 public int getRawStatusCode() { 21 return status.value(); 22 } 23 @Override 24 public String getStatusText() { 25 return status.getReasonPhrase(); 26 } 27 @Override 28 public void close() { 29 LOGGER.info("close"); 30 } 31 @Override 32 public InputStream getBody() { 33 String message = 34 "{\n" + 35 "\"code\": 200,\n" + 36 "\"message\": \"微服务飞出了地球\"\n" + 37 "}"; 38 return new ByteArrayInputStream(message.getBytes()); 39 } 40 @Override 41 public HttpHeaders getHeaders() { 42 HttpHeaders headers = new HttpHeaders(); 43 headers.setContentType(MediaType.APPLICATION_JSON); 44 return headers; 45 } 46 }; 47 } 48 @Override 49 public String getRoute() { 50 return "*"; 51 } 52 @Override 53 public ClientHttpResponse fallbackResponse() { 54 return response(HttpStatus.INTERNAL_SERVER_ERROR); 55 } 56}
4、统一过滤器
继承ZuulFilter类,自定义过滤动作。
1@Component 2public class FilterConfig extends ZuulFilter { 3 private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ; 4 @Override 5 public String filterType() { 6 return "pre"; 7 } 8 @Override 9 public int filterOrder() { 10 return 0; 11 } 12 @Override 13 public boolean shouldFilter() { 14 return true; 15 } 16 @Override 17 public Object run() { 18 RequestContext requestContext = RequestContext.getCurrentContext() ; 19 try { 20 doBizProcess(requestContext); 21 } catch (Exception e){ 22 LOGGER.info("异常:{}",e.getMessage()); 23 } 24 return null; 25 } 26 27 public void doBizProcess (RequestContext requestContext) throws Exception { 28 HttpServletRequest request = requestContext.getRequest() ; 29 String reqUri = request.getRequestURI() ; 30 if (!reqUri.contains("getAuthorInfo")){ 31 requestContext.setSendZuulResponse(false); 32 requestContext.setResponseStatusCode(401); 33 requestContext.getResponse().getWriter().print("Path Is Error..."); 34 } 35 } 36}
5、测试流程
1)测试网关配置
访问如下接口,响应正常,说明网关配置生效:
1http://localhost:7002/v1/api-6001/getAuthorInfo/1 2http://localhost:7002/v1/api-6002/getAuthorInfo/2
2)测试服务降级
关闭6001服务,再次访问接口,提示信息如下,说明服务降级策略生效:
1{ 2 "code": 200, 3 "message": "微服务飞出了地球" 4}
3)测试过滤器
因为请求URI不匹配getAuthorInfo,所以被拦截,说明过滤器略生效:
1http://localhost:7002/v1/api-6001/ 2响应提示: 3Path Is Error...
三、源代码地址
1GitHub地址:知了一笑 2https://github.com/cicadasmile 3码云地址:知了一笑 4https://gitee.com/cicadasmile
