微服务(三)服务网关——Zuul(Zuul 代理其他服务、简单的权限校验、其他配置和访问路径的顺序问题)、Gateway(Gateway 中的各种配置、Filter(转发路由时,自动的额外添加参数))
微服务(三)服务网关——Zuul(Zuul 代理其他服务、简单的权限校验、其他配置和访问路径的顺序问题)、Gateway(Gateway 中的各种配置、Filter(转发路由时,自动的额外添加参数))
微服务(三)服务网关——Zuul(Zuul 代理其他服务、简单的权限校验、其他配置和访问路径的顺序问题)、Gateway(Gateway 中的各种配置、Filter(转发路由时,自动的额外添加参数))
一、Zuul——服务网关
在微服务里面,服务网关相当于是必备的组件。
Zuul 是 Netflix 公司提供的网关服务。因为从某个时间开始闭源了,所以用的人越来越少,加上性能不如 gateway。
说到网关,面试最经常问的就是 Zuul 和 Gateway 的区别:Zuul 相当于同步会阻塞的 servlet,请求到网关以后,Zuul 会自己维护一个线程池,从线程池拿出一个线程来处理这个请求,接着这个请求会发到某一个服务中去,接着这个服务各种处理最后响应到 Zuul,Zuul 再把数据返回给浏览器。从头到尾用的都是一个子线程,子线程处理完以后最后会被释放。这个是 Zuul 的特点,处理并发能力很弱;如果线程池只有 100 个线程,那么就只能处理 100 个请求。
gateway 就不一样,类似于异步 servlet,虽然请求到了 gateway 以后,也是会从线程池分配一个线程处理请求,但不是直接用线程处理,而是先用线程收到请求,接着这个线程立马 new 一个子线程,由这个子线程去做后面的事情。接着原本的那个线程立马会被释放,就不需要去等。
1、引言和介绍
Zuul 的功能:
- 权限控制,可以做认证和授权
- 监控
- 动态路由
- 负载均衡
- 静态资源处理
Zuul 中的功能基本上都是基于过滤器来实现,它的过滤器有几种不同的类型:
- PRE
- ROUTING
- POST
- ERROR
在微服务里面,可以同时使用 nginx 和 服务网关,这两者不冲突。对编程来说 nginx 不太方便,只能配置不能加功能,所以一般不会用。使用这个 SpringCloud 的网关的话,加功能就比较容易。
2、前期准备
到这基本配置就好了。
3、开始使用 Zuul 代理其他服务
只要一启动,这个 Zuul 会自动的注册到 eureka 中,然后会自动的查找有哪些服务注册到 eureka 中;默认情况下会自动的给 eureka 中所有的服务自动的代理。
以后想要访问 eureka 中的服务时,不需要直接去输入服务的地址了,只需要按照既定的规则,去访问这个 Zuul 就可以了,Zuul 会自动的把请求转发到对应的服务中去。
这里测试一下以前已经有的接口(原本是 storage 的):
这里经过网关访问:
4、通过 Zuul 做简单的权限校验
创建一个类,继承 ZuulFilter 类:
效果:
当地址栏不带 token=123 时,会被拦截:
带了 123 时:
5、Zuul 的其他配置和访问路径的顺序问题
针对最后的访问路径的问题,如果要实现有序的,就通过 yaml 来实现,比如这样:
二、Gateway——服务网关
1、引言和介绍
特点:
- 限流
- 路径重写
- 动态路由
- 集成 Spring Cloud DiscoveryClient
- 集成 Hystrix 断路器
和 Zuul 对比:
- Zuul 是 Netflix 公司的开源产品,Spring Cloud Gateway 是 Spring 家族中的产品,可以和Spring 家族中的其他组件更好的融合。
- Zuul1 不支持长连接,例如 websocket。
- Spring Cloud Gateway 支持限流。
- Spring Cloud Gateway 基于 Netty 来开发,实现了异步和非阻塞,占用资源更小,性能强于Zuul。
注意:Gateway 明显优于 Zuul 的一个特性是并发能力特别特别强! Zuul 是同步的,Gateway 是异步的并发强,响应式的。
Gateway 有两种使用方式:
一:通过代码来配置。
二:通过 yaml 来配置
2、前期准备
3、配置 Gateway
a、properties 配置
参考下方配置(这个配置的麻烦,所以据说一般不用):
b、yaml 配置
c、java 代码配置
首先,因为 Gateway 跟 SpringMVC 是对立的,MVC 是阻塞的 web 框架,而 Spring Reactive Web 是响应式,异步处理的框架。所以这两个只能用一个,所以这里要去掉 mvc 的依赖:
然后:
最后,通过 yaml 来配置:
这里的意思是访问某一个接口,然后把这个接口转发到 uri 里面的网页中来:
访问的路径:
效果:
d、通过时间匹配
表示,请求时间在 2021-01-01T01:01:01+08:00[Asia/Shanghai] 时间之后,才会被路由。
除了 After 之外,还有两个关键字:
- Before,表示在某个时间点之前进行请求转发
- Between,表示在两个时间点之间,两个时间点用 , 隔开
e、通过请求方式匹配
也可以通过请求方式匹配,就是请求方法:
f、通过请求路径匹配
表示路径满足 /2019/0612/ 这个规则,都会被进行转发,例如:
g、通过参数进行匹配
表示请求中一定要有 name 参数才会进行转发,否则不会进行转发。
也可以指定参数和参数的值。
例如参数的 key 为 name,value 必须要以 java 开始:
h、多种匹配方式
多种匹配方式也可以组合使用。
4、Filter(转发路由时,自动的额外添加参数)
更多推荐
所有评论(0)