本項目演示如何使用 Spring Cloud Alibaba 完成 Dubbo 的RPC調用。java
Spring Cloud是一套完整的微服務架構方案git
Dubbo是國內目前很是流行的服務治理與RPC實現方案github
因爲Dubbo在國內有着很是大的用戶羣體,可是其周邊設施與組件相對來講並不那麼完善(好比feign,ribbon等等)。不少開發者使用Dubbo,又但願享受Spring Cloud的生態,所以也會有一些Spring Cloud與Dubbo一塊兒使用的案例與方法出現。web
Spring Cloud Alibaba的出現,實現了Spring Cloud與Dubbo的完美融合。在以前的教程中,咱們已經介紹過使用Spring Cloud Alibaba中的Nacos來做爲服務註冊中心,而且在此之下能夠如傳統的Spring Cloud應用同樣地使用Ribbon或Feign來實現服務消費。這篇,咱們就來繼續說說Spring Cloud Alibaba 下額外支持的RPC方案:Dubbospring
咱們經過一個簡單的例子,使用Nacos作服務註冊中心,利用Dubbo來實現服務提供方與服務消費方。這裏省略Nacos的安裝與使用,下面就直接進入Dubbo的使用步驟。apache
建立 ali-nacos-dubbo-api 工程json
Dubbo 服務接口是服務提供方與消費方的遠程通信契約,一般由普通的 Java 接口(interface)來聲明,如 HelloService 接口:bootstrap
public interface HelloService { String hello(String name); }
爲了確保契約的一致性,推薦的作法是將 Dubbo 服務接口打包在jar包中,如以上接口就存放在 ali-nacos-dubbo-api 之中。 對於服務提供方而言,不只經過依賴 artifact 的形式引入 Dubbo 服務接口,並且須要將其實現。對應的服務消費端,一樣地須要依賴該 artifact, 並以接口調用的方式執行遠程方法。接下來進一步討論怎樣實現 Dubbo 服務提供方和消費方。api
建立 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 來實現基準包掃描。
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); } }
建立 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
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服務
返回
你好 雲天
或者你也能夠經過 curl 命令執行 HTTP GET 方法
$curl http://127.0.0.1:9103/hello
HTTP 響應爲:
你好 雲天
以上結果說明應用 ali-nacos-dubbo-consumer 經過消費 Dubbo 服務,返回服務提供方 ali-nacos-dubbo-provider 運算後的內容。
以上咱們完成了 Dubbo 服務提供方和消費方的入門運用,源代碼請直接參考模塊: