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

基于 Dubbo 使用 Nacos 服务注册中心

最近更新时间2023.11.10 17:24:38

首次发布时间2022.05.24 11:24:19

本文主要面向 DubboSpring Boot 的使用者,通过示例来介绍如何使用火山引擎微服务引擎 MSE Nacos 实现服务注册发现。

背景信息

在微服务场景下,部分服务尽可能的拆解到最小的颗粒,确保服务和服务间的深度解耦,方便业务的快速迭代。但是随之而来的服务管理和控制变得异常的复杂和繁琐,维护成本大幅提升。服务注册和服务发现的诞生就可以有效的解决这些问题,提供开发和运维的效率。

  • 服务注册:将服务模块的信息注册到一个公告的组件上,例如注册中心。
  • 服务发现:新注册的服务模块能够及时被其他的服务调用发现。
  • Apache Dubbo: 一款微服务开发框架,它提供了 RPC 通信与微服务治理两大关键能力。使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。

前提条件

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

    注意

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

  • 已安装 Maven v3.8.0 以上版本,操作说明参见 Downloading Apache Maven
  • 已安装 Docker v20.0.0 以上版本,操作说明参见 Get Docker
  • 已安装 Dubbo v2.7.8 及以上版本。

操作步骤

步骤一:创建 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>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.7.8</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.3.12.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>2.0.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.12.0</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.3.12.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  3. src\main\resources 路径下创建文件 application.properties

    dubbo.application.name=mse-demo-provider
    dubbo.registry.address=nacos://127.0.0.1:8848?username=nacos&password=nacos
    dubbo.scan.basePackages=com.bytedance.mse
    
    参数说明
    dubbo.application.name固定填写 mse-demo-provider
    dubbo.registry.addressnacos://开头, 后面接 Nacos Server 的地址和 Nacos 的账号和密码。
    • Nacos Server 的地址:即 MSE Nacos 实例私网或公网访问地址。地址支持在微服务引擎实例的 基本信息 > 私网地址公网地址 位置查看。
    • Nacos 的账号和密码:固定添加 username=nacos&password=nacos
    dubbo.scan.basePackages含有com.alibaba.dubbo.config.annotation.Servicecom.alibaba.dubbo.config.annotation.Reference注解所在的包,本示例为com.bytedance.mse

    说明

    • MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。
    • Dubbo 2.7.8 及以上版本支持 Nacos 鉴权。
  4. src\main\java 路径下创建名为 com.bytedance.msePackage

  5. com.bytedance.mse中创建类 ProviderApplication,代码如下。

    package com.bytedance.mse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    }
    
  6. com.bytedance.mse 中创建 EchoService 接口。Dubbo 中服务都是以接口的形式提供的。

    package com.bytedance.mse;
    
    public interface EchoService {
        String echo(String str);
    }
    
  7. com.bytedance.mse 中创建 EchoServiceImpl 类,并实现 EchoService 接口。EchoServiceImpl 使用 Dubbo 提供的一个Service注解类。

    package com.bytedance.mse;
    
    import org.apache.dubbo.config.annotation.Service;
    
    @Service
    public class EchoServiceImpl implements EchoService {
        @Override
        public String echo(String str) {
            return "Hello Nacos Discovery " + str;
        }
    }
    
  8. 在项目路径添加 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"]
    
  9. 在 Terminal 执行以下操作。

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

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

步骤二:创建 Consumer

  1. 创建 Maven工程,命名为 mse-demo-consumer

  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>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.7.8</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.3.12.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>2.0.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.12.0</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.3.12.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  3. src\main\resources 路径下创建文件 application.properties

    dubbo.application.name=mse-demo-consumer
    dubbo.registry.address=nacos://127.0.0.1:8848?username=nacos&password=nacos
    
    参数说明
    dubbo.application.name工程的名称,本示例为 mse-demo-dubbo-consumer
    dubbo.registry.addressnacos://开头, 后面接 Nacos Server 的地址和用于鉴权的 Nacos 的账号和密码。
    • Nacos Server 的地址:即 MSE Nacos 实例私网和公网访问地址。地址支持在微服务引擎实例的 基本信息 > 私网地址公网地址 位置查看。
    • Nacos 的账号和密码:固定添加 username=nacos&password=nacos

    说明

    • MSE Nacos 默认开启鉴权,用户必须配置鉴权后才能使用。初始用户名和密码为都为 nacos,与控制台访问用户名相同。后续如需更改,支持通过控制台或 OpenAPI 实现。
    • Dubbo 2.7.8 及以上版本支持 Nacos 鉴权。
  4. src\main\java 路径下创建名为 com.bytedance.msePackage

  5. com.bytedance.mse 中创建类 ConsumerApplication,代码如下。

    package com.bytedance.mse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }
    
  6. com.bytedance.mse中创建 EchoService 接口,Dubbo 中服务都是以接口的形式提供的。

    package com.bytedance.mse;
    
    public interface EchoService {
        String echo(String str);
    }
    
  7. com.bytedance.mse中创建 TestController 类。TestController 使用 Dubbo 提供的Reference 注解类提供服务发现与调用。

    package com.bytedance.mse;
    
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
        @Reference
        private EchoService demoService;
    
        @RequestMapping("/echo/{str}")
        public String echo(@PathVariable String str) {
            return demoService.echo(str);
        }
    }
    
  8. 在项目路径添加 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"]
    
  9. 在 Terminal 执行以下操作

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

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

结果验证

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

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

    • providers: com.bytedance.mse.EchoService::
    • consumers: com.bytedance.mse.EchoService::

    alt

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

    • 服务消费者外部端点地址:可以在容器服务中的工作负载的 访问方式 > 服务 > 外部端点 中查看。示例如下。
      alt
    • 字符串:用于验证返回内容的正确性,可以自行填写。