從零開始搭建springboot-dubbo的例子
Dubbo 是一個分散式服務框架,致力於提供高效能和透明化的 RPC 遠端服務呼叫方案,以及 SOA 服務治理方案
一、 Dubbo的簡單介紹
1. 網站架構的發展歷程
網站架構隨著業務的發展,邏輯越來越複雜,資料量越來越大,互動越來越多.......
- 單一應用架構(OORM)
當網站流量很小時,將所有的功能部署到一起,以減少部署節點和成本。此時,只需要使用簡化增刪改查的工作量,採用資料訪問框架(ORM)。
- 垂直應用架構 (MVC)
當訪問量逐漸增大,單一應用帶來的加速度越來越小。此時,將應用拆分成互不相干的幾個應用,所以採用MVC框架。
- 分散式服務架構 (RPC)
當垂直應用越來越多,應用之互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速地響應多變的市場需求。此時,用於提高業務複用及整合的服務框架(RPC)是關鍵。
- 流動計算框架 (SQA)
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。此時,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵。
2. dubbo核心工作原理
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Registry | 服務的註冊與發現的註冊中心,如zookeper(推薦)、multicast、redis、simple |
Consumer | 呼叫遠端服務的服務消費方 |
Monitor | 統計服務的呼叫次數和呼叫時間的監控中心 |
Container | 服務執行容器 |
呼叫流程
伺服器負責啟動,載入,執行服務提供者。
服務提供者在啟動時,向註冊中心註冊自己所提供的服務
服務消費者在啟動時,向註冊中心訂閱自己所需的服務
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於TCP長連線推送變更資料給消費者
服務消費者從提供的服務列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果失敗,則選擇另一臺呼叫
服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到檢測中心
3. dubbo特點
Dubbo 支援 RPC 呼叫,服務之間的呼叫效能會很好,效率很高
支援多種序列化協議,如 Hessian(預設)、HTTP、WebService
對比springcloud
二、 springboot-Dubbo搭建
想要使用Dubbo的話,按照前面的原理圖,我們主要使用它的服務遠端呼叫功能,也就是兩個專案之間相互通訊,即RPC
直接上圖,先大致看看專案結構:
dubbo-provider是所謂的服務提供者,springboot專案
dubbo-consumer是服務消費者,springboot專案
dubbo-api是服務提供者的介面API,最普通的maven專案
這裡可以會想起dubbo工作原理的圖:
- 0 dubbo-provider先在容器裡初始化啟動
- 1 dubbo-provider去註冊中心去註冊服務,註冊中心使用zookeeper
- 2 dubbo-consumer去註冊中心發現需要的服務
- 3 註冊中心返回dubbo-provider的服務
- 4 dubbo-consumer直接去呼叫dubbo-provider
1. 專案依賴
dubbo的jar包依賴(spring-boot)
<!-- dubbo依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
註冊中心zookeeper的jar包依賴
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
2. 服務提供者
服務提供者dubbo-provider提供HelloService.sayHello()介面
package com.dubbo.provider.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.service.HelloService;
import org.springframework.stereotype.Component;
//@Service是dubbo裡的註解,作用是暴露服務,不要選擇spring的@Service
@Service
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello" + name;
}
}
還要在springboot的啟動類上加一個開啟Dubbo的註解
package com.dubbo.provider;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//開啟dubbo的自動配置
@EnableDubboConfiguration
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
3. 服務消費者
dubbo-consumer遠端呼叫dubbo-consumer提供的服務HelloService.sayHello()介面
package com.dubbo.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Reference//dubbo註解,可以仔細瞭解下這個註解
private HelloService helloService;
@RequestMapping(value = "/hello")
public String hello() {
String hello = helloService.sayHello("world");
System.out.println(helloService.sayHello("BJQ"));
return hello;
}
}
同上,這個也需要讓Dubbo開啟自動配置
package com.dubbo.consumer;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//就是這裡,對,沒錯 ->_->
@EnableDubboConfiguration
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
4. 專案啟動流程和結構
1. 啟動祖冊中心:
專案啟動需要去官網下載zookeper註冊中心,解壓,配置一下zoo.cfg配置檔案,然後啟動zkServer.cmd(以下是我的簡單配置)
tickTime=2000
initLimit=10
syncLimit=5
dataDir=F:\\zookeeper-3.4.14\\temp\\zookeeper
dataLogDir=F:\\zookeeper-3.4.14\\temp\\zookeeper-logs
clientPort=2181
2. 啟動服務提供方dubbo-provider
如下圖,說明dubbo-provider啟動,並且已經連上註冊中心
3. 啟動服務消費方dubbo-consumer
效果跟上面差不多
4. 服務呼叫結果
自己去試試,皮一下,,哈哈 QWQ
三、專案地址
注意點和問題
dubbo直連,這個可以在測試的過程中使用
dubbo的高校序列化協議可以選的,預設是hessian
dubbo是基於TCP協議去做的,所以很快。
在啟動zookeeper時,會有視窗一閃而過的情況,有可能時jdk環境變數有空格,還有可能是zk的dataDir路徑不對
《完》