一、简介
路由是微服务中不可或缺的一部分,例如/可以路由到我们的web服务下,而/api/order,可以路由到我们的订单服务,/api/product,可以路由到我们的商品服务。Zuul是Netflix公司提供的基于JVM的路由器和服务器端的负载平衡器。
二、Zuul主要解决的问题
-
动态路由
-
鉴权
-
服务迁移
-
压力测试
三、如何使用Zuul
3.1 要想将Zuul引入到项目中,可以添加如下jar包的依赖
<!-- 依赖zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
3.2 配置路由信息
比如我的项目是想要路由到loy-client,则我的路由配置如下:
zuul:
routes:
loy:
seviceId: loy-client
由于使用了zuul网关,所以访问的路径为http://localhost:9090/loy-client/test,9090是zuul服务的端口,loy-client是目标调用的服务,test是目标调用服务的接口,返回结果为:
3.3 配置路由的几种方
- 配置serviceId
- 配置path和ur
- 配置忽略前缀
四、Zuul Http客户端
Zuul使用的默认Http客户端现在由Apache Http客户端而不是不推荐使用的Ribbon支持RestClient.要使用RestClient或OkHttpClient,设置ribbon.restclient.enable=true或ribbon.okhhttp.enable=true。如果要自定义Apache Http客户端或OK Http客户端,请提供类型为CloseableHttpClient或者Bean OkHttpClient.
五、注解使用Zuul的两种方式
5.1 @EnableZuulServer
如果使用@EnableZuulServer方式使用Zuul,可以运行Zuul服务器而不进行代理,或者选择性地打来代理平台的某些部分,但不会自动添加任何代理过滤器。
在这种情况下,仍然可以通过配置zuul.routes,来指定进入Zuul服务器的路由,但是没有服务发现,也没有代理,因此将忽略serviceId和Url设置
5.2 @EnableZuulProxy
使用代理方式进行zuul的使用,将会启用代理过滤器。
@EnableZuulProxy注解集成了
Ribbon
、注册发现、Hystrix
拥有了熔断及负载均衡等功能@EurekaZuulProxy注解集成了
SpringBootActuator
,新增了Routes端点,可以通过/routes路径
六、 Zuul原理
七、源码分析入口
7.1 源码的自动配置类
从zuul相关的starter包下有一个spring.factories文件,从该文件中,可以找到相关的自动配置类,这些自动配置类就是zuul启动时,会自动加载的的配置类。在该文件中包含两个自动配置类,分别是ZuulServerAutoConfiguration
,ZuulProxyAutoConfiguration
。原配置文件如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration,\
org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration
7.2 ZuulServerAutoConfiguration源码详解
(1)ZuulProperties 配置属性类
1) 该类中存在一个内部类ZuulRoute
该类包含了zuul配置路由转发的相关字段
public static class ZuulRoute {
private String id;
// 转发服务路径
private String path;
// 转发服务Id
private String serviceId;
// 转发url
private String url;
// 去除前缀
private boolean stripPrefix = true;
// 是否重试
private Boolean retryable;