【Spring Cloud Alibaba】Gateway(一)

【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

在上面时写死的转发路径的地址,写死之后会带来很多问题,正确的应该是从注册中心来进行获取。

  1. 引入依赖
  2. 编写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:接收一个参数,判断请求型是否跟指定的类型匹配。
相关推荐
承渊政道17 小时前
Oracle迁移避坑:一个(+)写错,LEFT JOIN可能变INNER JOIN
运维·服务器·数据库·数据仓库·学习·安全·oracle
2301_8125396717 小时前
CSS如何制作下拉菜单弹性展开_利用transform-origin
jvm·数据库·python
2401_8330336217 小时前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
阿坤带你走近大数据17 小时前
OracleSQL优化案例-3
数据库·oracle·sql优化
iuvtsrt17 小时前
SQL如何优化子查询的性能_改写为JOIN关联查询与消除嵌套
jvm·数据库·python
2403_8832610918 小时前
C#怎么使用并发集合 C#ConcurrentDictionary和ConcurrentQueue线程安全集合怎么用【进阶】
jvm·数据库·python
m0_4708576418 小时前
如何加固SQL系统架构_采用读写分离降低攻击影响
jvm·数据库·python
2401_8844541518 小时前
Golang如何写博客系统后端_Golang博客系统教程【技巧】
jvm·数据库·python
2301_7796224118 小时前
JavaScript中利用Range对象实现复杂的文本选择操作
jvm·数据库·python
m0_7414817818 小时前
Go语言怎么做接口签名_Go语言API签名验证教程【精通】
jvm·数据库·python