# 部署 Dubbo 服务

Apache Dubbo (opens new window) 是一款高性能、轻量级的开源 Java RPC 框架,提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

# 部署示例

在下面的例子中,我们将部署一套基于 Dubbo 的微服务,包含以下组件:

  • 服务提供方(hello-world-provider),使用 CloudBase 云托管部署;
  • 服务消费方(hello-world-provider),使用 CloudBase 云托管部署;
  • 注册中心(nacos),使用腾讯云 CVM 部署。

# 部署流程

注意

以下所有涉及的 CVM 实例、云托管实例,都处于同一个 VPC 内。您可以在云托管详情内看到您的应用所属的 VPC。

# 第 1 步:部署注册中心

在您的 CVM 实例内安装并启动 Nacos,具体可以参考 Nacos 文档 (opens new window)

# 第 2 步:创建服务提供方

创建 Maven 项目,在 pom.xml 文件中添加依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.5.12.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-registry-nacos</artifactId>
    <version>2.7.3</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.3</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.3</version>
  </dependency>
</dependencies>

src/main/java 路径下新建 com.cloudrun.dubbo.inface,然后创建一个接口 IHelloService

package com.cloudrun.dubbo.inface;

public interface IHelloService {
  String sayHello(String str);
}

src/main/java 路径下新建 com.cloudrun.dubbo.provider,创建一个类 IHelloServiceImpl,实现此接口:

package com.cloudrun.dubbo.provider;

import com.cloudrun.dubbo.inface.IHelloService;

public class HelloServiceImpl implements IHelloService {

  @Override
  public String sayHello(String str) {
    return "hello " + str;
  }
}

src/main/resources 路径下创建 provider.xml 文件,配置 Dubbo 服务:

<beans
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  xmlns="http://www.springframework.org/schema/beans"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"
>

  <dubbo:application name="hello-world-provider" />

  <!-- port 为您的服务端口 -->
  <dubbo:protocol name="dubbo" port="{port}" />

  <dubbo:service interface="com.cloudrun.dubbo.inface.IHelloService" ref="helloService" />

  <bean id="helloService" class="com.cloudrun.dubbo.provider.IHelloServiceImpl" />

  <!-- nacos-ip 为您的nacos地址 -->
  <dubbo:registry address="nacos://{nacos-ip}:8848" />
</beans>

com.cloudrun.dubbo 新建 dubbo 服务启动类 ProviderApplication

package com.cloudrun.dubbo;

import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ImportResource;

@EnableAutoConfiguration
@EnableDubbo
@ImportResource("classpath:provider.xml")
@DubboComponentScan(basePackages = "com.cloudrun")
public class ProviderApplication {

  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }
}

pom.xml 文件中添加应用编译配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
          <configuration>
            <classifier>boot</classifier>
            <mainClass>com.cloudrun.dubbo.ProviderApplication</mainClass>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

然后运行以下命令,将本地项目构建为可执行的 jar 包:

mvn clean package

# 第 3 步:部署服务提供方

开通 CloudBase 云托管,创建服务 hello-world-provider,然后创建一个版本:

部署成功后,登录 nacos 控制台 http://${nacos-ip}:8848,在左侧导航栏中单击服务列表,查看提供者列表。可以看到服务提供者里已经包含了 com.cloudrun.dubbo.inface.IHelloService,且可以查询该服务的服务分组和提供者 IP:

# 第 4 步:创建服务消费方

创建 Maven 项目,在 pom.xml 文件中添加依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.12.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-registry-nacos</artifactId>
    <version>2.7.3</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.3</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.3</version>
  </dependency>
</dependencies>

src/main/java 路径下新建 com.cloudrun.dubbo.inface,然后创建一个接口 IHelloService

package com.cloudrun.dubbo.inface;

public interface IHelloService {
  String sayHello(String str);
}

src/main/java 路径下创建 com.cloudrun.dubbo.controller,然后创建类 SayHelloController

package com.cloudrun.controller;

import com.cloudrun.dubbo.inface.IHelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SayHelloController {

  @Reference
  private IHelloService helloService;

  @GetMapping("/")
  public String sayHello(String word) {
    return helloService.sayHello(word);
  }
}

com.cloudrun 下创建启动类 ConsumerApplication

package com.cloudrun;

import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@EnableDubbo
@ImportResource("classpath:consumer.xml")
@DubboComponentScan(basePackages = "com.cloudrun")
public class ConsumerApplication {

  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class, args);
  }
}

src/main/resources 路径下创建 consumer.xml 文件,配置 dubbo 服务:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">


  <dubbo:application name="hello-world-consumer"/>

  <!-- port 为您的服务端口 -->
  <dubbo:protocol name="dubbo" port="{port}"/>

  <dubbo:reference id="helloService" interface="com.cloudrun.dubbo.inface.IHelloService"/>

  <!-- nacos-ip 为您的nacos地址 -->
  <dubbo:registry address="nacos://{nacos-ip}:8848" />
</beans>

src/main/resources 路径下创建 application.properties 文件,配置服务端口:

server.port=8081

pom.xml 文件中添加应用编译配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
          <configuration>
            <classifier>boot</classifier>
            <mainClass>com.cloudrun.ConsumerApplication</mainClass>
          </configuration>application.properties
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

并执行 mvn clean package 将本地的程序打成可执行的 jar 包。

# 第 5 步:部署服务消费方

创建一个新的云托管服务 hello-world-consumer,然后创建一个版本:

登录 nacos 控制台 http://${nacos-ip}:8848,在左侧导航栏中单击服务列表,查看提供者列表。可以看到服务提供者里已经包含了 com.cloudrun.dubbo.inface.IHelloService 的消费者,且可以查询该服务的服务分组提供者 IP

然后设置服务消费者的公网 HTTP 访问路径:

# 验证服务

浏览器访问上图中的 HTTP 地址: