Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下 6 个方面:

  1. Zuul, Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能,Zuul 能够将请求流量按某种策略分发到集群状态的多个服务实例
  2. 网关将所有服务的 API 接口统一聚合,并统一对外暴露。外界系统调用 API 接口时,都是由网关对外暴露的 API 接口,外界系统不需要知道微服务系统中各服务相互调用的复杂性。微服务系统也保护了其内部微服务单元的 API 接口 , 防止其被外界直 接调用,导致服务的敏感信息对外暴露
  3. 网关服务可以做用户身份认证和权限认证,防止非法请求操作 API 接口,对服务器起到保护作用
  4. 网关可以实现监控功能,实时日志输出,对请求进行记录
  5. 网关可以用来实现流量监控,在高流量的情况下,对服务进行降级
  6. API 接口从内部服务分离出来,方便做测试

Zuul 的核心是一系列过滤器,可以在 Http 请求的发起和响应返回期间执行一系列的过滤器:

  1. PRE 过滤器:在请求路由到具体的服务之前执行,这种类型的过滤器可以做安全验证,例如身份验证、 参数验证等
  2. ROUTING 过滤器:用于将请求路由到具体的微服务实例。在默认情况下,它使用 Http Client 进行网络请求
  3. POST 过滤器:在请求己被路由到微服务后执行。 一般情况下,用作收集统计 信息、指标,以及将响应传输到客户端
  4. ERROR 过滤器:在其他过滤器发生错误时执行

Zuul 采取了动态读取、编译和运行这些过滤器。过滤器之间不能直接相互通信,而是通过 RequestContext 对象来共享数据,每个请求都会创建一个 RequestContext 对象。Zuul 过滤器具有以下关键特性:

  1. Type (类型): Zuul 过滤器的类型,这个类型决定了过滤器在请求的哪个阶段起作用,例如 Pre、Post 阶段等
  2. Execution Order (执行顺序): 规定了过滤器的执行顺序,Order 的值越小越先执行
  3. Criteria (标准): Filter 执行所需的条件
  4. Action (行动): 如果符合执行条件,则执行 Action (即逻辑代码)

使用 Zuul

新建 spring-cloud-eureka-zuul-client

pom

<parent><artifactId>spring-cloud-parent</artifactId><groupId>com.karonda</groupId><version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>spring-cloud-eureka-zuul-client</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

application.yml

server:port: 8051eureka:client:service-url:defaultZone: http://localhost:8001/eureka/spring:application:name: zuul-clientzuul:routes:hiapi:path: /hiapi/**serviceId: eureka-clientribbonapi:path: /ribbonapi/**serviceId: ribbon-clientfeignapi:path: /feignapi/**serviceId: feign-client

启动类

@EnableZuulProxy // 开启 Zuul
@SpringBootApplication
public class EurekaZuulClientApp {public static void main(String[] args){SpringApplication.run(EurekaZuulClientApp.class, args);}
}

测试

  1. 启动 eureka-server
  2. 启动 eureka-client (两个实例:一个 8011 端口,一个 8012 端口)
  3. 启动 eureka-ribbon-client
  4. 启动 eureka-feign-client
  5. 启动 eureka-zuul-client

多次访问 http://localhost:8031/hiapi/hi?name=victor 可以看到 8011 和 8012 端口交替出现 (Zuul 默认 与 Ribbon 结合实现了负载均衡)

多次访问 http://localhost:8031/ribbonapi/hi?name=victor 可以看到 8011 和 8012 端口交替出现

多次访问 http://localhost:8031/feignapi/hi?name=victor 可以看到 8011 和 8012 端口交替出现

在 Zuul 上配置熔断器

实现 FallbackProvider 接口

@Component
public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {return "eureka-client"; // 如果所有的路由服务都加熔断功能,返回 "*"}@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return 200;}@Overridepublic String getStatusText() throws IOException {return "OK";}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("error, fallback".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};}
}

测试

  1. 关闭所有的 eureka-client
  2. 重启 eureka-zuul-client

在 Zuul 中使用过滤器

继承 ZuulFilter

@Component
public class MyFilter extends ZuulFilter {private static Logger logger = LoggerFactory.getLogger(MyFilter.class);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object accessToken = request.getParameter("token");if(accessToken == null){logger.warn("token is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is empty");} catch (IOException e) {return null;}}logger.info("ok");return null;}
}

测试

  1. 重启 eureka-zuul-client

访问 http://localhost:8051/hiapi/hi?name=victor

访问 http://localhost:8051/hiapi/hi?name=victor&token=xx

完整代码:GitHub

本人 C# 转 Java 的 newbie, 如有错误或不足欢迎指正,谢谢

转载于:https://www.cnblogs.com/victorbu/p/11017272.html

Spring Cloud 学习 (五) Zuul相关推荐

  1. spring cloud 学习(6) - zuul 微服务网关

    微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...

  2. Spring Cloud学习笔记

    Spring Cloud学习笔记 相关代码地址:https://github.com/gongxings/spring-cloud-study.git 一.工程环境搭建 spring cloud版本: ...

  3. Spring Cloud 学习资料收集

    导读 关于Spring Cloud 去年开始逐渐多的出现在我的视线中,随着微服务这个词越来越热,我们或多或少的都听说过这个词,我们可以将Spring Cloud 看做是java 中Spring 为我们 ...

  4. Spring Cloud 学习笔记(2 / 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(3 / 3) - - - 56_Hystrix之全局服务降级DefaultProperties 57_Hystri ...

  5. Spring Cloud 学习笔记(2 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(3 / 3) - - - 56_Hystrix之全局服务降级DefaultProperties 57_Hystri ...

  6. Spring Cloud 学习笔记(1 / 3)

    Spring Cloud 学习笔记(2 / 3) Spring Cloud 学习笔记(3 / 3) - - - 01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Clou ...

  7. Spring Cloud学习笔记—网关Spring Cloud Gateway官网教程实操练习

    Spring Cloud学习笔记-网关Spring Cloud Gateway官网教程实操练习 1.Spring Cloud Gateway介绍 2.在Spring Tool Suite4或者IDEA ...

  8. Spring Cloud 学习总结

    Spring Cloud 学习笔记 微服务架构 微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,服务之间相互协调,互相配合,为用户提供最终价值.服务之间使用轻量 ...

  9. Spring Cloud学习笔记【十二】Hystrix的使用和了解

    Spring Cloud学习笔记[十二]Hystrix的使用和了解 Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Net ...

最新文章

  1. Java常见的面试算法题:实现两个线程交替打印1到100的数
  2. 干货 | 拒当调参师工程师:超参数搜索算法一览
  3. OpenGL 纹理学习总结
  4. Thymeleaf引用片段传入参数
  5. 科大星云诗社动态20210419
  6. 前端性能优化之防抖-debounce
  7. 分布式系统Quorum机制
  8. linux shell 脚本攻略学习11--mkdir和touch命令详解
  9. SharePoint 2010 Form 认证 之 IIS 添加数据
  10. 做程序员10年了,复制粘贴是我最牛的技能,直到我看到了这几个公众号
  11. (11)FPGA跨时钟域处理(第3天)
  12. 狄慧201771010104《面向对象程序设计(java)》第八周学习总结
  13. idea java sdk找不到指定文件路径_java-IntelliJ找不到任何声明
  14. 阿里云天池 Docker练习场(入门赛) 操作步骤
  15. 建模步骤_带你十个步骤学建模(二)
  16. 插件Sytrus合成器功能介绍
  17. ZEMAX双胶合透镜设计——光学设计学习笔记1
  18. 鼠标移入显示图片案例
  19. gnuradio3.8.2的安装步骤
  20. CS模式,客户端页面加载

热门文章

  1. icse ccf_ICSE的完整形式是什么?
  2. stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素
  3. 计算机二级c语言题库缩印,计算机二级C语言上机题库(可缩印做考试小抄资料)...
  4. 链表相加 2. 两数相加
  5. xpath 简单小记
  6. 链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
  7. 【c】‘声明’和malloc不要重复开辟空间
  8. C++ array初始化需要双层大括号
  9. leetcode(189) 旋转数组
  10. 04-树7 二叉搜索树的操作集 (30 分)