简介
pigx中作者采用了动态获取路由配置信息,即路由信息是通过数据库进行配置而不是之前固定写在yml或properties文件中。
pigx框架中有几个基础微服务分别是:register(一般是nacos的注册中心和配置中心),auth(认证服务)、upms(登录和项目初始化数据加载)、gateway(网关服务)。
详情
DynamicRouteInitRunner类下的initRoute方法是在upms服务启动后对路由信息初始化并将路由信息保存到redis中。可以利用Another Redis Desktop Manager工具连接redis查看具体的路由信息。
会在redis中创建一个gl的文件夹,key为gl:gateway_route_key的键值对结构中,值为各微服务的路由配置信息。
gateway服务需在upms服务启动成功后启动,否则会打印warning日志:redis 中路由定义条数: 0, []。表示gateway无法从redis中获取路由配置信息。
gateway服务中,DynamicRouteAutoConfiguration类下分别创建了两个Bean对象。
- 第一个是类型为PropertiesRouteDefinitionLocator的名为propertiesRouteDefinitionLocator的方法创建的Bean对象。返回的是一个新创建的GatewayProperties对象。该方法表示不加载静态路由配置信息,加载redis中的动态路由(因为新创建的GatewayProperties对象内容为空)。 GatewayProperties对象具体信息可参考GatewayProperties详解
- 第二个是类型为RedisMessageListenerContainer的名为redisContainer方法创建的Bean对象。该方法是用于监听Redis事件。事件主题为CacheConstants类中定义的ROUTE_KEY。监听器的功能是当监听到该主题时打印warning日志:加载路由ID,{},{}。调用removeList方法,发布refreshRoutesEvent事件,该事件是spring cloud gateway的内部事件,用于通知应用重新加载路由信息。
修改
当需要将动态路由修改为静态路由时,需注释以上三个方法。并在gateway服务下的yml文件中添加配置信息如下:
spring:
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true #服务名称转小写
#路由配置信息
routes:
# id唯一,表示请求路由到哪个服务
- id: 微服务名称
#注册中心中的名称,lb表示负载均衡,loadbanlance
uri: lb://微服务名称
#谓词/断言配置
predicates:
#表示路径断言,表示/admin开头的
- Path=/admin/**
#过滤器配置,name唯一,args参数数据结构为键值对。
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@remoteAddrKeyResolver}"
redis-rate-limiter.burstCapacity: "1000"
redis-rate-limiter.replenishRate: "1000"