一、Dubbo誕生背景(摘自Dubbo官網-入門-背景) 二、Dubbo架構圖(摘自Dubbo官網-入門-架構) 三、Dubbo核心依賴(jar包):dubbo、zkclient 四、Dubbo項目搭建的方式:配置文件式、註解式 五、Dubbo項目配置文件的核心配置: (一)配置文件式 1. 服務提 ...
一、Dubbo誕生背景(摘自Dubbo官網-入門-背景)
二、Dubbo架構圖(摘自Dubbo官網-入門-架構)
三、Dubbo核心依賴(jar包):dubbo、zkclient
四、Dubbo項目搭建的方式:配置文件式、註解式
五、Dubbo項目配置文件的核心配置:
(一)配置文件式
1. 服務提供方(下示例):①應用名②協議(建議dubbo協議)③註冊中心④暴露的具體服務介面⑤註冊暴露的具體服務介面的實現類bean對象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--配置提供服務方應用信息,用於計算依賴關係--> <dubbo:application name="provide-xml"/> <!--配置協議(用dubbo協議在20880埠(dubbo協議預設埠)暴露服務)--> <dubbo:protocol name="dubbo" port="20880"/> <!--配置註冊中心,以暴露服務地址--> <dubbo:registry address="zookeeper://192.168.110.11:2181"/> <!--配置暴露服務的介面--> <dubbo:service interface="com.bjsxt.dubbo.service.ITPService_xml" ref="dataServiceImpl"/> <!--註冊暴露的服務介面的實現類的bean對象--> <bean id="dataServiceImpl" class="com.bjsxt.dubbo.service.impl.ITPServiceImpl_xml"/> </beans>
2. 服務消費方(下示例):①應用名②註冊中心③要調用的提供方所暴露的具體服務介面
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--配置消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣--> <dubbo:application name="consumer-xml"></dubbo:application> <!--配置註冊中心,暴露發現服務地址--> <dubbo:registry address="zookeeper://192.168.110.11:2181"/> <!--聲明所要調用的服務提供方暴露的服務介面(前提:已經將該介面複製到消費方的業務層中)--> <dubbo:reference interface="com.bjsxt.dubbo.service.ITPService_xml" id="iTPService"/> </beans>
(二)註解式
1. 服務提供方(下示例):①應用名②協議③註冊中心④dubbo註解掃描
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--配置提供服務方應用信息,用於計算依賴關係--> <dubbo:application name="provide-annotation"/> <!--配置協議(用dubbo協議在20880埠(dubbo協議預設埠)暴露服務)--> <dubbo:protocol name="dubbo" port="20880"/> <!--配置註冊中心,以暴露服務地址--> <dubbo:registry address="zookeeper://192.168.110.11:2181"/> <!--配置dubbo註解掃描(註解式:利用dubbo的註解@Service來代替配置式的另外兩個配置)--> <dubbo:annotation package="com.bjsxt.dubbo.service.impl"/> </beans>
2. 服務消費方(下示例):①應用名②註冊中心③dubbo註解掃描④聲明調用暴露的具體服務介面的業務層實現類bean對象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--配置消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣--> <dubbo:application name="consumer-annotation"></dubbo:application> <!--配置註冊中心,暴露發現服務地址--> <dubbo:registry address="zookeeper://192.168.110.11:2181"/> <!--配置dubbo註解掃描--> <dubbo:annotation package="com.bjsxt.dubbo.service.impl"/> <!--配置服務消費者調用提供方暴露的服務介面的業務實現類bean對像--> <bean id="iTServiceConsumerImpl_SSM" class="com.bjsxt.dubbo.service.impl.ITServiceConsumerImpl_SSM"/> </beans>
六、示例-簡單實現Dubbo項目:
(〇)本人測試項目的環境搭建:
①maven下Java的quickstart模板②沒有用SSM框架③註冊中心選用zookeeper,安裝在Linux虛擬機中
④沒有面向對象三層架構中的持久層,只有數據類pojo/entity(測試數據自己在服務方暴露的服務介面的實現類的測試方法中自設定)
(一)配置文件式
1. 項目代碼:
(1)服務提供方:
①數據類pojo/entity
package com.bjsxt.dubbo.pojo; import lombok.Data; import java.io.Serializable; @Data public class TestData implements Serializable { private Integer uid; private String uname; }
②業務層service
i. 暴露的服務介面
package com.bjsxt.dubbo.service; import com.bjsxt.dubbo.pojo.TestData; import java.util.List; public interface ITPService_xml { //查詢測試數據 List<TestData> selectTestData(); }
ii. 暴露的服務介面的實現類
package com.bjsxt.dubbo.service.impl; import com.bjsxt.dubbo.pojo.TestData; import com.bjsxt.dubbo.service.ITPService_xml; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * spring框架中的@Autowired註解、@Resource註解和@Service註解 * @Autowired註解 省去了 在xml中<bean>配置的 <property> 和在對應<bean> 類中 屬性的set、get方法 * @Resource註解 和@Autowired註解 極為相似 * @Service註解 省去了 在xml中<bean>的配置 ! 實現 xml零配置 * 詳情:再說~ */ @Service public class ITPServiceImpl_xml implements ITPService_xml { //查詢測試數據(省略持久層,自定義測試數據) @Override public List<TestData> selectTestData() { ArrayList<TestData> list=new ArrayList<>(); TestData testData=new TestData(); testData.setUid(0); testData.setUname("fuck"); list.add(testData); return list; } }
(2)服務消費方:
①數據類pojo/entity:同上
②業務層service:將服務提供方暴露的服務介面的代碼複製過來,即可
2. 啟動方式:
(1)服務提供方:
①API載入配置文件(本人沒寫這種方式)(可以參考下麵的服務消費方的啟動方式,也可以看Dubbo官網給出的示例代碼):
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意鍵退出 } }
②利用dubbo服務運行容器的main方法:
前提:將spring配置文件安放在META-INF目錄下的spring目錄中,否則dubbo服務運行容器找不到spring配置文件
package com.bjsxt.dubbo; import com.alibaba.dubbo.container.Main; public class AppTest { /** * 通過載入spring配置文件,以啟動dubbo的服務運行容器Container * (該容器是spring類型的容器, * dubbo配置式啟動方法,除了直接載入spring配置文件, * 再就是下麵的通過dubbo中的Main類載入spring配置文件 * ——該方法須要將spring配置文件放在“META-INF”目錄下的“spring”目錄中) */ public static void main(String[] args) {Main.main(args);} }
【運行結果·圖】(前提:已經啟動zookeeper註冊中心,註冊中心啟動成功圖略)(註:運行後,須手動關閉)
(2)服務消費方:API載入配置文件
package com.bjsxt.dubbo; import com.bjsxt.dubbo.pojo.TestData; import com.bjsxt.dubbo.service.ITPService_xml; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; /** * 這裡只是簡單的測試一下,不涉及web,服務提供方也不涉及持久層 */ public class AppTest { @Test public void test(){ /*載入spring配置文件*/ ApplicationContext ac=new ClassPathXmlApplicationContext("spring-consumer.xml"); /*通過配置文件反射獲取暴露的服務介面的業務層對象*/ ITPService_xml itpService_xml = ac.getBean("iTPService", ITPService_xml.class); /*獲取服務返回值*/ List<TestData> list=itpService_xml.selectTestData(); /*輸出*/ System.out.println(list); } }
【運行結果·圖】
(二)註解式
1. 項目代碼:
(1)服務提供方:
①數據類pojo/entity:同上
②業務層service:同上
(2)服務消費方:
①數據類pojo/entity:同上
②業務層service:
i. 將服務提供方暴露的服務介面的代碼複製過來
ii. 創建調用服務介面的消費方介面,及其實現類
package com.bjsxt.dubbo.service; import com.bjsxt.dubbo.pojo.TestData; import java.util.List; public interface ITServiceConsumer_SSM { //顯示測試數據 List<TestData> show(); }
package com.bjsxt.dubbo.service.impl; import com.alibaba.dubbo.config.annotation.Reference; import com.bjsxt.dubbo.pojo.TestData; import com.bjsxt.dubbo.service.ITService_SSM; import org.springframework.stereotype.Service; import java.util.List; @Service public class ITServiceConsumerImpl_SSM implements com.bjsxt.dubbo.service.ITServiceConsumer_SSM { @Reference private ITService_SSM itService_ssm; @Override public List<TestData> show() { return itService_ssm.selecte(); } }
2. 啟動方式:
(1)服務提供方:同上
(2)服務消費方:同上
(三)對比兩種方式的不同:
1. 服務提供方
(1)配置文件:①配置文件式:
i. 需要專門配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象
ii. 不需要配置:dubbo註解掃描
②註解式:
i. 需要專門配置:dubbo註解掃描
ii. 不需要配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象
(2)註解:①配置文件式:業務層中,暴露的服務介面的實現類的註解@Service是spring框架的
②註解式:業務層中,暴露的服務介面的實現類的註解@Service是dubbo依賴的
2. 服務消費方:
(1)配置文件:①配置文件式:
i. 不需要配置:dubbo註解掃描
②註解式:
i. 需要專門配置:dubbo註解掃描
ii. 不需要配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象
(2)註解:註解式:業務層中,暴露的服務介面的實現類里:①註解實現類的@Service是dubbo依賴的②聲明服務提供方暴露的服務介面的實現類對象的屬性的註解是dubbo依賴里的@Reference
七、個人總結:
1. 配置文件:
(1)服務提供方必須有的配置參數:提供方應用名、協議、註冊中心
(2)服務消費方必須有的配置參數:消費方應用名、註冊中心
2. 配置式區別於註解式之處
(1)配置文件-服務提供方:須要具體配置每一個暴露的服務介面,以及該介面所對應的實現類bean對象;註解式則只需要配置dubbo掃描即可
(2)配置文件-服務消費方:須要配置所要調用的服務介面(提供方暴露的);註解式則須要再多配置dubbo掃描、自身調用服務介面(提供方暴露的)的實現類
(3)業務層-服務提供方:服務介面(暴露的)的實現類中,使用spring的@Service註解該實現類;註解式則須要用dubbo的@Service(com.alibaba.dubbo.config.annotation.Service;)來註解該實現類
(4)業務層-服務消費方:
①配置式的消費方,可以在啟動時(消費方的啟動方式只有API載入配置文件這一種)通過反射設直接生成被調用的服務介面的對象(多態+反射),利用該對象完成操作
②註解式的消費方,是通過自身創建的某個介面的實現類,在這個實現類裡面去調用提供方暴露的服務介面:
i.須要用dubbo的@Service(com.alibaba.dubbo.config.annotation.Service;)來註解該實現類;
ii. 這個實現類裡面需要聲明被調用的服務介面(提供方暴露的)的對象,該對象須要用dubbo的@Reference(com.alibaba.dubbo.config.annotation.Reference;)來註解
(不可以用spring的@Resource來註解)
3. 配置式相同於註解式之處:都須要將服務提供方暴露的服務介面的源文件複製到服務消費方的業務層中
4. 啟動方式:
(1)API載入xml配置文件:略(詳情見上面的示例)
(2)dubbo服務運行容器啟動:
①只限於服務提供方(因為只有服務提供方有dubbo服務運行容器,可參考Dubbo架構圖)
②須要將配置文件放置在META-INF目錄下的spring目錄中(目錄名不可以拼錯!!!否則會找不到配置文件的)
③使用dubbo的Main類(com.alibaba.dubbo.container.Main;)的main方法啟動