SpringCloud微服务(05):Zuul组件,实现路由网关控制

一、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

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

springboot2.0下的zuul路由网关初探

Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由、过滤、监控、弹性伸缩和安全。为什么需要ZuulZuul、Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能;网关将所有服务的API接口统一聚合,统一对外暴露。外界调用API接口时,不需要知道微服务系统中各服务相互调用的复杂性,保护了内部微服务单元的API接口;网关可以做

Spring Cloud系列教程(九):服务网关Zuul(Finchley版本)

一、前言Zuul是netflix开源的一个API网关服务器,其本质上是一个webservlet应用。Zuul是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul相当于是PC、APP、H5等客户端和Netflix流应用的Web网站后端所有请求的前门,Zuu

SpringCloud系列——Zuul 动态路由

  前言  Zuul是在SpringCloudNetflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和Netflix流应用的Web网站后端所有请求的前门。本文基于上篇(SpringCloud系列——Ribbon负载均衡(https://www.

Nepxion Discovery 5.5.0 发布

!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度

SpringCloud之zuul搭建

一、zuul简介Zuul的主要功能是路由和过滤器。路由功能是微服务的一部分,比如/api/user映射到user服务,/api/shop映射到shop服务。zuul实现了负载均衡。zuul有以下功能:AuthenticationInsightsStressTestingCanaryTesting