路由网关spring cloud zuul《九》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35781178/article/details/84331872

为什么需要zuul:

zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在:

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

zuul 的工作原理:

zuul 是通过servlet 来实现的,zuul 通过自定义的zuulServlet(类似于springmvc 的dispatcServelt)来对请求进行控制。zuul的核心是一系列过滤器,可以 在http 请求的发起和响应返回期间执行一系列的过滤器。zuul包括以下4种过滤:

zuul 包含的4种过滤器
pre 过滤器 它是在请求路由到具体的服务之前执行的,这种类型的过滤器可以做安全验证,例如身份验证,参数验证等。
routing 过滤器 它用于将请求路由到具体的微服务实例。在默认情况下,它是使用http client 进行网络请求的
post 过滤器 它是在请求已被路由到微服务后执行的,一般情况下,用作收集统计信息,指标,以及将响应传输到客户端
error 过滤器 它是在其他过滤器发生错误时执行的

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

zuul 具有的关键特性
type 类型 zuul 过滤器的类型,这个类型决定了过滤器在请求的那个阶段起作用,例如pre,post 阶段
execution order 执行顺序 规定了过滤器的执行顺序,order 的值越小,越先执行。
criteria 标准 filter 执行所需的条件
action 行动 如果符合执行条件,则执行action (逻辑代码)

zuul 请求的生命周期:

当一个客户端request 请求进行zuul 网关服务时,网关先进入pre filter,进行一系列的验证,操作或者判断。然后交给routing filter 进行路由转发,转发到具体的服务实例即行逻辑处理,返回数据。当具体的服务处理完后,最后由post filter 进行处理,该类型的处理器处理完后,将response 信息返回给客户端。

zuulServlet 是zuul 的核心servlet,zuulServlet 的作用是初始化zuulFilter ,并编排这些zuulFilter 的顺序。该类中有一个service()方法,执行了过滤器执行的逻辑。

####ZUUL 的配置注意:
1.zuul:
    routes:
      hiapi:
        path: /hiapi/**
        serviceId: eureka-client

######上述这两个配置就可以将以""hiapi"开头的Url 路由到eureka-client。hiapi 是自己定义的,需要指定它的path 和serviceId,两者
######配合使用,就可以将指定类型的请求Url 路由到指定的serviceId。            


####查看效果:
1.启动eureka-server
2.启动eureka-client
   java -jar .\eureka-client-0.0.1-SNAPSHOT.jar --server.port=8762
   java -jar .\eureka-client-0.0.1-SNAPSHOT.jar --server.port=8763
3.启动eureka-ribbon-client
4.启动eureka-feign-client
5.启动eureka-zuul-client
6.访问:http://localhost:5000/hiapi/hi?name=jie[轮询: hi:jiehow are you?8763 hi:jiehow are you?8762 ](负载均衡的体现)
7.访问:[http://localhost:5000/ribbonapi/hi?name=jie  |  http://localhost:5000/feignapi/hi?name=jie] (这就是负载均衡)
----------------------------------------------------------------------------
如果加版本号,则在yml 如上配置,访问:[http://localhost:5000/v1/feignapi/hi?name=jie](负载均衡,一样的效果)

yml:

spring:
  application:
    name: eureka-zuul-client
server:
  port: 5000
eureka:
  instance:
  appname: eureka-zuul-client
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    hiapi:
      path: /hiapi/**
      serviceId: eureka-client
    ribbonapi:
      path: /ribbonapi/**
      serviceId: eureka-ribbon-client
    feignapi:
      path: /feignapi/**
      serviceId: eureka-feign-client
zuul.prefix: /v1
在zuul 上配置熔断器
zuul 作为netflix 组件,可以与ribbon,eureka ,hystrix 等组件相结合,实现负载均衡,熔断器的功能。在zuul 中实现熔断功能需要实现ZuulFallbackProvider 接口。getRoute 用于指定熔断功能应用于哪些路由的服务"eureka-client","*"则代表所有的服务。代码中用*。

在zuul 使用过滤器:

1.zuul 实现过滤器只需要集成ZuulFilter,并实现ZuulFilter 中的抽象方法,filterType() 和 filterOrder()
  是过滤器的类型,共有四种:pre 过滤器   routing 过滤器   post 过滤器   error 过滤器
  filterOrder() 是过滤顺序,它是一个int 类型的值,值越小,越早执行该过滤器
  shouldFilter() 表示该过滤器是否过滤逻辑,如果为true,则执行 run()方法,如果未false ,则不执行run()方法,run()
  方法写具体的过滤逻辑。
访问:[http://localhost:5000/v1/hiapi/hi?name=jie&token=2345](可以正常访问,去掉token则不可以访问,这就是过滤器) , 实际开发中,可以用此过滤器进行安全验证。

zuul 的常见使用方式:

zuul 是采用了类似于spring mvc 的 Di'spachServlet实现的,采用的是异步阻塞模型,所以性能比Ngnix 差,由于zuul 和其他netflix 组件可以相互配合,无缝集成,zuul很容易就能实现负载均衡,智能路由和熔断器功能,在大多数情况下,zuul都是以集群的形式存在的。由于zuul的横向扩展能力非常好,所以当负载过高时,可以通过添加实例来解决性能瓶颈。

方法1:对不同的渠道使用不同的zuul 来进行路由。

方法2:集群通过ngnix 和zuul 相互结合来做负载均衡。暴露在最外面的时ngnix 主从双热备进行keepalive ,ngnix 经过某种路由策略,将请求路由转发到zuul 集群上,zuul最终将请求分发到具体的服务上。

猜你喜欢

转载自blog.csdn.net/qq_35781178/article/details/84331872
今日推荐