在spring boot中3分鐘上手RPC框架Dubbo

蘇小林發表於2019-04-29

官方提供的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 檢視效果

在spring boot中3分鐘上手RPC框架Dubbo
可以看到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來管理依賴

在spring boot中3分鐘上手RPC框架Dubbo

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
複製程式碼

然後啟動服務者,檢視控制檯輸出效果

在spring boot中3分鐘上手RPC框架Dubbo

編寫服務消費者

在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

啟動專案,檢視呼叫效果

在spring boot中3分鐘上手RPC框架Dubbo
可以看到輸出裡帶了服務提供者加上的字串 Hello

一些注意的點

my-api 模組作為dubbo消費者和服務提供者的通用依賴,可以提供通用的服務介面,服務輸入,輸出dto等

spring boot dubbo官方有提供一個內建的zookeeper,參考:EmbeddedZooKeeper.java,作者認為一般不會用這種方式啟動zookeeper,所以使用docker啟動了一個zookeeper,可以自行選擇

看到最後了,點個關注再走唄 _(:з」∠)_

可以加作者微信一起研究dubbo的使用和原理

suxiaolinKing

相關文章