SpringBoot整合Dubbo
一、Dubbo
Dubbo是一款高性能、輕量級的開源Java RPC架構,
它提供了三大核心能力:面向接口的遠端方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
關鍵點介紹:
1.注冊與發現
Dubbo使用zookeeper做服務的注冊中心,就是服務的提供者以臨時節點的形式将服務Server資訊注冊儲存到Zookeeper的dubbo目錄下的provider的節點下,供消費者發現調用。
2.負載均衡
Dubbo支援負載均衡政策,就是同一個Dubbo服務被多台伺服器啟用後,會在在Zookeeper提供者節點下顯示多個相同接口名稱節點。
消費者在調用Dubbo負載均衡服務時,采用權重的算法政策選擇具體某個伺服器上的服務,權重政策以*2倍數設定。
3.容錯機制
Dubbo的提供者在Zookeeper上使用的是臨時節點,一旦提供者所在服務挂掉,該節點的客服端連接配接将會關閉,故節點自動消失。是以消費者調用接口時将不會輪詢到已經挂掉的接口上(延遲例外)。
4.Dubbo協定
Dubbo常用協定有兩種:dubo、hessian
dubbo:
Dubbo 預設協定是dubbo協定,采用單一長連接配接和 NIO 異步通訊,适合于小資料量大并發的服務調用,以及服務消費者機器數遠大于服務提供者機器數的情況。
hessian:
Hessian底層采用Http通訊(同步),采用Servlet暴露服務。适用于傳入傳出參數資料包較大,消費者并發量少,提供者較多,可傳檔案。
5.Dubbo容器
Dubbo在java jvm中有自己的容器,和Spring IOC的bean一樣,将服務對象儲存到自己的容器中。
6.監控中心
監控中心主要是用來服務監控和服務治理。
服務治理包含:負載均衡政策、服務狀态、容錯、路由規則限定、服務降級等。具體可以下載下傳Dubbo監控中心用戶端檢視與設定。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLycTMzADM0MTOx0SNwMzNzYzMzEjMxMDM5EDMy0SNxQzM1ITMvw1MwkTMwIzLcVTM0MTNyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、Zookeeper
叢集安裝教程:https://www.cnblogs.com/zwcry/p/10272506.html
三、SpringBoot整合Dubbo
整合前要明白Dubbo RPC遠端過程調用服務的格調,是采用API接口形式調用。
故分為:服務接口Project、提供者Project、消費者Project 三大塊。服務接口Project用來定義接口API,提供者Project用來實作API接口并對外暴露接口,消費者使用服務接口API調用提供者對外暴露的服務。
1.pom.xml依賴
<!-- dubbo依賴 -->
<!-- https://mvnrepository.com/artifact/com.alibaba.spring.boot/dubbo-spring-boot-starter -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
2.定義服務接口Project的接口類
package com.qy.dubbo.server.api;
public interface DubboUserServer {
/**
* @author 七脈
* 描述:擷取使用者
* @param id
* @return
*/
String getUser(Long id);
}
3.提供者Project
(1)服務實作暴露類
package com.qy.dubbo.server.service;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Service;
import com.qy.dubbo.server.api.DubboUserServer;
@Service(interfaceClass=DubboUserServer.class)
@Component
public class DubboUserServerImpl implements DubboUserServer {
@Override
public String getUser(Long id) {
String name = "";
if(1==id){
name = "董志峰";
}else if(2==id){
name = "劉亦菲";
}else{
name = "楊幂";
}
return name+"8082";
}
}
(2)啟動類
package com.qy.dubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
@EnableDubboConfiguration
@SpringBootApplication
public class DubboServerApplication {
public static void main(String[] args) {
System.setProperty("dubbo.application.logger", "slf4j");
SpringApplication.run(DubboServerApplication.class, args);
}
}
(3)application.properties
server.port=8081
## dubbo springboot 配置
spring.dubbo.application.id=dubbo-server-provider
spring.dubbo.application.name=dubbo-server-provider
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.159.129:2181,192.168.159.129:2182,192.168.159.129:2183
spring.dubbo.server=true
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=2${server.port}
4.消費者
(1)服務用戶端
package com.qy.dubbo.client;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;
import com.qy.dubbo.server.api.DubboUserServer;
@Component
public class DubboUserCient {
@Reference(check=false)
private DubboUserServer dubboUserServer;
public String getUser(Long id){
return dubboUserServer.getUser(id);
}
}
(2)啟動類
package com.qy.dubbo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import com.qy.dubbo.client.DubboUserCient;
@RestController
@EnableDubboConfiguration
@SpringBootApplication
public class DubboClientApplication {
@Autowired
private DubboUserCient dubboUserCient;
public static void main(String[] args) {
System.setProperty("dubbo.application.logger", "slf4j");
SpringApplication.run(DubboClientApplication.class, args);
}
@GetMapping("/getuser")
public String getUser(){
return dubboUserCient.getUser(1L);
}
}
server.port=8088
## dubbo springboot 配置
spring.dubbo.application.id=dubbo-server-consumer
spring.dubbo.application.name=dubbo-server-consumer
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.159.129:2181,192.168.159.129:2182,192.168.159.129:2183
spring.dubbo.server=true
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=2${server.port}
5.測試
源碼
連結:https://pan.baidu.com/s/1uLCjpKQ3SIpOngQWznr6lw
提取碼:6knl