SpringCloud與Dubbo兩個框架一直以來都被用來作爲兩種框架進行比較,其實對於兩者之間進行比較是不公平的。SpringCloud可以說是一套完整的解決方案而Dubbo其實只是一種RPC和服務治理的實現方案。
Dubbo一直以來在國內有較多的使用,雖然阿里中間有一段時間沒有進行維護,但是受衆羣體還是比較多的。同時在阿里不再維護的那段時期也由噹噹維護的DubboX推出。但是Dubbo的相關周邊組件也依然不是那麼的完善。
SpringCloud與Dubbo的整合方案不是那麼的完善,相對來說整合的都比較‘醜’。Dubbo的註冊中心是Zookeeper而SpringCloud一開始是不支持Zookeeper作爲註冊中心的。所以在大部分的公司架構中都是二者之間取其一。
SpringCloudAlibaba的出現解決了這樣的問題,SpringCloudAlibaba與Dubbo都選用Nacos作爲服務的註冊中心,並且可以類似於傳統項目的SpringCloud項目一樣使用Feign進行消費。今天就嘗試一下使用Dubbo連接Nacos註冊中心。
開始之前
可能之前寫過Dubbo的同學比較瞭解,Dubbo的服務提供方基本需要支持兩個項目,「api」與「provider」。「api」負責定義服務所提供的相關接口,以供消費方進行依賴。「provider」則提供相關接口的具體實現。
例如:
以上的結構是遵守了幾年的一個規範,提供的相關接口由api項目負責定義,provider負責進行實現,consumer則依賴相關api進行服務的調用。下面進行分步驟的實現。
api 定義服務接口
「IHelloService.java」
public interface IHelloService {
String hello(String name);
}
privider構建服務提供方
-
第一步:構建SpringBoot項目,引入SpringCloudAlibaba Nacos Dubbo相關依賴。同時也需要引入剛纔的api項目。
<dependencies>
<dependency>
<groupId>top.anydata.products.web</groupId>
<artifactId>nacos-discovery-dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--com.alibaba.cloud爲畢業版本,org.springfremework.cloud爲孵化版本-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--必須包含,否則會報錯-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
-
第二步:實現api項目中定義的接口 「HelloServiceImpl.java」
@Service
public class HelloServiceImpl implements IHelloService {
@Override
public String hello(String name) {
return "Hello:"+name;
}
}
「WARN: 這裏的@Service註解不是springframework的而是org.apache.dubbo.config.annotation.Service註解」
-
第三步:配置文件
server:
port: 8080
spring:
application:
name: nacos-dubbo-provider
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
enabled: true
register-enabled: true
server-addr: localhost:8848
profiles:
active: true
dubbo:
scan:
base-packages: top.anydata.products.web.example.nacos_discovery_dubbo_provider.service
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://localhost
application:
qos-enable: true
cloud:
subscribed-services: /
配置nacos註冊中心相關,同時增加dubbo相關的配置信息。其中 「scan」 表示要掃描的dubbo基礎包。
-
創建SpringBootApplication啓動類與啓動驗證 「NacosDubboProviderApplication.java」
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboProviderApplication.class,args);
}
}
「啓動」
啓動成功後在Nacos服務列表中即可看到如上服務。
consumer服務消費方
第一步:構建服務消費調用項目,pom.xml 所需的依賴與 provider一致。
第二步:創建Controller進行服務消費
「HelloController.java」
@RestController
public class HelloController {
@Reference
IHelloService helloService;
@RequestMapping(value = "hello")
public String hello(String name){
return helloService.hello(name);
}
}
「WARN: @Reference 是org.apache.dubbo.config.annotation.Reference 有較多的參數配置可選,例如check=true校驗服務是否健康等」
第三步:Dubbo相關配置
server:
port: 8081
application:
name: nacos-dubbo-consumer
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
enabled: true
register-enabled: true
server-addr: localhost:8848
spring:
application:
name: nacos-dubbo-consumer
dubbo:
registry:
address: spring-cloud://localhost
cloud:
subscribed-services: nacos-dubbo-provider
application:
qos-enable: false
「WARN:此處 dubbo.cloud.subscribed-services爲調用的服務,配置爲服務的註冊名稱。可以在Nacos中查看」
第四步:創建「NacosDubboConsumerApplication」類並啓動消費
「NacosDubboConsumerApplication.java」
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboConsumerApplication.class,args);
}
}
啓動成功後仍然使用postman進行測試。
結論
通過以上的測試,可以看到SpringCloud與Dubbo使用Nacos註冊中心來實現還是非常簡單的,Dubbo 的RPC性能優勢還是非常重要的。同時仍可以享受SpringCloud的各種便利。SpringCloudAlibaba提供的整合方案能夠融合SpringCloud與Dubbo的各種優勢,同時也便於原有SpringCloud與Dubbo用戶的遷移。
「本篇源碼示例:」
https://github.com/CainGao/SpringCloudAlibabaExample
本文分享自微信公衆號 - 指尖數蟲(zhijianshuchong)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。