1、zuul简介

  1.1、zuul是什么 

  zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。

  Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

  Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

  1.2、zuul能做什么

  zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。

  Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

  • 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
  • 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
  • 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
  • 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
  • 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
  • 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

2、创建service-zuul工程

  2.1、创建service-zuul工程,pom.xml文件如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.lishun</groupId>
  7. <artifactId>service-zuul</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>service-zuul</name>
  12. <description>Demo project for Spring Boot</description>
  13.  
  14. <parent>
  15. <groupId>com.lishun</groupId>
  16. <artifactId>cloud</artifactId>
  17. <version>1.0-SNAPSHOT</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-web</artifactId>
  33. </dependency>
  34. </dependencies>
  35.  
  36. </project>

  2.2、在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:

  1. @EnableZuulProxy
  2. @EnableEurekaClient
  3. @SpringBootApplication
  4. public class ServiceZuulApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceZuulApplication.class, args);
  7. }
  8. }

  2.3、加上配置文件application.yml加上以下的配置代码:

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8761/eureka/
  5. server:
  6. port: 8769
  7. spring:
  8. application:
  9. name: service-zuul
  10. zuul:
  11. routes:
  12. api-a:
  13. path: /api-a/**
  14. serviceId: service-ribbon
  15. api-b:
  16. path: /api-b/**
  17. serviceId: service-feign

  首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;

  以/api-a/ 开头的请求都转发给service-ribbon服务;以/api-b/开头的请求都转发给service-feign服务;

  2.4、启动5个服务,浏览器访问 http://localhost:8769/api-a/hi?name=lis 页面显示

  1. hi lis ,i am from port:8762

  浏览器访问 http://localhost:8769/api-b/hi?name=lis 页面显示

  1. hi lis ,i am from port:8762

  这说明zuul起到了路由的作用

3、服务过滤

  前面提到,Zuul通过加载动态过滤机制,不仅可以实现路由功能,还能实现验证,检查,监控等功能。

   下面使用zuul来实现安全验证功能

  

  1. @Component
  2. public class MyFilter extends ZuulFilter {
  3. private static Logger log = LoggerFactory.getLogger(MyFilter.class);
  4. @Override
  5. public String filterType() {
  6. return "pre";
  7. }
  8.  
  9. @Override
  10. public int filterOrder() {
  11. return 0;
  12. }
  13.  
  14. @Override
  15. public boolean shouldFilter() {
  16. return true;
  17. }
  18.  
  19. @Override
  20. public Object run() throws ZuulException {
  21. RequestContext ctx = RequestContext.getCurrentContext();
  22. HttpServletRequest request = ctx.getRequest();
  23. log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
  24. Object accessToken = request.getParameter("token");
  25. if(accessToken == null) {
  26. log.warn("token is empty");
  27. ctx.setSendZuulResponse(false);
  28. ctx.setResponseStatusCode(401);
  29. try {
  30. ctx.getResponse().getWriter().write("token is empty");
  31. }catch (Exception e){}
  32.  
  33. return null;
  34. }
  35. log.info("ok");
  36. return null;
  37. }
  38. }

  filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用
    • filterOrder:过滤的顺序
    • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
    • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

  这时访问:http://localhost:8769/api-a/hi?name=lis ;网页显示:

  1. token is empty

  访问 http://localhost:8769/api-a/hi?name=lis&token=22 ; 网页显示:

  1. hi lis ,i am from port:8762

springCloud学习- 路由网关(zuul)的更多相关文章

  1. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  2. 玩转SpringCloud(F版本) 四.路由网关(zuul)

    本篇文章基于: 01)玩转SpringCloud 一.服务的注册与发现(Eureka) 02) 玩转SpringCloud 二.服务消费者(1)ribbon+restTemplate 03) 玩转Sp ...

  3. 白话SpringCloud | 第十一章:路由网关(Zuul):利用swagger2聚合API文档

    前言 通过之前的两篇文章,可以简单的搭建一个路由网关了.而我们知道,现在都奉行前后端分离开发,前后端开发的沟通成本就增加了,所以一般上我们都是通过swagger进行api文档生成的.现在由于使用了统一 ...

  4. 白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

    前言 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明.而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者对调用服务的异常进行二次处理等等.今天,我们就来了解下 ...

  5. SpringCloud学习系列之六 ----- 路由网关Zuul基础使用教程

    前言 在上篇中介绍了SpringCloud Config的完美使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关 ...

  6. springCloud学习4(Zuul服务路由)

    镇博图 springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本篇中 Zuul 版本为 1.x,目前最新的是 2.x,二者 ...

  7. springCloud之路API路由网关Zuul

    1.简介 简单的理解就是,相当于在所有服务的调用前加了一层防火墙, 主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的接口细节,提高系统的安全性: 官方文档:http ...

  8. 白话SpringCloud | 第九章:路由网关(Zuul)的使用

    前言 介绍完分布式配置中心,结合前面的文章.我们已经有了一个微服务的框架了,可以对外提供api接口服务了.但现在试想一下,在微服务框架中,每个对外服务都是独立部署的,对外的api或者服务地址都不是不尽 ...

  9. 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...

随机推荐

  1. 使用JDBC处理MySQL大文本和大数据

    LOB,Large Objects,是一种用于存储大对象的数据类型,一般LOB又分为BLOB与CLOB.BLOB通常用于存储二进制数据,比如图片.音频.视频等.CLOB通常用于存储大文本,比如小说. ...

  2. 在datagrid中的toolbar添加输入框

    转自:https://blog.csdn.net/u013178480/article/details/72358551 <code class="language-html" ...

  3. sql数据库CHECKDB时报x个分配错误和x个一致性错误

    --1.在SQL查询分析器中执行以下语句:(注以下所用的POS为数据库名称,请用户手工改为自己的数据库名) use pos dbcc checkdb --2.查看查询结果,有很多红色字体显示,最后结果 ...

  4. E20170709-hm

    scrape   vt. 擦,刮; 擦去; 擦伤,刮破; 挖空;

  5. thinkphp vender

    vender在thinkphp里面时引入系统的类库的意思,具体用法如下. Vendor('Classes.PHPExcel');表示引入vendor目录下的classes文件夹下面的phpexcel文 ...

  6. codevs4511信息传递(Tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  7. [Swift通天遁地]八、媒体与动画-(8)使用开源类库快速实现位移动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. SpringBoot入门之HelloWorld

    1.SpringBoot简介 百度百科:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而 ...

  9. android GPS 定位,取位置信息

    现在很多app ,需要取位置信息,所以我也做了一个模块用来取位置信息:   加入位置服务所需的权限: <uses-permission android:name="android.pe ...

  10. Offer收割_4

    1.水题 2.BFS宽搜(使用优先队列priority_queue) 4.题意:给数组a.要求重排列数组,使得数组中的任意相邻的两个元素不同.如果存在多个方案,那么选择字典序最小的方案.  如果不能满 ...