- 管理控制台
- 服务提供者
- 服务消费者
在搭建 Dubbo 项目前需安装并部署注册中心。推荐使用 Zookeeper 作为注册中心。Zookeeeper 的安装及部署方法请参考:
Zookeeper的安装与部署
windows下zookeeper安装并发布成windows服务
管理控制台
方法1:
使用如下命令从 Apache Dubbo 官方 git 仓库中下载管理控制台项目(需安装 git):
git clone https://github.com/apache/dubbo-admin.git
采用前后端分离的方式,运行 dubbo-admin 项目:
后端:
将控制台定位到 dubbo-admin-server 目录下,运行如下命令:
mvn clean package
cd target
java -jar dubbo-admin-server-0.1.jar
控制台显示 Completed initialization in x ms 表示启动成功。
关闭控制台窗口此进程自动关闭。
出现问题:
- 在打包过程中,提示 curator-test-version 依赖包版本过高,在父模块的 pom.xml 文件中,把 curator-test-version 从 4.1.0 修改为 2.4.2,但仍然有错。之后删除 dubbo-admin-server\src 中的 test 文件夹,提示打包成功。
- 后端项目启动时端口号若被占用,或者 Zookeeper 安装时使用了自定义的配置,可在 dubbo-admin\dubbo-admin-server\src\main\resources 目录下的 application.properties 文件中指定端口号或修改配置项。
前端
将控制台定位到 dubbo-admin-ui 目录下,运行如下命令:
npm install
npm run dev
控制台显示 Compiled successfully in x ms
Your application is running here: http://localhost:port
表示前端运行成功。
前端项目启动时端口号若被占用,可在 dubbo-admin\dubbo-admin-ui\config\index.js 目录下的 index.js 文件中指定空闲端口号。
在浏览器中输入地址:http://localhost:8081
方法2:
使用如下命令从 git 仓库中下载老版本管理控制台:
git clone https://github.com/Augustvic/incubator-dubbo-ops.git
用 IDEA 编辑器打开并运行该项目。
在浏览器中输入地址:http://localhost:7001,用户名和密码均为 root。
服务提供者
推荐使用 IDEA 编辑器编写代码,推荐使用 maven 进行项目构建。
创建 Springboot 项目,命名为“dubboprovider”,作为服务提供者项目。创建子模块“SystemFacade”用于提供服务接口,创建子模块“SystemService”用于提供服务实现。
项目目录结构如下:
在父模块的 pom.xml 文件中指定项目父框架为 spring-boot-starter-parent:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
添加 spring-boot-starter-web、dubbo-spring-boot-starter、curator-framework、zookeeper 依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<curator-framework.version>4.0.1</curator-framework.version>
<zookeeper.version>3.5.5</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
</dependencies>
在子模块 SystemFacade 中创建 com.dubbo.test.service 包,定义提供者和消费者共同的接口 IUserService 接口,在接口中定义两个函数 sayHello、addInteger,分别用于打印字符串和计算整数之和:
public interface IUserService {
String sayHello(String name);
String addInteger(String s);
}
在子模块 SystemService 的 pom.xml 文件中引入模块 SystemFacade 的依赖:
<dependencies>
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>SystemFacade</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在 resources 资源文件夹下创建配置文件 application.yml:
# 指定进程端口号
server:
port: 9083
spring:
# 进程名
application:
name: august-dubbo-provider
dubbo:
# 服务提供者名字
application:
name: august-dubbo-provider
#协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
protocol:
name: dubbo
port: 20880
# 注册中心配置,用于配置连接注册中心相关信息,由于注册中心在本地,所以 IP 地址为 localhost
registry:
address: zookeeper://localhost:2181
#服务暴露与发现消费所在的package
scan:
base-packages: com.dubbo.test
provider:
timeout: 1000
创建 com.dubbo.test.service 包,该包中创建启动类 ProviderApplication:
@EnableDubbo
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
继续创建 com.dubbo.test.service.impl 包,在该包中创建服务的提供者,即接口类 IUserService 的实现 UserServiceImpl:
@Component
@Service(version = "1.0.0")
public class UserServiceImpl implements IUserService {
@Override
public String sayHello(String name) {
return name + " login in.";
}
@Override
public String addInteger(String s) {
if (s == null || s.length() < 3)
return "Format Error!";
int index = 0;
while (index < s.length()) {
if (s.charAt(index) == '+')
break;
index++;
}
int a = Integer.valueOf(s.substring(0, index));
int b = Integer.valueOf(s.substring(index + 1));
return String.valueOf(a + b);
}
}
注意:@Service 来自于 com.alibaba.dubbo.config.annotation.Service,且必须指定版本号。
ProviderApplication 启动类必须在 UserServiceImp.java 所在包的上层包里面。
运行该 Springboot 进程,在管理控制台上查看服务提供者信息:
服务消费者
创建 Springboot 项目,命名为“dubboconsumer”,作为服务消费者项目。创建子模块“SystemFacade”用于定义共同的接口,创建子模块“SystemApi”用于消费服务。
项目目录结构如下:
在父模块的 pom.xml 文件中指定项目父框架为 spring-boot-starter-parent:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
添加 spring-boot-starter-web、dubbo-spring-boot-starter、curator-framework、zookeeper 依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<curator-framework.version>4.0.1</curator-framework.version>
<zookeeper.version>3.5.5</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
</dependencies>
同样在子模块 SystemFacade 中创建 com.dubbo.test.service 包,定义提供者和消费者共同的接口 IUserService 接口,接口和服务提供者完全一样:
public interface IUserService {
String sayHello(String name);
String addInteger(String s);
}
在子模块 SystemApi 的 pom.xml 文件中引入模块 SystemFacade 的依赖:
<dependencies>
<dependency>
<groupId>com.august</groupId>
<artifactId>SystemFacade</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在该子模块 resources 资源文件夹下创建配置文件 application.yml:
# 指定进程端口号
server:
port: 9084
spring:
# 进程名
application:
name: august-dubbo-consumer
dubbo:
# 服务消费者名字
application:
name: august-dubbo-consumer
#协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
protocol:
name: dubbo
port: 20880
# 注册中心配置,用于配置连接注册中心相关信息,由于注册中心在本地,所以 IP 地址为 localhost
registry:
address: zookeeper://localhost:2181
consumer:
timeout: 5000
创建 com.dubbo.test 包,该包中创建启动类 ConsumerApplication:
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
继续创建 com.dubbo.test.controller 包,在该包中创建服务的消费者,UserController:
@RestController
public class UserController {
@Reference(version = "1.0.0")
private IUserService userService;
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name) {
return userService.sayHello(name);
}
@RequestMapping("/addInteger/{format}")
public String addInteger(@PathVariable("format") String format) {
return userService.addInteger(format);
}
}
运行该 Springboot 进程,在管理控制台上查看服务消费者信息:
打开浏览器输入:http://localhost:9084/sayHello/August,测试方法 sayHello。浏览器显示如下,说明消费者成功调用服务:
在浏览器地址栏输入:http://localhost:9084/addInteger/5+6,测试方法 addInteger。浏览器显示如下,说明消费者成功调用服务:
参考
Apache Dubbo 官网
Zookeeper的安装与部署
windows下zookeeper安装并发布成windows服务