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.快速上手
- 通过脚手架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>
- 为引导类添加注解
@EnableZuulProxy
。 - 配置 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
- 访问 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=true
或ribbon.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开头路径。