5.1 API网关Zuul——路由器

5.1 API网关Zuul

一.Zuul的作用

Zuul是Netflix开源的微服务网关,它可以和eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。

  • 身份认证与安全:识别每个资源的验证请求,并拒绝那些与要求不符的请求。
  • 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由:动态的将请求路由到不同的后端集群。
  • 压力测试:逐渐增加只想集群的流量,以了解性能。
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
  • 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用者。
    Spring Cloud对Zuul进行了整合与增强。目前,Zuul使用的默认Http客户端是Apache Http Client,也可以使用RestClient或者okhttp3.OkHttpClient。如果想要使用RestClient,可以设置ribbon.restclient.enabled=true;想要使用okhttp3.OkHttpClient,可以设置ribbon.okhttp.enabled=true。

Zuul加入后的微服务架构图

在这里插入图片描述

不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul网关,然后再由网关来实现鉴权、动态路由等。Zuul就是服务的统一入口。

路由是微服务体系结构的一个组成部分。例如,可能会映射到web应用程序,/api/users映射到用户服务,并且/api/shop映射到商店服务。Zuul是来自Netflix的基于JVM的路由器和服务器端负载均衡器。

二.Zuul作为路由器的使用

Netflix使用Zuul事项:

Zuul的规则引擎允许使用任何JVM语言编写规则和过滤器,并内置对Java和Groovy的支持。

配置属性zuul.max.host.connections已经被两个新的属性所取代,zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections,默认为200和20。

默认的hystrix隔离模式(ExecutionIsolationStrategy)所有路线都是SEMAPHORE.
zuul.ribbonIsolationStrategy可以更改为THREAD如果选择这种隔离模式。

1.快速上手

  1. 通过脚手架SpringBoot Initializr添加一个新的Module
    file->module->Spring Initializr->输入模块信息->Spring Cloud Rounting ->Zuul
    查看pom文件,Zuul使用的依赖如下:
       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

  1. 为引导类添加注解 @EnableZuulProxy
  2. 配置 application.yml
server:
  port: 8010

spring:
  application:
    name: zuul
zuul:
  routes:
    service-privider:  #路由名称
      # 表示以service-privider开头的路径,路由到http://localhost:8080
      path: /service-privider/**
      url: http://localhost:8080

  1. 访问 http://localhost:8010/service-privider/user/get/1

2.1嵌入式Zuul反向代理
SpringCloud创建了一个嵌入式Zuul代理,以简化通用用例的开发,其中UI应用程序希望对一个或多个后端服务进行代理调用。此特性对于用户界面代理其所需的后端服务非常有用,从而避免了独立管理所有后端的CORS和身份验证问题的需要。
Zuul启动器不包括发现客户端,因此,对于基于服务ID的路由,还需要在类路径上提供其中之一(Eureka是一种选择)。

2.2 为网关加前缀
前面请求/myusers/1被转发给bootdemo-provider微服务。
若要向所有映射添加前缀,请设置zuul.prefix的值,例如/api
默认情况下,代理前缀将在请求被转发之前从请求中删除(你可以用zuul.stripPrefix=false)。你还可以从各个路由中关闭特定于服务的前缀的剥离,如下面的示例所示:

application.yml
 zuul:
  routes:
    users:
      path: /myusers/**
      stripPrefix: false

2.3.Zuul http客户端
Zuul使用的默认HTTP客户机现在由ApacheHTTP客户端支持,替代了RibbonRestClient。如果你想要使用RestClient或okhttp3.OkHttpClient,分别设置ribbon.restclient.enabled=trueribbon.okhttp.enabled=true。如果要自定义ApacheHTTP客户端或OK HTTP客户端,提供一个类型为ClosableHttpClient或OkHttpClient的bean即可。

2.4.将Zuul注册到Eureka中

  • 在Zuul的pom文件添加eureka-client依赖
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 修改Application.yml
server:
  port: 8010

spring:
  application:
    name: zuul
zuul:
  routes:
    service-provider: /provider/**
  prefix: /api
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka
  • 引导类添加注解@EnableDiscoveryClient
    开启service-provider微服务和eureka-server,访问网关

http://localhost:8010/api/provider/user/get/1

在这里插入图片描述

注意:这里也可以不配置Zuul,默认为服务id开头路径。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值