RPC是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。java
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的調用次數和調用時間的監控中心。算法
調用流程
0.服務容器負責啓動,加載,運行服務提供者。
1.服務提供者在啓動時,向註冊中心註冊本身提供的服務。
2.服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
3.註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
5.服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心spring
經過將服務統一管理起來,能夠有效地優化內部應用對服務發佈/使用的流程和管理。服務註冊中心能夠經過特定協議來完成服務對外的統一。這就是分佈式服務註冊中心的由來。api
接下來咱們就是基於Dubbo+Zookeeper+Spring的方式來作一個關於分佈式部署的練習,相信經過這個例子你們就能夠大體理解Dubbo+Zookeeper的執行流程。服務器
具體安裝過程能夠進入如下網址,一步一步跟着提示操做就能夠完成Zookeeper的安裝:
http://blog.csdn.net/tlk20071...
安裝完成後,進入到bin目錄,而且啓動zkServer.cmd,這個腳本中會啓動一個java進程:成功之後會啓動一個DOS界面,以下圖所示:
網絡
編寫代碼實現功能
【1】在模塊dubbo-api中建立一個名爲com.alibaba.dubbo.demo的包,在包下建立一個名爲DemoService的接口,該接口下的代碼以下:架構
package com.alibaba.dubbo.demo;
import java.util.List;app
public interface DemoService {負載均衡
List<String> getPermissions(Long id);
}框架
【2】在模塊dubbo-provider中建立一個名爲com.alibaba.dubbo.demo.impl的包,在該包下新建一個名爲DemoServiceImpl並實現DemoService接口,該類代碼以下:
package com.alibaba.dubbo.demo.impl;
import com.alibaba.dubbo.demo.DemoService;
import java.util.ArrayList;
import java.util.List;
public class DemoServiceImpl implements DemoService {
public List<String> getPermissions(Long id) { List<String> demo = new ArrayList<String>(); demo.add(String.format("Permission_%d", id - 1)); demo.add(String.format("Permission_%d", id)); demo.add(String.format("Permission_%d", id + 1)); return demo; }
}
【3】添加spring配置文件名爲provider.xml(位於src目錄下),配置文件具體內容以下:
<?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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--定義了提供方應用信息,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/> <!--使用 zookeeper 註冊中心暴露服務,注意要先開啓 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 協議實現定義好的 api.PermissionService 接口--> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" /> <!--具體實現該接口的 bean--> <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>
</beans>
【4】編寫服務提供方啓動類,具體代碼以下:
package com.alibaba.dubbo.demo.impl;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class Provider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
System.out.println(context.getDisplayName() + ": here"); context.start(); System.out.println("服務已經啓動..."); System.in.read(); } }
【5】完成服務消費者所需功能
在demo-consumer模塊中建立名爲com.alibaba.dubbo.consumer的包並在該包下建立一個名爲Consumer,器具體代碼以下: package com.alibaba.dubbo.consumer; import com.alibaba.dubbo.demo.DemoService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) { //測試常規服務
ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("consumer.xml");
context.start(); System.out.println("consumer start"); DemoService demoService = context.getBean(DemoService.class); System.out.println("consumer"); System.out.println(demoService.getPermissions(1L)); } }
【6】配置服務消費者的配置文件
在demo-consumer模塊中建立一個名爲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://code.alibabatech.com/schema/dubbo" 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="demotest-consumer" owner="programmer" organization="dubbox"/> <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 協議調用定義好的 api.PermissionService 接口--> <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/> </beans>
【1】首先啓動Zookeeper安裝目錄中bin文件夾下的名爲zkServer的Windows腳本文件
【2】啓動服務端,即啓動服務端啓動類的main方法
【3】啓動客戶端,即啓動服務消費者端的main方法
注意事項:
項目資料下載連接(注:附Zookeeper的安裝文件):
連接:https://pan.baidu.com/s/120eC... 密碼:wllg