從零開始搭建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路徑不對
《完》