连载:5-spring-cloud-zuul

路由网关Zuul
一、为什么需要zuul

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

二、zuul的工作原理
zuul是通过servlet来实现的,zuul通过自定义的zuulServlet(类似于Spring MVC的DispatchServlet)来对请求进行控制。Zuul的核心是一系列过滤器,可以在Http请求的发起和相应返回期间执行一系列的过滤器。

  • PRE过滤器:在请求路由到具体的服务之前执行的,这种类型的过滤器可以做安全验证,如身份验证、参数验证;
  • ROUTING过滤器:它将用于请求路由到具体的微服务实例,在默认情况下,它使用Http Client进行网络请求;
  • POST过滤器:它是在请求已被路由到微服务后执行的,一般情况下,用作手机统计信息、指标,以及将相应传输到客户端;
  • ERROR过滤器:它是在其他过滤器发生错误时执行的。
    zuul采取了动态读取、编译和运行这些过滤器。过滤器之间不能直接相互通信,而是通过RequestContext对象来共享数据,每个请求都会创建一个RequestContext对象。

三、Zuul过滤器的关键特性

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

四、Zuul请求的生命周期
当一个客户端Request请求进入Zuul网关服务时,网关先进入“pre filter”,进行一系列的验证、操作或者判断。然后交给“routing filter”进行路由转发,转发到具体的服务实例进行编辑处理、返回数据。当具体的服务处理完后,最后 由“post filter”进行处理,该类型的处理器处理完之后,将Response信息返回给客户端。
在这里插入图片描述

五、搭建Zuul服务
1、pom.xml
添加起步依赖:
spring-cloud-start-eureka、spring-cloud-start-zuul、spring-cloud-start-web、spring-cloud-start-test
2、启动类application.java
在程序的启动类上添加@SpringBootApplication,声明是一个springboot工程;
添加@EnableEurekaClient注解,开启Eureka Client功能;
添加@EnableZuulProxy注解,开启Zuul功能。
3、配置文件application.yml
配置端口号5000、服务名eureka-zuul-client、以及注册的Eureka Server地址peer1:8761
添加zuul的配置,配置path、serviceId
在这里插入图片描述
这样,通过访问http://localhost:5000/hiapi/hi?name=test就可以实现对eureka client两个实例的访问,同时实现了负载均衡,由此可见,zuul路由转发是做了负载均衡的。实际上是因为配置了serviceId,指定服务名。而zuul、eureka client都是同属于eureka Server的,所以才能通过服务名,路由到对应的服务,从而实现了负载均衡。
当然,也可以不需要zuul实现负载均衡,那么就需要自己维护注册列表。
首先需要将ribbon.eureka.enabled改为false,这样ribbon就不向Eureka Client获取服务注册列表信息。
然后自己维护一份注册列表,列表名.ribbon.listOfServers来配置多个负载均衡的url。
zuul.routes.hiapi.path=/hiapi/**
zuul.routes.hiapi.serviceId=hiapi-v1
ribbon.eureka.enable=false
hiapi-v1.ribbon.listOfServers=peer2:8762,peer3:8763

六、Zuul的常见使用方式
Zuul是采用了类似于SpringMVC的DispatchServlet来实现的,采用的是异步阻塞模型,所以性能比Ngnix差。由于zuul和其他Netflix组件可以相互配合、无缝集成,zuul很容易能实现负载均衡、只能路由和熔断等功能。在大多数情况下,zuul是以集成的形式存在的。由于Zuul的扩展性非常好,当负载过高的时候,可以通过添加实例来解决性能瓶颈。
1、对不同的渠道使用不同的Zuul来进行路由,例如移动端用一个Zuul网关实例,Web端用另一个Zuul网关实例;
2、集群是通过ngnix和zuul相互结合来做负载均衡的。暴露在外面的是Ngnix主从双热备份进行keepalive,Ngnix经过某种路由策略,将请求转发到Zuul集群上,最终zuul将请求分发到不同的服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值