Gateway
一、简介
网关作为流量的入口,常用功能包括路由转发、权限校验、先流控制等。而 springcloud gateway 作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关。
网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,列入:安全性,监控/指标和弹性等。
gateway官网:https://spring.io/projects/spring-cloud-gateway
gateway2.1.3稳定版官方文档https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.3.RELEASE/single/spring-cloud-gateway.html#_glossary
很多实例
二、三个概念
1、路由
发一个请求给网关,网关把请求路由到指定的服务或地址。
2、断言
断言为真才允许通过路由,条件判断,是Java8里面的断言函数,
3、过滤器
过滤器就是spring框架里面提供的网关过滤器,所有请求的获取与发送都有过滤操作。请求发送的各个阶段都可以存在过滤处理。
请求到达网关,网关先利用断言来判定请求是否符合某个路由规则,如果符合了,就按这个路由规则把请求路由到指定地方,要去这些指定地方,就要经过一系列的filter进行过滤
三、配置GateWay
1、创建一个新服务用作网关服务
所有的外部请求必须经过网关服务转发至其它服务。
创建一个springboot的子服务,搜索gateway,只选择gateway
2、依赖公共工程common工程
common工程中有服务的注册发现依赖nacos-discovery
和配置中心依赖nacos-config
。
3、网关启动类添加服务注册发现注解
网关也需要把自己注册到注册中心去,也需要发现其它服务的位置,这样请求发过来,网关就可以找到其他服务的位置,以便路由过去。
springboot项目自动加载数据库资源,如果没有配置数据库就会报错,所以需要配置不加载数据源相关的配置。
4、子项目配置nacos
5、引入配置中心
四、使用gateway
1、查看官方实例
4是断言配置,5是过滤器配置
2、路由基本格式
spring:
cloud:
gateway:
routes:
#断言精确度较低的路由放在下面,精确度较高的放在上面
#商品服务路由
- id: product_route
uri: lb://gulimall-product #路由地址
predicates:
- 断言参数1=断言规则
- 断言参数2=断言规则
filters: #filters可通过RewritePath参数进行路径重写
- 过滤参数1=过滤规则
- 过滤参数2=过滤规则
#第三方服务路由
- id: third_party_route
uri: lb://gulimall-third-party
predicates:
- 参数1=断言规则
filters:
- 参数1=过滤规则
- 参数2=过滤规则
3、路由实战
server:
port: 88
spring:
application:
name: gulimall-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
# product_route
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
# 路径重写
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
# third_party_route
- id: third_party_route
uri: lb://gulimall-third-party
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
# admin_route(精确度较低,放下面)
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
## 所有来网关的请求都需要带上/api
断言参数 | 作用 |
---|---|
– After | 接受一个参数datetime。此断言匹配发生在当前日期时间之后的请求。 |
– Before | 接受一个参数datetime。此断言匹配发生在当前日期时间之前的请求。 |
– Between | 接受两个参数用逗号隔开。第一个参数为datetime1,第二个参数为datetime2。此断言匹配datetime1之后和datetime2之前发生的请求。datetime2参数必须在datetime1之后。 |
– Cookie | 接受两个参数:Cookie名称和正则表达式。此断言匹配具有给定名称且值与正则表达式匹配的cookie。 |
– Header | 接受两个参数:Header名称和正则表达式。此断言与具有给定的请求头匹配,值与正则表达式匹配。 |
– Host | 接受一个参数:Host的列表。逗号作为分隔符。这个断言与请求的主机名匹配www.baidu.com。 |
– Method | 接受一个参数:要匹配的HTTP请求方法。参数:GET、POST |
– Path | 接收一个参数:请求地址的列表,如- Path=/api/product/** 、- - Path=/foo/{segment},/bar/{segment} |
– Query | 接受两个参数:一个必需的param和一个可选的regexp。如果请求中包含param参数,则请求通过, |
– RemoteAddr | 接收一个参数:请求的远程地址,如- RemoteAddr=192.168.1.1/24 ,如果请求的远程地址是192.168.1.10,则此路由将匹配。 |
过滤器参数 | 作用 |
– AddRequestHeader | 接收两个参数:请求头名,请求头值。添加一个请求头对象。 |
– AddRequestParameter | 接收两个参数:参数名,参数值。添加一个参数对象。 |
还有二十几个,官方文档有。 |