You need to enable JavaScript to run this app.
导航

基于 Spring Cloud 使用 Nacos 服务注册中心

最近更新时间2023.11.13 15:16:57

首次发布时间2022.05.12 15:09:48

本文主要面向 Spring Cloud 的使用者,通过示例介绍如何使用 MSE Nacos 来实现服务注册发现。

说明

前提条件

  • 已创建微服务引擎实例,操作说明参见 创建实例
  • 已创建容器服务集群,并开启 公网访问,操作说明参见 创建集群

    注意

    通过私网连通时,容器服务集群需要和微服务引擎实例处于同一个 VPC。

  • 已安装 Maven,操作说明参见 Downloading Apache Maven
  • 已安装 Docker,操作说明参见 Get Docker

操作步骤

步骤一:创建 Provider

  1. 创建命名为 mse-demo-provider 的 Maven 工程。

  2. pom.xml 文件中添加依赖:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>mse-demo-provider</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.12.RELEASE</version>
            <relativePath/>
        </parent>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.2.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Hoxton.SR12</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>
    
    </project>
    
  3. src\main\resources 路径下创建文件 application.properties

    spring.application.name=mse-demo-provider
    server.port=8081
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    spring.cloud.nacos.discovery.username=nacos
    spring.cloud.nacos.discovery.password=nacos
    
    参数说明
    spring.application.name应用的名称。
    server.port可选,您需要接入的应用的端口号,默认为 80。
    spring.cloud.nacos.discovery.server-addrNacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。
    spring.cloud.nacos.config.usernameNacos 账号用户名。
    spring.cloud.nacos.config.passwordNacos 账号密码。

    说明

    MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。

  4. src\main\java 路径下创建名为 com.bytedance.msePackage

  5. com.bytedance.mse 中创建 ServiceProvider 的启动类 ProviderApplication,代码如下。ProviderApplication 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。

    package com.bytedance.mse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    }
    
  6. com.bytedance.mse 中创建 Java 类 EchoController,代码如下。

    • 指定 URL mapping 为 /echo/{String}
    • 指定 HTTP 方法为 GET,方法参数从 URL 路径中获得。
    • 配置返回方法。
    package com.bytedance.mse;
    
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class EchoController {
        @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }
    
  7. 在项目路径添加 Dockerfile。

    说明

    路径地址示例 /Users/bytedance/IdeaProjects/mse-demo-provider

    FROM openjdk:11-jdk-slim
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  8. 在 Terminal 执行以下操作。

    mvn package && docker build -t mse-demo/mse-demo-provider .
    
  9. 推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像

  10. 在容器服务创建无状态负载。操作说明参见 创建无状态负载

步骤二:创建 Consumer

  1. 创建命为 mse-demo-consumer 的 Maven 工程。

  2. pom.xml 文件中添加依赖:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>mse-demo-consumer</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.12.RELEASE</version>
            <relativePath/>
        </parent>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Hoxton.SR12</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>
    
    </project>
    
  3. src\main\resources 路径下创建文件 application.properties

    spring.application.name=mse-demo-consumer
    server.port=8082
    spring.cloud.nacos.discovery.server-addr=0.0.0.0:8848
    
    参数说明
    spring.application.name应用的名称。
    server.port可选,您需要接入的应用的端口号,默认为 80。
    spring.cloud.nacos.discovery.server-addrNacos Server 的地址,即 MSE Nacos 实例私网或公网访问地址。端口号固定为 8848
    spring.cloud.nacos.config.usernameNacos 账号用户名。
    spring.cloud.nacos.config.passwordNacos 账号密码。

    说明

    MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。

  4. src\main\java 路径下创建名为 com.bytedance.msePackage

  5. com.bytedance.mse 中创建 ServiceConsumer 的启动类 ConsumerApplication,代码如下。ConsumerApplication 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。为 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalancedRibbon 的集成。

    package com.bytedance.mse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsumerApplication {
    
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }
    
  6. com.bytedance.mse 中创建 Java 类 TestController,代码如下。

    • 指定 URL mapping 为 /echo/{String}
    • 指定 HTTP 方法为 GET,方法参数从 URL 路径中获得。
    • restTemplate中配置 ServiceProvider 名称。
    package com.bytedance.mse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class TestController {
    
        private final RestTemplate restTemplate;
    
        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
    
        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://mse-demo-provider/echo/" + str, String.class);
        }
    }
    
  7. 在项目路径添加 Dockerfile。

    说明

    路径地址示例 /Users/bytedance/IdeaProjects/mse-demo-consumer

    FROM openjdk:11-jdk-slim
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  8. 在 Terminal 执行以下操作

    mvn pacakage && docker build -t mse-demo/mse-demo-consumer .
    
  9. 推送 Docker 镜像至镜像仓库,操作说明参见 推送和拉取镜像

  10. 在容器服务创建无状态负载。操作说明参见 创建无状态负载

结果验证

  1. 登录 Nacos 实例控制台,操作说明参见 登录 Nacos 控制台

  2. 在左侧菜单栏,单击 服务管理 > 服务列表。即可查看已被发现的 Service Provider 和 Consumer。

  3. 访问 http://{{Consumer 外部端点地址}}/echo/{{字符串}},返回内容是 Hello Nacos Discovery {{字符串}}