Dubbo是一款高性能、輕量級的開源Java RPC框架,html
它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。 java
關鍵點介紹:web
1.註冊與發現 算法
Dubbo使用zookeeper作服務的註冊中心,就是服務的提供者以臨時節點的形式將服務Server信息註冊保存到Zookeeper的dubbo目錄下的provider的節點下,供消費者發現調用。spring
2.負載均衡api
Dubbo支持負載均衡策略,就是同一個Dubbo服務被多臺服務器啓用後,會在在Zookeeper提供者節點下顯示多個相同接口名稱節點。springboot
消費者在調用Dubbo負載均衡服務時,採用權重的算法策略選擇具體某個服務器上的服務,權重策略以*2倍數設置。服務器
3.容錯機制併發
Dubbo的提供者在Zookeeper上使用的是臨時節點,一旦提供者所在服務掛掉,該節點的客服端鏈接將會關閉,故節點自動消失。因此消費者調用接口時將不會輪詢到已經掛掉的接口上(延遲例外)。app
4.Dubbo協議
Dubbo經常使用協議有兩種:dubo、hessian
dubbo:
Dubbo 缺省協議是dubbo協議,採用單一長鏈接和 NIO 異步通信,適合於小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的狀況。
hessian:
Hessian底層採用Http通信(同步),採用Servlet暴露服務。適用於傳入傳出參數數據包較大,消費者併發量少,提供者較多,可傳文件。
5.Dubbo容器
Dubbo在java jvm中有本身的容器,和Spring IOC的bean同樣,將服務對象保存到本身的容器中。
6.監控中心
監控中心主要是用來服務監控和服務治理。
服務治理包含:負載均衡策略、服務狀態、容錯、路由規則限定、服務降級等。具體能夠下載Dubbo監控中心客戶端查看與設置。
集羣安裝教程:http://www.javashuo.com/article/p-cbooxgmm-dt.html
整合前要明白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>
package com.qy.dubbo.server.api; public interface DubboUserServer { /** * @author 七脈 * 描述:獲取用戶 * @param id * @return */ String getUser(Long id); }
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"; } }
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); } }
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}
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); } }
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}
源碼
連接:https://pan.baidu.com/s/1uLCjpKQ3SIpOngQWznr6lw
提取碼:6knl