SpringCloud與Dubbo兩個框架一直以來都被用來作為兩種框架進(jìn)行比較西剥,其實對于兩者之間進(jìn)行比較是不公平的渗磅。SpringCloud可以說是一套完整的解決方案而Dubbo其實只是一種RPC和服務(wù)治理的實現(xiàn)方案。
Dubbo一直以來在國內(nèi)有較多的使用殊校,雖然阿里中間有一段時間沒有進(jìn)行維護(hù)芦疏,但是受眾群體還是比較多的。同時在阿里不再維護(hù)的那段時期也由當(dāng)當(dāng)維護(hù)的DubboX推出矛洞。但是Dubbo的相關(guān)周邊組件也依然不是那么的完善洼哎。
SpringCloud與Dubbo的整合方案不是那么的完善,相對來說整合的都比較‘丑’沼本。Dubbo的注冊中心是Zookeeper而SpringCloud一開始是不支持Zookeeper作為注冊中心的噩峦。所以在大部分的公司架構(gòu)中都是二者之間取其一。
SpringCloudAlibaba的出現(xiàn)解決了這樣的問題抽兆,SpringCloudAlibaba與Dubbo都選用Nacos作為服務(wù)的注冊中心识补,并且可以類似于傳統(tǒng)項目的SpringCloud項目一樣使用Feign進(jìn)行消費(fèi)。今天就嘗試一下使用Dubbo連接Nacos注冊中心辫红。
開始之前
可能之前寫過Dubbo的同學(xué)比較了解凭涂,Dubbo的服務(wù)提供方基本需要支持兩個項目,api與provider贴妻。
api負(fù)責(zé)定義服務(wù)所提供的相關(guān)接口切油,以供消費(fèi)方進(jìn)行依賴。 provider則提供相關(guān)接口的具體實現(xiàn)名惩。
例如:
以上的結(jié)構(gòu)是遵守了幾年的一個規(guī)范澎胡,提供的相關(guān)接口由api項目負(fù)責(zé)定義,provider負(fù)責(zé)進(jìn)行實現(xiàn)娩鹉,consumer則依賴相關(guān)api進(jìn)行服務(wù)的調(diào)用攻谁。下面進(jìn)行分步驟的實現(xiàn)。
api 定義服務(wù)接口
IHelloService.java
public interface IHelloService {
String hello(String name);
}
privider構(gòu)建服務(wù)提供方
- 第一步:構(gòu)建SpringBoot項目弯予,引入SpringCloudAlibaba Nacos Dubbo相關(guān)依賴戚宦。同時也需要引入剛才的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為畢業(yè)版本,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>
- 第二步:實現(xiàn)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注冊中心相關(guān)熙涤,同時增加dubbo相關(guān)的配置信息阁苞。其中 scan 表示要掃描的dubbo基礎(chǔ)包。
- 創(chuàng)建SpringBootApplication啟動類與啟動驗證
NacosDubboProviderApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboProviderApplication.class,args);
}
}
啟動
啟動成功后在Nacos服務(wù)列表中即可看到入上服務(wù)祠挫。
consumer服務(wù)消費(fèi)方
第一步:構(gòu)建服務(wù)消費(fèi)調(diào)用項目那槽,pom.xml 所需的依賴與 provider一致。
第二步:創(chuàng)建Controller進(jìn)行服務(wù)消費(fèi)
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 有較多的參數(shù)配置可選,例如check=true校驗服務(wù)是否健康等
第三步:Dubbo相關(guān)配置
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為調(diào)用的服務(wù),配置為服務(wù)的注冊名稱等舔∩Ь模可以在Nacos中查看
第四步:創(chuàng)建NacosDubboConsumerApplication類并啟動消費(fèi)
NacosDubboConsumerApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboConsumerApplication.class,args);
}
}
啟動成功后仍然使用postman進(jìn)行測試。
結(jié)論
通過以上的測試慌植,可以看到SpringCloud與Dubbo使用Nacos注冊中心來實現(xiàn)還是非常簡單的甚牲,Dubbo 的RPC性能優(yōu)勢還是非常重要的义郑。同時仍可以享受SpringCloud的各種便利。SpringCloudAlibaba提供的整合方案能夠融合SpringCloud與Dubbo的各種優(yōu)勢丈钙,同時也便于原有SpringCloud與Dubbo用戶的遷移非驮。
本篇源碼示例:
https://github.com/CainGao/SpringCloudAlibabaExample