Spring Cloud Alibaba(四)實現Dubbo服務消費
本專案演示如何使用 Spring Cloud Alibaba 完成 Dubbo 的RPC呼叫。
Spring Cloud與Dubbo
Spring Cloud是一套完整的微服務架構方案
Dubbo是國內目前非常流行的服務治理與RPC實現方案
由於Dubbo在國內有著非常大的使用者群體,但是其周邊設施與元件相對來說並不那麼完善(比如feign,ribbon等等)。很多開發者使用Dubbo,又希望享受Spring Cloud的生態,因此也會有一些Spring Cloud與Dubbo一起使用的案例與方法出現。
Spring Cloud Alibaba的出現,實現了Spring Cloud與Dubbo的完美融合。在之前的教程中,我們已經介紹過使用Spring Cloud Alibaba中的Nacos來作為服務註冊中心,並且在此之下可以如傳統的Spring Cloud應用一樣地使用Ribbon或Feign來實現服務消費。這篇,我們就來繼續說說Spring Cloud Alibaba 下額外支援的RPC方案:Dubbo
程式碼實現
我們通過一個簡單的例子,使用Nacos做服務註冊中心,利用Dubbo來實現服務提供方與服務消費方。這裡省略Nacos的安裝與使用,下面就直接進入Dubbo的使用步驟。
定義 Dubbo 服務介面
建立 ali-nacos-dubbo-api 工程
Dubbo 服務介面是服務提供方與消費方的遠端通訊契約,通常由普通的 Java 介面(interface)來宣告,如 HelloService 介面:
public interface HelloService {
String hello(String name);
}
為了確保契約的一致性,推薦的做法是將 Dubbo 服務介面打包在jar包中,如以上介面就存放在 ali-nacos-dubbo-api 之中。 對於服務提供方而言,不僅通過依賴 artifact 的形式引入 Dubbo 服務介面,而且需要將其實現。對應的服務消費端,同樣地需要依賴該 artifact, 並以介面呼叫的方式執行遠端方法。接下來進一步討論怎樣實現 Dubbo 服務提供方和消費方。
實現 Dubbo 服務提供方
建立 ali-nacos-dubbo-provider,埠:9001 工程
pom.xml配置
<?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"> <parent> <artifactId>cloud-alibaba</artifactId> <groupId>com.easy</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ali-nacos-dubbo-provider</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <!-- API --> <dependency> <groupId>com.easy</groupId> <artifactId>ali-nacos-dubbo-api</artifactId> <version>${project.version}</version> </dependency> <!--dubbo--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <!--nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
bootstrap.yaml配置
dubbo:
scan:
# dubbo 服務掃描基準包
base-packages: com.easy.andProvider.service
#Dubbo 服務暴露的協議配置,其中子屬性 name 為協議名稱,port 為協議埠( -1 表示自增埠,從 20880 開始)
protocol:
name: dubbo
port: -1
#Dubbo 服務註冊中心配置,其中子屬性 address 的值 “spring-cloud://localhost”,說明掛載到 Spring Cloud 註冊中心
registry:
address: spring-cloud://localhost
spring:
application:
# Dubbo 應用名稱
name: ali-nacos-dubbo-provider
main:
allow-bean-definition-overriding: true
cloud:
# Nacos 服務發現與註冊配置
nacos:
discovery:
server-addr: 127.0.0.1:8848
Dubbo Spring Cloud 繼承了 Dubbo Spring Boot 的外部化配置特性,也可以通過標註 @DubboComponentScan 來實現基準包掃描。
實現 Dubbo 服務
HelloService 作為暴露的 Dubbo 服務介面,服務提供方 ali-nacos-dubbo-provider 需要將其實現:
package com.easy.andProvider.service;
import com.easy.and.api.service.HelloService;
import org.apache.dubbo.config.annotation.Service;
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "你好 " + name;
}
}
import org.apache.dubbo.config.annotation.Service 是 Dubbo 服務註解,僅宣告該 Java 服務實現為 Dubbo 服務
貼上啟動類程式碼:
@EnableDiscoveryClient
@EnableAutoConfiguration
public class AndProviderApplication {
public static void main(String[] args) {
SpringApplication.run(AndProviderApplication.class);
}
}
實現 Dubbo 服務消費方
建立 ali-nacos-dubbo-consumer,埠:9103 工程
pom.xml依賴
<?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">
<parent>
<artifactId>cloud-alibaba</artifactId>
<groupId>com.easy</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ali-nacos-dubbo-consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.easy</groupId>
<artifactId>ali-nacos-dubbo-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yaml配置檔案
dubbo:
registry:
address: spring-cloud://localhost
cloud:
subscribed-services: ali-nacos-dubbo-provider
spring:
application:
name: ali-nacos-dubbo-consumer
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
實現 Dubbo 服務消費方
HomeController.java
package com.easy.andConsumer;
import com.easy.and.api.service.HelloService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class HomeController {
@Reference
HelloService helloService;
@GetMapping("/hello")
public String hello(String name) {
return helloService.hello("雲天");
}
}
AndConsumerApplication.java啟動類
package com.easy.andConsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class AndConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(AndConsumerApplication.class, args);
}
}
使用示例
示例關聯專案
本示例我們建立了三個專案實現
ali-nacos-dubbo-api:定義Dubbo服務介面工程
ali-nacos-dubbo-provider:Dubbo服務提供方並向nacos註冊服務,服務名:ali-nacos-dubbo-provider,埠:9001
ali-nacos-dubbo-consumer:Dubbo服務消費方並向nacos註冊服務,服務名:ali-nacos-dubbo-consumer,埠:9103
執行示例測試
首先要啟動服務註冊中心 nacos、ali-nacos-dubbo-provider服務及ali-nacos-dubbo-consumer服務
- 訪問服務消費方地址: http://localhost:9103/hello
返回
你好 雲天
或者你也可以通過 curl 命令執行 HTTP GET 方法
$curl http://127.0.0.1:9103/hello
HTTP 響應為:
你好 雲天
以上結果說明應用 ali-nacos-dubbo-consumer 通過消費 Dubbo 服務,返回服務提供方 ali-nacos-dubbo-provider 運算後的內容。
以上我們完成了 Dubbo 服務提供方和消費方的入門運用,原始碼請直接參考模組:
- ali-nacos-dubbo-provider
- ali-nacos-dubbo-consumer
資料
- Spring Cloud Alibaba 示例原始碼
- 原文地址