【Spring Cloud Alibaba】Gateway(一)
- [1. 前言](#1. 前言)
- [2. Gateway初体验](#2. Gateway初体验)
- [3. Gateway整合nacos](#3. Gateway整合nacos)
- [4. Gateway内置路由断言工厂](#4. Gateway内置路由断言工厂)
1. 前言

我们微服务的架构,就是将一个大的业务/服务,拆分成多个小的业务与服务。但这样的架构,会存在着诸多的问题:
- 每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为战,自己造轮子实现一遍,会很蛋疼,完全可以抽出来,放到一个统一的地方去做。
- 如果业务量比较简单的话,这种方式前期不会有什么问题,但随着业务越来越复杂,比如淘宝、亚马逊打开一个页面可能会涉及到数百个微服务协同工作,如果每一个微服务都分配一个域名的话,一方面客户端代码会很难维护,涉及到数百个域名,另一方面是连接数的瓶颈,想象一下你打开一个APP,通过抓包发现涉及到了数百个远程调用,这在移动端下会显得非常低效。
- 后期如果需要对微服务进行重构的话,也会变的非常麻烦,需要客户端配合你一起进行改造,比如商品服务,随着业务变的越来越复杂,后期需要进行拆分成多个微服务,这个时候对外提供的服务也需要拆分成多个,同时需要客户端配合改造。
上面的这些问题可以借助API网关 来解决。

所谓的APl网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
添加上APl网关之后,系统的架构图变成了如下所示:

2. Gateway初体验
配置文件

3. Gateway整合nacos
在上面时写死的转发路径的地址,写死之后会带来很多问题,正确的应该是从注册中心来进行获取。
- 引入依赖

- 编写yml配置文件


4. Gateway内置路由断言工厂
官方文档
https://cloud.spring.io/spring-cloud-gateway/reference/html/
https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter
SpringCloud Gateway的全局异常处理 https://zhuanlan.zhihu.com/p/347028665
- 基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:- AfterRoutePredicateFactory:接收一个日期参数,判断请求日期是否晚于指定日期
- BeforeRoutePredicateFactory:接收一个日期参数,判断请求日期是否早于指定日期
- BetweenRoutePredicateFactory:接收两个日期参数,判断请求日期是否在指定时间段内
java
- After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]
- 基于远程地址的断言工厂
- RemoteAddrRoute PredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
java
- RemoteAddr=192.168.1.1/24
- 基于Cookie的断言工厂
- CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。判断请求 cookie是否具有给定名称且值与正则表达式匹配。
java
-Cookie=chocolate, ch.
- 基于Header的断言工厂
- HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹
java
-Header=X-Request-Id, \d+
- 基于Host的断言工厂
- HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配。
java
-Host=**.testhost.org
- 基于Method请求方法的断言工厂
MethodRoutePredicateFactory:接收一个参数,判断请求型是否跟指定的类型匹配。