跳到主要内容

部署 Dubbo 服务

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

部署示例

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

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

部署流程

注意

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

第 1 步:部署注册中心

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

第 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 地址: