zuul
对zuul进行一个简单的回顾
zuul是什么?
zuul是一个微服务网关,其与Nginx可以有很多时候有相同的应用场景
如果不用网关,的确会存在不少问题:
比如有:
1、客户端会多次请求不同的微服务,明显增加客户端的复杂性
2、存在跨域请求
3、认证问题,难道每个服务都要认证?
4、难以重构:如果客户端直接面向微服务,那么重构起来很麻烦
5、某些微服务可能使用了对防火墙/浏览器不友好的协议,直接访问有问题
微服务网关的优点有不少:
1、网关监控,非常重要,直接在网关进行各个监控
2、认证,直接在网关认证
3、减少客户端和各个微服务的交互次数
zuul的核心是一系列的过滤器,zuul也可以做静态响应
zuul的默认客户端是Apache HTTP Client,还可以用RestClient或者OkHttpClient
1.路由规则
zuul的路由规则是:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka-Server上的serviceId
2.负载均衡
注意,在application写上了@EnableZuulProxy以后,已经默认使用ribbon进行负载均衡策略了
3.Hystrix
用/hystrix.stream 的后缀访问zuul的网关地址,可以看得到hystrix,没问题
4.Actuator
当zuul和actuator配合使用的时候,zuul会暴露2个端点:/routes /filters,可以查看zuul详情,便于管理
/routes:
可以方便地查看到路由映射;后面加后缀?format=details可以查看更多详情
/filters:
这里可以查看zuul当前所有过滤器的详情;过滤器名字、顺序等
5.zuul路由配置
①上自定义指定微服务的路由映射
②忽略指定微服务
③忽略所有微服务,高度指定
④指定路由名称
⑤指定一个url和path,把path->url,所以自然这里就不能用ribbon了啊;但是有解决办法
⑥借助一个PatternServiceRouteMapper可以用正则来设mapper规则
⑦路由前缀
⑧保护敏感路径,可以忽略
⑨本地转发
6.敏感header/忽略header
可以指定某些服务的header不进行传递
也可以忽略一些header
7.文件上传
1M以内默认上传
大于10M,需要为上传路径添加/zuul前缀,也可以设自定义前缀
自然,文件大的时候要设置超时时间
关于文件上传,之后写demo肯定是要专门来写的
8.zuul过滤器(核心)
zuul的4种标准过滤器类型
PRE:请求路由之前被调用、可以实现身份验证等
ROUTING:请求路由给微服务
POST:处理响应
ERROR:处理错误
具体作用,不难,到时候直接找即可,这些过滤器都在源码中,如果需要,开专题讲zuul过滤器
编写自定义过滤器:
继承ZuulFilter,重写方法
9.回退
当微服务有服务无法正常响应的时候,会直接返回服务不可用
实现FallbackProvider接口,可以指定为哪个微服务提供回退,我们还可以获取造成回退的原因,如果需要之后开专题
10.懒加载
zuul整合ribbon默认是懒加载的,但是我们可以为ribbon设置饿加载
11.Query 编码
从网关-->分发到微服务,你的query string有解码编码,可能会有问题,强制保持一致需要另外配置
12.Hystrix有隔离策略:THREAD;SEAMPHORE,这个暂时不用了解
Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量
关于这里涉及到线程池技术
13.zuul高可用
类似Nginx,这儿同样要是要做HA处理的
在HA这一点上,zuul跟Nginx不一样,Nginx是要专门搞一台“盯梢”的服务器,而且zuul则是把自己注册到
EurekaServer上,如果想让客户端,也就是h5/app也能用负载均衡访问到zuul集群,那就没办法了,因为其没有负载均衡策略,这个时候还是需要通过Nginx来做负载均衡
14.非JVM的暂时不管,都是jvm的-。-
如果用了Nginx,那就根本不需要zuul了
15.聚合微服务
这一块之前就想过怎么实现,按照这样的逻辑,还是client只需要调用一次
然后全部交给Nginx/zuul做聚合服务;而且,如果云服务器,或者自己搭建机房,这些微服务都在一个局域网内,所以访问起来很快这里涉及到RxJava,我们后续单独处理