springgateway路由配置(gateway网关配合nacos做动态路由)
本文目录
- gateway网关配合nacos做动态路由
- Spring cloud Gateway HTTS配置
- Gateway动态路由实现
- gateway网关路由匹配规则
- springcloud gateway 实现服务转发 2
- 实现Spring Cloud Gateway路由动态加载及持久化
- SpringCloud Gateway配置
- Spring Gateway 集成Nacos 实现动态路由配置
gateway网关配合nacos做动态路由
通过gateway配合nacos做动态路由一共两种方式,第一种时通过json,解析json进行动态路由,另一种通过设置properties文件进行路由
gateway的动态路由可以配置在nacos的配置中心上,gateway启动的时候来读取配置,对各个请求进行路由
配置文件如下所示
server:
port:9537
spring:
application:
name: cloud-alibaba-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: json
group: DEFAULT_GROUP#nacos分组
gateway:#路由
discovery:
locator:
enabled:true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
management:
endpoints:
web:
exposure:
include: cloud-alibaba-gateway
package *****;
import *****;
import *****;
import ********t;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import *****;
import ********truct;
import *****;
import *****;
import *****;
import *****;
/**
* 配置动态路由
*/
@Configuration
public class NacosDynamicRouteServiceimplements ApplicationEventPublisherAware {
private StringdataId ="cloud-alibaba-gateway";
private Stringgroup ="DEFAULT_GROUP";
@Value("${*****.server-addr}")
private StringserverAddr;
@Autowired
private RouteDefinitionWriterrouteDefinitionWriter;
private ApplicationEventPublisherapplicationEventPublisher;
private static final ListROUTE_LIST =new ArrayList《》();
@PostC***truct
public void dynamicRouteByNacosListener() {
try {
Properties properties =new Properties();
*****(PropertyKeyC********_ADDR, serverAddr);
ConfigService configService = *****(properties);
String config = *****(dataId, group, 5000);
*****(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
clearRoute();
try {
List gatewayRouteDefiniti*** = *****(configInfo, *****);
for (RouteDefinition routeDefinition : gatewayRouteDefiniti***) {
addRoute(routeDefinition);
}
publish();
}catch (Exception e) {
*****();
}
}
@Override
public ExecutorgetExecutor() {
return null;
}
});
}catch (NacosException e) {
*****();
}
}
private void clearRoute() {
for(String id :ROUTE_LIST) {
*****(*****(id)).subscribe();
}
ROUTE_*****();
}
private void addRoute(RouteDefinition definition) {
try {
*****(*****(definition)).subscribe();
ROUTE_*****(*****());
}catch (Exception e) {
*****();
}
}
private void publish() {
*****(new RefreshRoutesEvent(*****));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
***** = applicationEventPublisher;
}
}
这一步一定要在nacos添加配置之前,因为配置类添加的**如果nacos上的配置没有进行添加或者修改,网关是读不到配置的,因为他**的是改变。
里面的name参数,gateway已经规定好了,不允许随意修改,值如下图所示。
本方式不需要建配置类,原理就是通过配置中心直接把动态路由的配置读到配置文件中,首先新建properties文件,
*****=9547
*****=cloud-alibaba-gatewayaa
*****.server-addr=localhost:8848
*****.server-addr=localhost:8848
*****.file-extension=properties
*****=DEFAULT_GROUP
*****=true
进入nacos,新建配置
yml配置如下所示
Spring cloud Gateway HTTS配置
在Web服务应用中,为了数据的传输安全,使用安全证书,使用TLS/SSL加密。这里就介绍一下Spring Cloud Gateway的HTTPS配置。
*****中配置SSL如下所示:
***隐藏网址***
这种配置方式不适合用于生产环境,在生产环境中,可以在网关这里配置一些信任的证书,如下面配置所示:
如果没有给网关配置可以信任的证书,那么这些默认的证书将被使用,不过,这些配置可以被系统属性设置(*****)覆盖。
在Spring Cloud Gateway服务中,有一个客户端的连接池,用于向后台的服务路由请求。当使用Https通信时,客户端会初始化一次TLS握手,这次握手可以配置一个超时时间,如下所示:
Gateway动态路由实现
无论是哪一种,在启动网关后将无法修改路由配置,如有新服务要上线,则需要先把网关下线,修改 yml 配置后,再重启网关。
Gateway网关启动时,路由信息默认会加载内存中,路由信息被封装到 RouteDefinition 对象中,配置多个RouteDefinition组成Gateway的路由系统。
*RouteDefinitionLocator是个接口,在*****包下,如果想查看网关中所有的路由信息,可以调用此方法;后面还有另外一种查看方式,是Spring Cloud Gateway 的Endpoint端点提供的方法
Endpoint 端点有暴露路由信息、获取所有路由、刷新路由、查看单个路由、删除路由等方法,源码在 ***** 中,访问端点中的方法需要修改pom和配置文件:
*添加pom文件依赖:
*yml配置
准备:
* Spring Cloud:*****
* Spring Boot: *****
* 注册中心(C***ul)
* 网关Gateway
* 业务服务(ijep-service-sys)
*过滤器模型
*路由断言模型
*路由模型
***隐藏网址***
项目地址: 无权访问
gateway网关路由匹配规则
路由(Route): 路由是网关最基础的部分,路由信息由ID、目标URI、一组断言和一组过滤器组成,如果断言路由为真,则说明请求的URI和配置匹配。
断言(Predicate): java8中的断言函数。SpringCloud Gateway中的断言函数输入类型是*****框架中的***** Gateway中的断言函数允许开发者去定义匹配来自于Http Request中的任何信息,比如请求头和参数等。
过滤器(Filter): 一个标准的Spring Web Filter。 Spring Cloud GateWay 中的Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器将会对请求和响应进行处理。
1. path路由匹配规则
2. query路由匹配规则
4. Datetime路由匹配规则
5. RemoteAddr路由匹配规则
6. Header路由匹配规则
springcloud gateway 实现服务转发 2
gateway转发配置常见的有两种方式,一种是 yml配置的方式:
参考:springcloud gateway 服务转发
本文介绍另一种方式,即 配置类的方式实现,本质没啥区别,写法不同而已。
只需要在项目包扫描路径下建一个配置类即可,如下:
上面的例子分别定义了,路由的id,匹配转发的路径和对应的服务。
当请求到达网关以后,遇到test-app1/**的路径时,请求会转发到test-app1的服务。
需要注意的是,由于gateway是基于webflux的,不同于springMVC,所以pom文件需要将
web的包排除掉,否则会无法启动应用。
实现Spring Cloud Gateway路由动态加载及持久化
Spring Cloud Gateway提供了添加、删除和查询路由的 API ,通过API添加的路由默认存储在内存之中。应用重启时,通过API添加的路由会丢失,进而导致应用的功能受损。如果应用有多个实例,Spring Cloud Gateway也没有提供路由同步机制,多个实例之间的路由信息不一致,影响正常的业务。由于Spring Cloud Gateway默认实现在可靠性和一致性方面存在不足,进而无法直接部署在生产环境,为此需要自定义实现路由的存储和同步机制。
在Spring Cloud Gateway中一个RouteDefinition对象定义一个路由。Spring Cloud Gateway启动时首先加载所有的RouteDefinition,然后生成路由并讲路由加载到内中(有缓存机制,主要目的是提供路由匹配的效率)。Spring Cloud Gateway可以从四个数据源加载RouteDefinition:配置文件,Fluent Route API,RouteDefinitionRepository和DiscoveryClient(Spring Cloud定义的服务发现接口)。从路由的加载机制可以看出,能够实现动态添加、删除、修改路由的方式就是自定义实现RouteDefinitionRepository,从而可以保证在Spring Cloud Gateway启动时加载之前已经添加过的路由。
Spring Cloud Gateway定义了一个RouteRefreshListener用来**路由变化事件RefreshRoutesEvent,因此在添加、删除、更新路由后只需要发布一个RefreshRoutesEvent事件以让所有存储路由的组件更新路由即可。
实现步骤:
基于mysql的实现源码参考 Spring Cloud Gateway Example
SpringCloud Gateway配置
客户端发送请求到gateway,由gateway handler mapping进行路由,发送到gateway web handler。这个handler处理请求相关的filter链。filter分“pre”和“post”两种处理逻辑。
配置predicates和filters有两种方式:简写和全参数展开。
公式:name=name,regexp,例如
如果yaml文件标准一样进行配置,通常会有name和args两个键,args是一个map的键值对组配置predicate或者filter。如下:
每种路由的判断依据都是根据Http请求的不同属性。
**
value为正则表达式
value为正则表达式
每个Host为Ant-style格式,以.号分割。
参数包括一个Spring PathMatcherpatterns和一个可选的matchOptionalTrailingSeparator分隔符
上面的规则可以匹配诸如/red/1/red/blue/blue/green等路径。
抽取URI中的模板变量(如segment),作为键值对存储在*****(),key为*****_TEMPLATE_VARIABLES_ATTRIBUTE。这些值可以被GatewayFilter factories获取到。有个工具方法可以更简单地获取到这些值。如下
value为正则表达式
格式为CIDR-notation,例如*****/16,*****是ip,16是子网掩码。
配置两个参数:group和weight(数值)。
上面的配置会让 80%的请求发送到*****, 20%的请求发送到*****。
增加请求头参数,可以使用URI变量
增加查询参数,可以使用URI变量
增加响应头中参数,可以使用URI变量
去掉重复的响应头参数
上面会去掉重复的Access-Control-Allow-Credentials,Access-Control-Allow-Origin参数值。
可以设置strategy值修改默认删除策略,默认为RETAIN_FIRST,即保留第一个。其他有RETAIN_LAST,RETAIN_UNIQUE。
轻量的断路由
可以替换头部的参数的名称,如将Blue:abc替换为X-Request-Red:abc
增加前缀,例如/hello将被发送到/mypath/hello
The RequestRateLimiter GatewayFilter Factory
通过实现RateLimiter接口配置限流规则,可通过keyResolver参数设置具体的限流的key。现在默认的是PrincipalNameKeyResolver,调用的是 ServerWebExchange 中的 *****()。
如果key解析后为空,请求会被拒绝,可以通过配置下面参数进行自定义策略
*****.request-rate-limiter.deny-empty-key ( true or false ) *****.request-rate-limiter.empty-key-status-code
redis限流,使用的是令牌桶算法。
***** 每秒多少个请求,也是令牌入桶的频率。
***** 峰值请求。
***** 每个请求消耗的令牌数,默认1.
如果想保持稳定的请求频率,可以设置 replenishRate 和 burstCapacity 为相同值,如果有突发的大量请求,则需要设置 burstCapacity 比 replenishRate 大。
如果想设置每分钟1个请求,可以通过以下配置实现
replenishRate=1
requestedTokens=60
burstCapacity=60
也可以实现自己的 RateLimiter 和 KeyResolver
配置参数 status and url
删除指定的请求头参数
删除指定响应头参数
删除请求参数
重写路径
上面配置会把/red/blue变为/blue
/red/blue会变为/blue
替换请求头参数值
替换响应头参数值
设置状态码
上面两种配置都会设置为401
删除前缀
上面的配置将使/name/blue/red变为nameservice/red。
参考
***隐藏网址***
Spring Gateway 集成Nacos 实现动态路由配置
通过Spring Gateway 集成Nacos实现配置管理,并且实现动态路由管理。
一、创建test-gateway项目,POM文件如下:
二、创建项目配置文件*****
a、test_gateway_comm***.yml内容如下:
三、创建网关配置类 *****
四、创建动态路由服务*****
五、创建通过Nacos读取动态路由配置服务*****
六、配置动态路由配置文件gateway_dynamic_router,内容如下:
通过以上步骤就完成Spring Gateway 集成Nacos 实现动态路由配置功能。以后只要通过修改Nacos的配置文件就可以时间服务的动态上下线了。不需要再重启网关了。
更多文章:
subspace(求助线性代数与几何 关于subspace的题)
2026年4月29日 16:20
菜鸟教程在线编辑器php(如何将以下PHP代码中的合同编码格式改为“自定义段+年份+月份+流水号”的格式,菜鸟在线求解)
2026年4月29日 15:40
setselected(android setselected用法以及)
2026年4月29日 15:20
springgateway路由配置(gateway网关配合nacos做动态路由)
2026年4月29日 14:40
虚拟机vim命令(虚拟机centos64位 在Vim中手动配置了ip成功保存后,不能显示)
2026年4月29日 14:00
php socket框架(请教php大神,php如何实现点击页面上的一个按钮发送socket的tcp数据)
2026年4月29日 13:40
java设计简单的swing(java swing表格实例制作,简单两行两列,在线等)
2026年4月29日 13:20




