spring-cloud-gateway动态路由

动态路由.png

spring cloud gateway 动态路由实现:

  1. gateway-server(网关服务)
  2. dynamic-gateway(网关配置服务)
  3. redis
  4. mysql
  5. rabbitmq

配置服务:(这里的四个接口仅操作数据库)


image.png

配置服务修改数据后,调用“应用”接口,发送消息到队列,gateway-server消费消息,实现更新路由


image.png

配置服务实现启动时,加载数据库所有路由数据到redis,发送消息到队列,gateway-server实现消费


image.png
@Component
public class Receiver implements RouteDefinitionRepository {

    private static final Logger log = LoggerFactory.getLogger(Receiver.class);

    @Autowired
    private RedisTemplate redisTemplate;

    private String ROUTE_KEY = "gateway_route_key";


    /**
     * 此监听方法为路由修改使用(即增加,修改,删除路由后,点击“应用” 使用)
     * @param str1
     * @throws ClassNotFoundException
     */
    @RabbitListener(queues = "topic.update")
    public void update(String str1) throws ClassNotFoundException {
        System.out.println(Thread.currentThread().getName()+"接收到来自topic.update队列的消息: "+str1);
        Receiver.this.getRouteDefinitions();
        log.info("更新路由成功!");
    }

    /**
     * 配置服务启动时,发送消息到此队列
     * @param str1
     * @throws ClassNotFoundException
     */
    @RabbitListener(queues = "topic.send")
    public void send(String str1) throws ClassNotFoundException {
        System.out.println(Thread.currentThread().getName()+"接收到来自topic.send队列的消息: "+str1);
        Receiver.this.getRouteDefinitions();
        log.info("初始化路由成功!");
    }



    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinition.class));
        List<RouteDefinition> values = redisTemplate.opsForHash().values(ROUTE_KEY);
        List<RouteDefinition> definitionList = new ArrayList<>();
        values.forEach(vo ->{
            RouteDefinition route = new RouteDefinition();
            BeanUtils.copyProperties(vo,route);
            definitionList.add(vo);
        });
        log.info("redis 中路由定义条数为:{},{}",definitionList.size(),definitionList);
        return Flux.fromIterable(definitionList);
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return route.flatMap(r -> {
            RouteDefinition routeDefinition = new RouteDefinition();
            BeanUtils.copyProperties(r,routeDefinition);
            log.info("保存路由信息{}",routeDefinition);
            redisTemplate.opsForHash().put(ROUTE_KEY,routeDefinition.getId(),routeDefinition);
            return Mono.empty();
        });
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        routeId.subscribe(id -> {
            log.info("删除路由的id为:{}",id);
            redisTemplate.opsForHash().delete(ROUTE_KEY,id);
        });
        return Mono.empty();
    }


}

源码+数据库:
qq:1782800572

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容