SpringBoot雜碎知識 (十三) Dubbo的整合
Dubbo是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。
在2月15日,大年三十,經過一系列緊張的投票,來自阿里巴巴的廣受社群歡迎的RPC開源框架Dubbo宣佈正式進入Apache孵化器。說起Dubbo框架,可能很多後端開發者都有所瞭解,它是國內比較早的、影響較大的開源專案,包括阿里巴巴、京東、噹噹網、去哪兒網、網易考拉、微店等電商平臺都有其成功應用案例。
Dubbo於2011年開源,之後就迅速成為了國內該類開源專案的佼佼者。可以想象,2011年時,優秀的、可在生產環境使用的RPC框架很少,Dubbo的出現迅速給人眼前一亮的感覺,而同時它又有阿里巴巴背書,所以也迅速收到了開發者的親睞。Dubbo 目前在 GitHub 上有超過 16000 個 star 和超過 12000 的 fork 數,絕對是國內影響力最大的開源專案之一。
但奇怪的是,在2014年10月30日釋出2.4.11版本後,Dubbo突然停止更新,當時社群一片譁然(其實是在2012年10月之後就基本停止了重要升級,改為階段性維護)。具體原因現在也不得而知,知乎上也有一些討論,包括團隊調整、內部主推HSF等。不過可以確認的是,在4年前,國內企業對於開源的重視程度都遠遠沒有今天高。
而在官方停止更新Dubbo之後,噹噹網(Dubbox)、網易考拉(Dubbok)都有維護自己單獨的分支,這也可以從另外一個側面證明Dubbo確實應用到了這些企業的重點業務,並且規模不小。
隨著阿里巴巴對於開源的逐步重視,2017年9月7日,Dubbo悄悄的在GitHub釋出了2.5.4版本。隨後,沒過多久,又迅速釋出了2.5.5、2.5.6、2.5.7等版本。在10月舉行的雲棲大會上,阿里宣佈Dubbo被列入集團重點維護開源專案,這也就意味著Dubbo起死回生,開始重新進入快車道。
這章主要介紹Dubbo是怎麼整合springboot的,Dubbo起死回生後,同樣官方也放出的對應boot的start
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
最新版本呢是相容springboot 2.x 以上,其中還有0.1.0版本主要針對springboot1.5x的相容,整合包內預設提供了apcache的curator 來連線zookeeper,所以不用在引用連線zookeeper的包。
專案結構
- dubbo-api 是服務的介面
- dubbo-provider 是服務的生產者 引用dubbo-api
- dubbo-consumer 是服務的消費者 引用dubbo-api
服務介面
package com.maoxs.service;
public interface DemoService {
String sayHello(String name);
}
定義一個DemoService的介面,並且寫一個sayHello的方法
生產者
首先呢看下yml
spring:
application:
name: springboot-service-provider
server:
port: 9001
dubbo:
protocol:
port: 20880
name: dubbo
application:
registry: zookeeper://127.0.0.1:6379 #如果想改用redis註冊中心呢把zookeeper改為redis即可
name: dubbo-provider-demo
id: dubbo-provider-demo
qos-port: 1111
scan:
basePackages: com.maoxs.service.impl
demo:
service:
version: 1.0.0
如果想改用redis註冊中心呢把zookeeper改為redis即可。這裡的scan.basePackages來掃描dubbo的服務
package com.maoxs.service.impl;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.validation.MethodValidated;
import com.maoxs.service.DemoService;
@Service(version = "${demo.service.version}")
public class DefaultDemoService implements DemoService {
public String sayHello(String name) {
return "Hello, " + name + " (from Spring Boot)";
}
}
這個呢是服務的具體實現,切記,這裡的@Service用的是dubbo的註解
然後呢是啟動類 由於生產者作用只是把服務註冊到註冊中心,所以可以把啟動類設定類非web應用
package com.maoxs;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class SpringbootDubboProviderApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(SpringbootDubboProviderApplication.class)
.web(WebApplicationType.NONE) // 非 Web 應用
.run(args);
}
}
消費者
在來看些消費者的程式碼
還是先看yml
spring:
application:
name: springcloud-service-consumer
server:
port: 8001
dubbo:
registry:
address: zookeeper://127.0.0.1:2181
#address: redis://127.0.0.1:6379
application:
name: service-consumer
scan:
basePackages: com.maoxs.controller
demo:
service:
version: 1.0.0
然後呢,我們這裡做一個controller來呼叫遠端的服務
package com.maoxs.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.maoxs.service.DemoService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoConsumerController {
@Reference(version = "${demo.service.version}")
private DemoService demoService;
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable String name) {
return demoService.sayHello(name);
}
}
然後呢,我們啟動zookeeper 註冊中心,把服務註冊上去來看下效果
ok,我們看到呼叫成功了!!
相關連線:
個人部落格地址 : www.fulinlin.com
注:如果不對聯絡本寶寶及時改正~~