Gateway+Nacos 实现动态路由

5,160 阅读2分钟

Gateway+Nacos 实现动态路由

Nacos的使用可以去nacos官网文档看下,这里主要介绍整合实现动态路由功能

一、Nacos环境准备

1)新增命名空间

命名空间ID默认生成或者自己填上都可以,这里直接默认生成了;

然后选择配置管理--配置列表--选中刚刚创建的命名空间--新增配置

然后点击右下角的发布

项目目录信息

producer/consumer的依赖信息

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

server模块的依赖信息

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

父模块的依赖

<dependencies>


    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>

</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>

</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

这里需要注意gateway的依赖需要放到server中。gateway的starter中已经引入了spring-boot-starter-webflux依赖,这个依赖与spring-boot-starter-web冲突

consumer和producer代码是差不多的,就只贴producer的代码
@RestController
@RequestMapping("/provide/")
@Slf4j
public class ProviderController {

    @GetMapping("/sayHello/{name}")
    public String sayHello(@PathVariable("name") String name){
        log.info("I'm calling nacos-provider service by dynamic gateway...");
        return name + " Hi~, I'm from nacos-provider";
    }
}
spring:
  application:
    name: producer
  cloud:
    nacos:
      username: nacos
      password: nacos
      discovery:
        enabled: true
        register-enabled: true
        server-addr: localhost:8848
        namespace: e863c93d-c8f5-47a9-bb7d-2e1eab762847
        group: DEFAULT_GROUP
server 模块,只需要在bootstrap.yml中加入配置信息就可以了
server:
  port: 7000
spring:
  application:
    name: server
  cloud:
    gateway:
      discovery:
        locator:
          # 是否与服务发现组件进行结合,通过   serviceId 转发到具体的微服务
          enabled: true                       #是否开启基于服务发现得路由规则
    nacos:
      username: nacos
      password: nacos
      discovery:
        enabled: true
        register-enabled: true
        server-addr: localhost:8848
        namespace: e863c93d-c8f5-47a9-bb7d-2e1eab762847  # 命名空间
        group: DEFAULT_GROUP   # 读取配置的分组名称
      config: 
        namespace: e863c93d-c8f5-47a9-bb7d-2e1eab762847
        group: DEFAULT_GROUP
        name: gateway.yaml   # 配置的dataId
        prefix: gateway       # 配置的前缀
        file-extension: yaml  # 配置文件类型
        refresh-enabled: true  # 是否开启自动刷新

在启动类上加上@EnableDiscoveryClient 注解,将微服务注册到服务发现组件上

然后分别启动

在浏览器中访问 http://localhost:7000/provide/sayHello/sss

然后在nacos中将配置信息修改为

spring:
 cloud:
   gateway:
     routes:
       - id: producer
         uri: lb://producer
         predicates:
           - Path=/provide/**
       - id: consumer
         uri: lb://consumer
         predicates:
           - Path=/consume/**

添加完过后直接访问 http://localhost:7000/consume/sayHello/sss