<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
spring-boot-starter-dubbo這個jar是一個開源的項目對dubbo做了整合,有興趣的同學可以在這裏看源碼,這個項目有1800多個star,阿里官方在GitHub也有dubbo和springcloud的整合,不過只有300多個star,我用的是前邊的jar。配置文件如下:#應用名稱
spring.dubbo.application.name=provider
#註冊中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#協議名稱
spring.dubbo.protocol.name=dubbo
#協議端口
spring.dubbo.protocol.port=20880
#服務類包目錄
spring.dubbo.scan=com.springcloud.learn.dubbo
服務的實現類,需要添加一個額外的Service標識服務,繼承的接口內容也很簡單就是一個方法@Service(version = "1.0.0")
public class ServiceDubboImpl implements ServiceDubbo {
@Override
public String returnFlag() {
return "來自dubbo的服務返回的數據!";
}
}
至此springboot+dubbo的服務端提供的內容到此爲止了,啓動的時候可以看到以下日誌,說明服務已經註冊在zk上了2017-12-15 12:47:00.475 WARN 9548 --- [ver worker #1-1] c.a.d.remoting.transport.AbstractServer : [DUBBO] All clients has discontected from /10.75.134.178:20880. You can graceful shutdown now., dubbo version: 2.5.3, current host: 127.0.0.1
2017-12-15 12:47:00.479 INFO 9548 --- [:20880-thread-4] c.a.d.rpc.protocol.dubbo.DubboProtocol : [DUBBO] disconected from /10.75.134.178:55541,url:dubbo://10.75.134.178:20880/com.springcloud.learn.dubbo.service.ServiceDubbo?anyhost=true&application=provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.5.3&heartbeat=60000&interface=com.springcloud.learn.dubbo.service.ServiceDubbo&methods=returnFlag&pid=9548&revision=1.0.0&side=provider×tamp=1513312058396&version=1.0.0, dubbo version: 2.5.3, current host: 127.0.0.1
dubbo的服務消費端,需要添加相同的jar包,配置文件的內容,有少許差別,如下:spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.springcloud.learn.dubbo
這裏有一點需要注意的是,spring.dubbo.scan需要掃描的包和服務提供端要保持一致,這就要求在消費端定義對應的接口的時候也要保持一致,這塊最好的方式是將dubbo需要提供的服務以jar包的方式引入到消費端的服務中去,這一點和fein的方式是有很大不同的,fein沒有對包名做這麼強的限制。調用使用的Java類如下:@RestController
public class DubboController {
@Reference(version = "1.0.0")
ServiceDubbo serviceDubbo;
@RequestMapping(value = "/use", method = RequestMethod.GET)
public String dc() {
return serviceDubbo.returnFlag();
}
}
在使用服務的時候需要添加@Reference(version = "1.0.0")註解,這樣就可以在消費端啓動消費了。下邊重點說一下和fein的方式的對比。
第一、從表面上看,zk+dubbo的方式,類似於springcloud consul + fein的方式,但是比eruka+fein的方式要複雜一些,畢竟還要單獨安裝zk,zk和consul都需要安裝,fein和dubbo都是接口的方式調用
第二、fein對服務提供的包名沒有嚴格限制
第三、dubbo基於RPC,而fein基於ribbon,ribbon基於http
暫時膚淺的總結上述三點,以後繼續深入