目錄
- 緒論
- 環境搭建
- dubbo-demo-interface
- dubbo-demo-xml
- dubbo-demo-xml-provider
- dubbo-demo-xml-consumer
- 運行
緒論
上篇博文<一路踩坑構建Dubbo原始碼>談論了如何本地構建dubbo原始碼,最近溪源也在努力的學習dubbo相關知識和機制,學習程序也可以稱之苦不堪言吧,dubbo官網是入門學習資源重要之一;故溪源先分享中文官網:dubbo中文手冊,
上網文章中也清晰地帶著大家成功運行dubbo-demo;對于像溪源這樣的新手接觸dubbo,學習原始碼估計都很難找到入手的方法,溪源也是走了不少冤枉路,所以特此寫了一篇入手dubbo原始碼的文章,希望能夠幫助伙伴們降低時間浪費,少走彎路,溪源這篇帶著大家在dubbo-demo中創建自己的跟蹤原始碼的單測用例,對于官網給與的demo用例,大家可以大膽的修改,溪源就是把demo改的面目全非,
環境搭建
借助官網的快速啟動手冊,以及原始碼包路徑;
分別在dubbo-demo-interfacemodule中建立物體類和介面:
dubbo-demo-interface
目錄結構如圖:

- 定義物體User
public class User implements Serializable {
private String userId;
private String userName;
private String userLevel;
private String userAddress;
//省略get/set方法
}
注意:物體類物件要實作Serializable介面,涉及后面遠程呼叫傳輸;
- 定義UserService介面
public interface UserService {
List<User> getUserAddressList();
}
- 定義OrderService
public interface OrderService {
void getUserAddressList();
}
dubbo-demo-xml
在dubbo-demo-xml模塊中分別處理服務提供者邏輯、服務消費者邏輯;
dubbo-demo-xml-provider
首先貼出代碼目錄結構:
這個模塊下東西比較多,目前只要是溪源學習SPI,Adaptive相關知識用到,大家可以暫時忽略,可以參考溪源分享的代碼和目錄結構創建,或者根據大家的實際情況建立,溪源僅僅提供一種入門的方式,
- dubbo-provider.xml
具體配置如下:
注冊中心zookeeper地址換成自己本地IP或者阿里云服務器公網IP,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application metadata-type="remote" name="user-provider"/>
<!-- <dubbo:metadata-report address="zookeeper://****:2181"/>-->
<!--定義包掃描路徑-->
<context:component-scan base-package="org.apache.dubbo.demo.provider"/>
<dubbo:registry address="zookeeper://*****:2181" timeout="10000"/>
<dubbo:protocol name="dubbo"/>
<!--暴露服務介面,ref:指介面真正的實作類bean,實作類后面會分享-->
<dubbo:service interface="org.apache.dubbo.demo.UserService" ref="memberServiceImpl"/>
</beans>
注意:此處與官網提供的xml配置存在區別,溪源這里引入包路徑掃描機制,否則介面實作類無法使用注解@Service等注入spring容器中,或者大家可以按照官網使用<bean>標簽注入實作類物件,如下:
<bean id="memberServiceImpl" class="org.apache.dubbo.demo.provider.impl.MemberServiceImpl"/>
- memberServiceImpl
@Service
public class MemberServiceImpl implements UserService, Serializable {
@Override
public List<User> getUserAddressList() {
List<User> userList = new LinkedList<>();
for (int i = 0; i < 2; i++) {
User user = new User();
user.setUserLevel("member");
user.setUserAddress("杭州拱墅 " + i);
userList.add(user);
}
return userList;
}
}
溪源目的是通過實體學習dubbo相關機制和實作,所以此處直接代碼創建user物件,實際應用業務場景再仔細考慮;
- 主啟動類
為了能夠區分業務功能啟動類,溪源直接將官網提供的類名改成ProviderApplication,
public class ProviderApplication {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
context.start();
System.in.read();
}
}
服務提供者相關業務結束,下面開始實作服務消費者,
dubbo-demo-xml-consumer
代碼目錄如下:
consumer模塊的目錄結構就比較簡單明了,
- dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<context:component-scan base-package="org.apache.dubbo.demo.consumer"/>
<dubbo:application name="order-consumer"/>
<dubbo:registry address="zookeeper://****:2181" timeout="80000"/>
<!--參考暴露的介面-->
<dubbo:reference id="userService" check="false" interface="org.apache.dubbo.demo.UserService"/>
</beans>
- OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private UserService userService;
@Override
public void getUserAddressList() {
List<User> userAddressList = userService.getUserAddressList();
for (User user : userAddressList) {
System.out.println(user.getUserAddress());
}
}
}
獲取用戶地址,并列印出來,
- 主啟動類
同理,溪源將原啟動類重命名為ConsumerApplication,
public class ConsumerApplication {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");
OrderService orderService = context.getBean(OrderService.class);
orderService.getUserAddressList();
System.in.read();
}
}
運行
運行程式之前,溪源再著重強調幾點,也是溪源學習程序中遇到的例外或者錯誤問題,避免大家踩坑,再說一下:
1.物體類,服務介面實作類實作Serializable介面;
2.確保自己zookeeper注冊中心正常啟動;
3.檢查自己是否開啟包掃描機制或者是否使用xml組態檔注入bean方式;
4.溪源并沒有設定啟動檢查選項,所以默認值為true,如果服務提供類未啟動,則服務消費者先啟動,會報錯;
大家運行之前,再仔細核查一遍,然后先啟動ProviderApplication,再啟動ConsumerApplication,
運行結果如圖:

溪源寫的demo原始碼傳送門,
雖然公司專案業務暫時用不dubbo,但是不代表我們就停滯不前,程式員最重要的是技能,大家如果存在好的學習資源可以私信或者評論區留言能夠分享給溪源一下哈~~,溪源也是第一次接觸dubbo的相關機制,如果中間存在錯誤之處,希望大家能夠及時指正,便于改正,最后,希望能夠得到大家的肯定和支持,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33107.html
標籤:其他
