官方提供的demo太多,內容也很詳細,資料也多,導致不易快速上手,以下是我根據官方文件整理出來的快速上手步驟
首先rpc呼叫都需要有註冊中心,zookeeper, nacos,redis等都可以拿來作為註冊中心 這裡為了演示方便我們還是拿經典的zookeeper做演示
完整程式碼已上傳github:github.com/neatlife/my… 下載後啟動zookeeper即可執行
獲取一個可用的zookeeper例項
可以使用docker啟動zookeeper,比如 docker-compose-single.yml
version: '3.1'
services:
zoo:
image: 31z4/zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
複製程式碼
然後執行docker-compose -f docker-compose-single.yml up -d
命令啟動zookeeper例項
執行 lsof -i :2181 檢視效果
可以看到zookeeper已經在2181埠進行監聽了規劃模組
一個rpc服務至少需要以下4個模組組成
模組名 | 作用 |
---|---|
my-api | 給my-provider和my-consumer 提供統一的介面和資料傳輸dto |
my-provider | 服務提供方 |
my-consumer | 服務消費方 |
my-dubbo-spring-boot | 專案外層模組,組織以上3個模組 非必須,可以提供一些子模組可以複用的依賴,屬性等 |
在idea中建立專案my-dubbo-spring-boot和三個子模組,都使用maven來管理依賴
my-provider和my-consumer都要依賴dubbo庫
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
複製程式碼
my-api提供通用依賴,所以不需要任何依賴 因為是spring boot專案,所以spring boot依賴肯定是有的,完整依賴可以去github檢視原始碼
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
複製程式碼
編寫消費者和服務提供者的介面
在模組my-api中建立服務介面DemoService,程式碼如下
package com.demo.consumer;
/**
* Demo Service interface
*
* @since 2.7.0
*/
public interface DemoService {
String sayHello(String name);
}
複製程式碼
這個就是服務提供者需要提供的服務
然後在my-consumer和my-provider模組中都依賴這個my-api模組,程式碼如下:
<dependency>
<groupId>com.demo</groupId>
<artifactId>my-api</artifactId>
<version>2.7.1</version>
</dependency>
複製程式碼
編寫服務提供者
在my-provider裡實現DemoService,核心程式碼如下
@Service(version = "${demo.service.version}")
public class DefaultDemoService implements DemoService {
/**
* The default value of ${dubbo.application.name} is ${spring.application.name}
*/
@Value("${dubbo.application.name}")
private String serviceName;
@Override
public String sayHello(String name) {
return String.format("[%s] : Hello, %s", serviceName, name);
}
}
複製程式碼
然後在專案配置檔案宣告服務提供者的名字等配置,核心配置如下
# Spring boot application
spring.application.name=my-provider
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.demo.provider
# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}
# Dubbo Protocol
dubbo.protocol.name=dubbo
## Random port
dubbo.protocol.port=-1
## Dubbo Registry
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
## DemoService version
demo.service.version=1.0.0
複製程式碼
然後啟動服務者,檢視控制檯輸出效果
編寫服務消費者
在my-consumer裡呼叫DemoService,核心程式碼如下
@EnableAutoConfiguration
public class MyConsumerApplication {
private final Logger log = LoggerFactory.getLogger(getClass());
@Reference(version = "${demo.service.version}")
private DemoService demoService;
public static void main(String[] args) {
SpringApplication.run(MyConsumerApplication.class).close();
}
@Bean
public ApplicationRunner runner() {
return args -> log.error(demoService.sayHello("World"));
}
}
複製程式碼
為了看到明顯的輸出效果,這裡使用了log.error
啟動專案,檢視呼叫效果
可以看到輸出裡帶了服務提供者加上的字串 Hello一些注意的點
my-api 模組作為dubbo消費者和服務提供者的通用依賴,可以提供通用的服務介面,服務輸入,輸出dto等
spring boot dubbo官方有提供一個內建的zookeeper,參考:EmbeddedZooKeeper.java,作者認為一般不會用這種方式啟動zookeeper,所以使用docker啟動了一個zookeeper,可以自行選擇
看到最後了,點個關注再走唄 _(:з」∠)_
可以加作者微信一起研究dubbo的使用和原理