SpringCloud Gateway 基于注册中心Nacos的动态路由案例及加载执行流程源码解析

Spring Cloud Gateway 基于 Nacos 的动态路由功能允许网关根据 Nacos 注册中心中的服务信息动态地进行路由配置,从而实现服务之间的动态调用和负载均衡。下面是一个简单的示例,演示了如何在 Spring Cloud Gateway 中使用 Nacos 作为注册中心,并实现动态路由的功能。

示例代码

  1. 首先,确保你的项目中已经添加了 Spring Cloud Gateway 和 Nacos 的依赖,并正确配置了 Nacos 注册中心的连接信息。

  2. 创建一个配置类,配置 Nacos 的动态路由功能。

import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.util.pattern.PathPatternParser;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteDefinitionLocator nacosRouteDefinitionLocator(DiscoveryClient discoveryClient, RouteDefinitionRepository routeDefinitionRepository) {
        return new NacosRouteDefinitionLocator(discoveryClient, routeDefinitionRepository);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("app-route", r -> r.path("/app/**")
                        .uri("lb://APP-SERVICE"))
                .build();
    }
}
  1. 创建一个自定义的 NacosRouteDefinitionLocator 类,用于从 Nacos 中获取路由信息并实现动态路由。
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class NacosRouteDefinitionLocator implements RouteDefinitionLocator {

    private final DiscoveryClient discoveryClient;
    private final RouteDefinitionRepository routeDefinitionRepository;

    public NacosRouteDefinitionLocator(DiscoveryClient discoveryClient, RouteDefinitionRepository routeDefinitionRepository) {
        this.discoveryClient = discoveryClient;
        this.routeDefinitionRepository = routeDefinitionRepository;
    }

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        return Flux.fromIterable(discoveryClient.getServices())
                .flatMap(serviceId -> Flux.fromIterable(discoveryClient.getInstances(serviceId))
                        .map(instance -> {
                            RouteDefinition routeDefinition = new RouteDefinition();
                            routeDefinition.setId(serviceId + "-" + instance.getInstanceId());
                            routeDefinition.setUri("lb://" + serviceId);
                            routeDefinition.setPredicates(Arrays.asList(new PredicateDefinition("Path=/"+serviceId.toLowerCase()+"/**")));
                            return routeDefinition;
                        }));
    }
}
  1. 在 application.yml 文件中配置 Nacos 的连接信息和网关的配置信息。
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: app-service
        uri: lb://APP-SERVICE
        predicates:
        - Path=/app/**
server:
  port: 8080

执行流程源码解析

  1. NacosRouteDefinitionLocator 类实现了 RouteDefinitionLocator 接口,其中的 getRouteDefinitions 方法通过调用 discoveryClient.getServices() 获取所有服务的名称,然后通过 discoveryClient.getInstances(serviceId) 获取每个服务实例的信息,并根据这些信息构建路由定义对象 RouteDefinition
  2. GatewayConfig 类中的 nacosRouteDefinitionLocator 方法将 NacosRouteDefinitionLocator 对象注入到 Spring 容器中,用于动态获取路由信息。
  3. GatewayConfig 类中的 customRouteLocator 方法定义了一个自定义的路由规则,将 /app/** 路径的请求转发到名为 APP-SERVICE 的服务。
  4. 最后,在 application.yml 文件中配置了 Nacos 的连接信息和路由规则。

通过以上步骤,Spring Cloud Gateway 就可以根据 Nacos 中注册的服务信息动态地进行路由配置,实现动态路由的功能。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值