Zuul
Zuul是Netlix开源的微服务网关,它可以和Eureka、Ribbon、 Hystrix 等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
- 动态路由:动态地将请求路由到不同的后端集群。
- 压力测试:逐渐增加指向集群的流量,以了解性能。
- 负载分配:为每一 种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
- 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB ( Elastic Load Balancing )使用的多样化,以及让系统的边缘更贴近系统的使用者。
官方来说:不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuu这个网关,然后再由网关来实现鉴权、动态路由等等操作。Zuul就是我们服务的统一入口。
我自己的理解:假如我们的应用有20个微服务,在使用Zuul之前,用户是直接访问微服务的,很不安全,Zuul就是一个网关,把门作用,把所有请求拦截下来,进行分析:做路由、负载均衡、限流(限制用户流量)等工作。
Spring Cloud对Zuul进行了整合与增强。目前,Zuul 使用的默认HTTP客户端是ApacheHTTP Client,也可以使用RestClient或者okhttp3.0kHttpClient。如果想要使用RestClient,可以设ribbon.restclient.enabled=true;想要使用okhttp3.OkHttpClient,可以设置ribbon.okhttp.enabled=true。
快速入门
引入依赖
<!--zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
zuul已经引入了web、hystrix、ribbon的依赖了
启动
@EnableZuulProxy
@SpringBootApplication
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class);
}
}
配置
我们将符合path规则的一切请求,都代理到url参数指定的地址
本例中,我们将/user-service/** 开头的请求,代理到http://127.0.0.1:8081
server:
port: 10010
spring:
application:
name: gateway
zuul: # 配置Zuul
routes: # 配置路由规则,可以是多个
zuulId: # 路由id,名字可以任意,但不可重复
path: /user-service/** # 用来匹配url,**才是真实路径
url: http://127.0.0.1:8081 # 这是匹配成功后要访问的路径
测试
启动服务器,这是直接访问user-service正常服务。
现在通过Zuul路由控制访问,Zuul通过路由转发到user-service。
简化路由配置
细节1
在快速入门中,我们把路径为user-service的路径同一匹配到了http://localhost:8081中,如果将来服务名称发生变化或者这个服务启动了多台,这里就出现了错误,没有做负载均衡。
所以当zuul接收到请求后,不应该是转发到具体服务的,而是去eureka拉取服务列表,然后做负载均衡,转发到对应的服务中,也就是说我们在配置时,不应该是面向url地址的配置,而是面向服务的路由配置。
此时给zuul服务引入eureka依赖。并且更改配置
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
server:
port: 10010
spring:
application:
name: gateway
eureka:
client:
server-url:
defaultZone: http://127.0.0.1:10086/eureka
zuul: # 配置Zuul
routes: # 配置路由规则,可以是多个
hehe: # 路由id
path: /user-service/** # 用来匹配url,**才是真实路径
serviceId: user-service # 我们把服务的拉取交给eureka,所以不用配url路径了,只需给一个服务id即可,zuul内部引入了ribbon实现负载均衡选取服务
# url: http://127.0.0.1:8081 # 这是匹配成功后要访问的路径,此时注释掉
细节2-路由映射
路由id,太过随意,而且没有实际意义。一般习惯将路由id写成服务id。因此,提供了一种简化写法key是服务id,值是映射路径。 而这配置方式又太常见了,Zuul默认已经去eureka把所有的服务列表拉取下来,默认为每一个微服务提供一个默认的配置。所以什么都不需要配置了。
此时,如果你想修改映射路径的话就使用 key是服务id,值是映射路径。 这种方式进行修改即可。注意这里是添加操作,你虽然配置了新的映射路径值,但是默认的还在,使用默认的仍然是可以访问的。
那么你可能会问,有些服务,我们虽然是在eureka上注册了,但是只是让其在服务间调用,不用暴露给用户,此时怎么办?使用ignored-service进行配置,这是一个集合。
server:
port: 10010
spring:
application:
name: gateway
eureka:
client:
server-url:
defaultZone: http://127.0.0.1:10086/eureka
# zuul: # 配置Zuul
# routes: # 配置路由规则,可以是多个
# hehe: # 路由id
# user-service: /user-service/**
# consumer-service: /consumer-service/**
zuul:
routes:
user-service: /user/** # 添加映射路径值
ignored-services: # 配置不用暴露给用户的服务
- consumer-service
细节3-路由前缀
prefix:表示前缀。
strip-prefix:表示去除前缀。可以在某个服务上配置,也可是全局配置。
前缀配置可以参考