準備
首先我們需要搭建 Dubbo 的註冊中心 zookeeper 環境以及搭建好 Dubbo 管理平臺 dubbo-admin,由於這個不是本文的重點,在這裏直接略過,需要了解細節的讀者可以查閱相關資料。
搭建項目
我們創建一個項目名爲 dubbo-test 的 Spring Boot 項目,然後在項目中新建三個模塊,分別如下:
- api:接口層,存放提供者與消費者調用的接口
- producer:提供者,用於向消費者提供接口實現
- consumer:消費者,調用提供者遠程提供的接口實現
項目目錄如下:
api 模塊的實現
我們在 api 模塊中定義一個接口,該接口用於修改名稱。
package edu.szu.api.service;
/**
* 修改名稱的接口
*/
public interface NameService {
String updateName(String name);
}
producer 模塊的實現
首先我們在 producer 模塊中得引入相關的依賴 dubbo-spring-boot-starter 以及上面實現的 api 模塊,其 pom 文件實現如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>edu.szu</groupId>
<artifactId>producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>producer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入api模塊 -->
<dependency>
<groupId>edu.szu</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo環境 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接下來我們需要編寫 api 模塊定義的 NameService 接口的實現,需要注意的是,在實現類上我們需要加上 @com.alibaba.dubbo.config.annotation.Service 的註解。
package edu.szu.producer.serviceImpl;
import com.alibaba.dubbo.config.annotation.Service;
import edu.szu.api.service.NameService;
import org.springframework.stereotype.Component;
@Component
@Service
public class NameServiceImpl implements NameService {
@Override
public String updateName(String name) {
return "修改後的名稱:" + name;
}
}
然後在啓動類上添加 @EnableDubbo 註解表示開啓 Dubbo 服務
package edu.szu.producer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
最後修改一下配置文件,其實配置文件的註釋已經非常詳細了,所以在這裏就不過多介紹每個配置的具體含義了。
server.port=8080
#提供方應用信息,用於計算依賴關係
dubbo.application.name=producer
#註冊中心地址
dubbo.registry.address=127.0.0.1:2181
#使用zookeeper作爲註冊中心
dubbo.registry.protocol=zookeeper
#使用dubbo協議
dubbo.protocol.name=dubbo
#使用dubbo協議在20880端口暴露服務
dubbo.protocol.port=20880
consumer 模塊的實現
首先引入相關的依賴 dubbo-spring-boot-starter 以及 api 模塊,pom 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>edu.szu</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入api模塊 -->
<dependency>
<groupId>edu.szu</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo環境 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然後我們定義相關的,在消費者中實現的接口
package edu.szu.consumer.service;
public interface ChangeService {
String change(String name);
}
然後提供接口的一個實現,在這裏我們調用遠程服務 nameService,需要注意的是我們在調用的遠程服務接口上需要加上一個 @Reference 註解。
package edu.szu.consumer.serviceImpl;
import com.alibaba.dubbo.config.annotation.Reference;
import edu.szu.api.service.NameService;
import edu.szu.consumer.service.ChangeService;
import org.springframework.stereotype.Component;
@Component
public class ChangeServiceImpl implements ChangeService {
@Reference
NameService nameService;
@Override
public String change(String name) {
return nameService.updateName(name);
}
}
然後我們簡單實現一下控制層
package edu.szu.consumer.controller;
import edu.szu.consumer.service.ChangeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChangeController {
@Autowired
private ChangeService changeService;
@RequestMapping("/change/{name}")
public String change(@PathVariable("name") String name) {
return changeService.change(name);
}
}
然後在啓動類上添加 @EnableDubbo 註解表示開啓 Dubbo 服務
package edu.szu.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
最後修改一下配置文件
server.port=8081
#提供方應用信息,用於計算依賴關係
dubbo.application.name=consumer
#註冊中心地址
dubbo.registry.address=127.0.0.1:2181
#使用zookeeper作爲註冊中心
dubbo.registry.protocol=zookeeper
測試
我們打開 Dubbo 的註冊中心 zookeeper,然後分別啓動 producer 和 consumer,在瀏覽器上輸入 http://localhost:8081/change/HelloDubbo ,發現顯示如下:
說明了消費者確實成功遠程調用了提供者提供的服務。
然後我們再啓動 dubbo-admin,其顯示如下:
dubbo-admin 已成功監控到我們的提供者與消費者,同時表示我們的 Dubbo 與 Spring Boot 整合成功。