加入以下坐标
<!-- Gateway 网关坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 限流器,引用响应式 redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- springboot actuator 项目监控插件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- fastJSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
application.yml 暴露所有 web 方式请求端点
# 暴露所有 web 方式请求端点
management:
endpoints:
web:
exposure:
include: '*'
将原来基于内存的路由持久化到 redis
/**
* 自定义路由持久化
*/
@Component
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository {
private final static String GATETORY_ROUTER_KEY = "gateway_dynamic_route";
@Autowired
private RedisTemplate redisTemplate;
// 获取路由信息
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
List<RouteDefinition> routeDefinitions = new ArrayList<RouteDefinition>();
// 从 redis 中获取路由信息
redisTemplate.opsForHash().values(GATETORY_ROUTER_KEY).stream().forEach(route -> {
routeDefinitions.add(JSON.parseObject(route.toString(),RouteDefinition.class));
});
return Flux.fromIterable(routeDefinitions);
}
// 保存路由信息
@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.flatMap(routeDefinition -> {
// 将路由转为 json 字符串存储到 redis
redisTemplate.opsForHash().put(GATETORY_ROUTER_KEY,routeDefinition.getId(),JSON.toJSONString(routeDefinition));
return Mono.empty();
});
}
// 删除路由信息
@Override
public Mono<Void> delete(Mono<String> routeId) {
return routeId.flatMap(id -> {
// 如果包含路由 id
if(redisTemplate.opsForHash().hasKey(GATETORY_ROUTER_KEY,id)){
redisTemplate.opsForHash().delete(GATETORY_ROUTER_KEY,id);
return Mono.empty();
}
// 没有找到要删除的路由 id 抛出异常
return Mono.defer(()->Mono.error(new Exception("routeDefinition not found:"+id)));
});
}
}
添加路由

image.png
通过 actuator 暴露端端点可以查看添加成功

image.png
删除路由

image.png
通过 actuator 暴露端端点可以查看删除成功
网友评论