一、注册中心 Zookeeper
1.1 docker-compose 伪集群部署
复制自 DockerHub,docker-compose-zookeeper.yaml
:
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
运行:
docker-compose -f docker-compose-zookeeper.yaml up -d
二、管理控制台 Dubbo Admin
2.1 docker-compose 部署
伪集群部署 zookeeper 时会创建一个网络。教主的docker-compose-zookeeper.yaml
文件放在 /d/docker/zookeeper/
下,所以创建了一个名为 zookeeper_default
的网络。现在 dubbo-admin 需要访问 zookeeper 伪集群的容器的网络,需要将 dubbo-admin 加入至该网络。
docker network ls
version: '3'
services:
admin:
image: apache/dubbo-admin
ports:
- 8080:8080
environment:
- admin.registry.address=zookeeper://zoo1:2181
- admin.config-center=zookeeper://zoo1:2181
- admin.metadata-report.address=zookeeper://zoo1:2181
networks:
- zookeeper_default
networks:
zookeeper_default:
external: true
给容器传递环境变量时,以 docker-compose 的『服务名』代替 IP 地址:
运行:
docker-compose -f docker-compose-dubbo-admin.yaml up -d
访问:
2.2 版本相关
DockerHub 里的镜像还是很久很久之前更新的,最新版本为 0.1.0。但是 https://github.com/apache/dubbo-admin 目录中却又有 0.2.0 版本的 Dockerfile,然而经过自己构建测试(时间:2020-05-27)似乎并没有什么不同(界面稍微变好看了一点点)。
2.3 jar 包部署和前后端分离部署相关
根据官网描述:
QUOTE http://dubbo.apache.org/zh-cn/docs/admin/introduction.html
然而,如果直接进行 mvn clean package
会报一堆错误,解决方案为跳过测试:
mvn clean package -Dmaven.test.skip=true
另外,可能还会因为网络原因,node 未下载完整可能也会报一堆错误,解决方案为删除下载不完整的包:
2.4 其它相关
dubbo-amdin 的 docker 镜像默认没有登录密码,而 GitHub 的源码包是配置有登录密码的。右图为 Dockerfile 构建的源码包中的配置文件:
三、Dubbo 简单的 RPC 调用
3.1 Maven 创建接口模块 hello-dubbo-demo-api
3.1.1 GAV 坐标
<groupId>xyz.icefery.dubbodemo</groupId>
<artifactId>hello-dubbo-demo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
3.1.2 接口
package xyz.icefery.dubbodemo.hello.dubbo.demo.api;
public interface DemoService {
String sayHello();
}
3.1.3 安装到本地仓库
mvn clean install
3.2 SpringBoot 创建提供者模块 hello-dubbo-demo-provider
3.2.1 GAV 坐标
<groupId>xyz.icefery.dubbodemo</groupId>
<artifactId>hello-dubbo-demo-provider</artifactId>
<version>1.0.0-SNAPSHOT</version>
3.2.2 引入 dubbo 相关依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-actuator</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2.3 引入接口依赖
<dependency>
<groupId>xyz.icefery.dubbodemo</groupId>
<artifactId>hello-dubbo-demo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
3.2.4 实现接口
使用 dubbo 的 @Service
注解:
package xyz.icefery.dubbodemo.hello.dubbo.demo.provider.api.impl;
import com.alibaba.dubbo.config.annotation.Service;
import xyz.icefery.dubbodemo.hello.dubbo.demo.api.DemoService;
@Service(version = "1.0.0")
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello() {
return "Hello Dubbo";
}
}
3.2.5 main 函数启动 provider 容器
package xyz.icefery.dubbodemo.hello.dubbo.demo.provider;
import com.alibaba.dubbo.container.Main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloDubboDemoProviderApplication {
public static void main(String[] args) {
SpringApplication.run(HelloDubboDemoProviderApplication.class, args);
Main.main(args);
}
}
3.2.6 配置文件
application.yaml
:
spring:
application:
name: hello-dubbo-demo-provider
dubbo:
scan:
basePackages: xyz.icefery.dubbodemo.hello.dubbo.demo.provider.api
application:
id: hello-dubbo-demo-provider
name: hello-dubbo-demo-provider
qos-port: 22222
qos-enable: true
protocol:
id: dubbo
name: dubbo
port: 20880
status: server
registry:
id: zookeeper
address: zookeeper://127.0.0.1:2181
management:
endpoint:
dubbo:
enabled: true
dubbo-shutdown:
enabled: true
dubbo-configs:
enabled: true
dubbo-services:
enabled: true
dubbo-references:
enabled: true
dubbo-properties:
enabled: true
health:
dubbo:
status:
defaults: memory
extras: load,threadpool
3.3 SpringBoot 创建消费者模块 hello-dubbo-demo-consumer
3.3.1 GAV 坐标
<groupId>xyz.icefery.dubbodemo</groupId>
<artifactId>hello-dubbo-demo-consumer</artifactId>
<version>1.0.0-SNAPSHOT</version>
3.3.2 dubbo 相关依赖
dubbo 相关依赖和提供者模块的 dubbo 相关依赖相同。
3.3.3 web 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.3.4 RPC 调用
使用 dubbo 的 @Reference
注解:
package xyz.icefery.dubbodemo.hello.dubbo.demo.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xyz.icefery.dubbodemo.hello.dubbo.demo.api.DemoService;
@RestController
public class DemoController {
@Reference(version = "1.0.0")
private DemoService demoService;
@RequestMapping(value = "/hello")
public String sayHi() {
return demoService.sayHello();
}
}
3.3.5 配置文件
application.yaml
:
spring:
application:
name: hello-dubbo-demo-consumer
server:
port: 9090
dubbo:
scan:
base-packages: xyz.icefery.dubbodemo.hello.dubbo.demo.consumer.controller
application:
id: hello-dubbo-demo-consumer
name: hello-dubbo-demo-consumer
registry:
id: zookeeper
address: zookeeper://127.0.0.1:2181
endpoints:
dubbo:
enabled: true
management:
server:
port: 9091
health:
dubbo:
status:
defaults: memory
endpoint:
dubbo:
enabled: true
dubbo-shutdown:
enabled: true
dubbo-configs:
enabled: true
dubbo-services:
enabled: true
dubbo-references:
enabled: true
dubbo-properties:
enabled: true
endpoints:
web:
exposure:
include: "*"
3.4 启动
- 确认注册中心 zookeeper 正常运行
- 启动服务提供者和服务消费者
- 访问http://127.0.0.1:9090/hello
- 查看管理控制台