Dubbo介紹
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
核心部件功能
request-response 消息機制.

特性
-
面向接口代理的高性能RPC調用提供高性能的基於代理的遠程調用能力,服務以接口為粒度,為開發者屏蔽遠程調用底層細節。
-
智能負載均衡內置多種負載均衡策略,智能感知下游節點健康狀況,顯著減少調用延遲,提高系統吞吐量。
-
服務自動注冊與發現支持多種注冊中心服務,服務實例上下線實時感知。
-
高度可擴展能力遵循微內核+插件的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴展點,平等對待內置實現和第三方實現。
-
運行期流量調度內置條件、腳本等路由策略,通過配置不同的路由規則,輕松實現灰度發布,同機房優先等功能。
-
可視化的服務治理與運維提供豐富服務治理、運維工具:隨時查詢服務元數據、服務健康狀態及調用統計,實時下發路由策略、調整配置參數。
案例:
首先下載zookeeper(下載地址https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/)解壓到本地。啟動Zookeeper注冊中心,在解壓后zookeeper-3.4.11文件夾bin下啟動cmd,輸入zkServer.cmd
若啟動注冊中心失敗,則需要修改conf目錄下zoo.cfg文件,如圖。
啟動dubbo控制台,通過java -jar jar包名命令啟動。jar包下載地址:鏈接:https://pan.baidu.com/s/1m_4ktW19muxPKWpdKbufVQ 提取碼:xy35
通過瀏覽器訪問控制台,訪問時要輸入用戶名:root與密碼:root:
1.新建maven項目user-service-gmall,該項目包含了bean類、與接口(OrderService、UserService)
UserAddress類:
public class UserAddress implements Serializable { private Integer id; private String userAddress; //用戶地址 private String userId; //用戶id private String consignee; //收貨人 private String phoneNum; //電話號碼 private String isDefault; //是否為默認地址 Y-是 N-否 public UserAddress() { super(); // TODO Auto-generated constructor stub } public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum, String isDefault) { super(); this.id = id; this.userAddress = userAddress; this.userId = userId; this.consignee = consignee; this.phoneNum = phoneNum; this.isDefault = isDefault; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getConsignee() { return consignee; } public void setConsignee(String consignee) { this.consignee = consignee; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public String getIsDefault() { return isDefault; } public void setIsDefault(String isDefault) { this.isDefault = isDefault; } }
OrderService接口:
public interface OrderService { /** * 初始化訂單 * @param userId */ public List<UserAddress> initOrder(String userId); }
UserService接口:
public interface UserService { /** * 按照用戶id返回所有的收貨地址 * @param userId * @return */ public List<UserAddress> getUserAddressList(String userId); }
2.創建user-service-provider01項目
pom文件中添加maven依賴:添加user-service-gmall項目依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.moon</groupId> <artifactId>user-service-provider01</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.moon</groupId> <artifactId>user-service-gmall</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 注冊中心使用的是zookeeper,引入操作zookeeper的客戶端端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> </dependencies> </project>
UserServiceImpl類
public class UserServiceImpl implements UserService { @Override public List<UserAddress> getUserAddressList(String userId) { // TODO Auto-generated method stub System.out.println("UserServiceImpl..3....."); UserAddress address1 = new UserAddress(1, "陝西省西安市", "1", "dd", "010-56253825", "Y"); UserAddress address2 = new UserAddress(2, "陝西省咸陽市", "1", "dd", "010-56253825", "N"); return Arrays.asList(address1,address2); } }
RunClass類
public class MainClass { public static void main(String[] args) throws Exception{ System.out.println("開啟服務"); ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml"); ioc.start(); System.in.read(); } }
provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 1、指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) --> <dubbo:application name="user-service-provider01"></dubbo:application> <!-- 2、指定注冊中心的位置 --> <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> <!-- 3、指定通信規則(通信協議?通信端口) --> <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> <bean id="userServiceImpl" class="com.moon.service.UserServiceImpl"></bean> <!-- 4、暴露服務 ref:指向服務的真正的實現對象 --> <dubbo:service interface="com.moon.user_service_gmall.service.UserService" ref="userServiceImpl" timeout="1000" version="2.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> </beans>
3.創建user-service-consumer項目
OrderServiceImpl類
@Service public class OrderServiceImpl implements OrderService{ @Autowired UserService userService; public List<UserAddress> initOrder(String userId) { // TODO Auto-generated method stub List<UserAddress> addressList = userService.getUserAddressList(userId); for (UserAddress userAddress : addressList) { System.out.println(userAddress.getUserAddress()+"---"+userAddress.getId()); } return addressList; } }
啟動類MainClass
@SuppressWarnings("resource") public class MainClass { public static void main(String[] args) { ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("consumer.xml"); c.start(); OrderService orderService = (OrderService) c.getBean(OrderService.class); orderService.initOrder("1"); System.out.println("調用完成...."); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
consumer.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:component-scan base-package="com.moon.service"></context:component-scan> <dubbo:application name="order-service-consumer"></dubbo:application> <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> <!-- timeout="0" 默認是1000ms--> <!-- retries="":重試次數,不包含第一次調用,0代表不重試--> <!-- 冪等(設置重試次數)【查詢、刪除、修改】、非冪等(不能設置重試次數)【新增】 --> <dubbo:reference interface="com.moon.user_service_gmall.service.UserService" <!--在user-service-provider中暴露的接口服務 --> id="userService" timeout="5000" retries="3" version="*"> <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> --> </dubbo:reference> </beans>
4.啟動服務提供者與消費者,即啟動user-service-provider01與user-service-consumer中MainClass中的main方法(先啟動服務提供者)。
訪問Dubbo后台監控系統,如圖。