美文网首页
spring-cloud-gateway动态路由

spring-cloud-gateway动态路由

作者: xianxiong | 来源:发表于2019-04-01 14:01 被阅读0次
动态路由.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

相关文章

网友评论

      本文标题:spring-cloud-gateway动态路由

      本文链接:https://www.haomeiwen.com/subject/cxgmbqtx.html