spider RPC入门指南
請?jiān)L問https://git.oschina.net/zhjh256/io-spider獲取最新更新。
本部分將介紹使用spider RPC開發(fā)分布式應(yīng)用的客戶端和服務(wù)端。
? ? spider RPC中間件基于J2SE 8開發(fā),因此需要確保服務(wù)器上安裝了JDK 8及以上版本,不依賴于任何額外需要獨(dú)立安裝和配置的依賴程序。
注:spider RPC 1.0.1版本之前基于JDK 1.7開發(fā),最后改為了使用JDK ?1.8主要是出于公司內(nèi)部系統(tǒng)對接的考慮,使用了1.8新增的Parameter類,因?yàn)閮?nèi)部系統(tǒng)需要解析參數(shù)名。
spider RPC中間件的核心設(shè)計(jì)初衷是像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù),能夠靈活的在運(yùn)行時(shí)確定目標(biāo)服務(wù)在哪臺(tái)服務(wù)器,且高效的管理上百臺(tái)的大規(guī)模服務(wù)器集群。
依賴jar包引入
spider包括下列依賴包:
| com.ld.net.spider.jar 點(diǎn)擊下載 | spider核心包 | <dependency> <groupId>com.ld.net.spider</groupId> <artifactId>com.ld.net.spider</artifactId> <version>1.0.X-SNAPSHOT</version> </dependency> |
| com.ld.net.spider.ext.jar 點(diǎn)擊下載 | Spider擴(kuò)展包,比如管理、監(jiān)控spider運(yùn)行狀態(tài),與服務(wù)中心交互等等 | <dependency> <groupId>com.ld.net.spider</groupId> <artifactId>com.ld.net.spider.ext</artifactId> <version>1.0.X-SNAPSHOT</version> </dependency> |
| com.ld.net.spider.sc.client.api.jar 點(diǎn)擊下載 | 服務(wù)中心管理模式下,客戶端提供的主要管理功能接口 | <dependency> <groupId>com.ld.net.spider</groupId> <artifactId>com.ld.net.spider.sc.client.api</artifactId> <version>1.0.X-SNAPSHOT</version> </dependency> |
| com.ld.net.spider.sc.center.api.jar 點(diǎn)擊下載 | 服務(wù)中心管理模式下,服務(wù)中心端提供的主要功能接口 | <dependency> <groupId>com.ld.net.spider</groupId> <artifactId>com.ld.net.spider.sc.center.api </artifactId> <version>1.0.X-SNAPSHOT</version> </dependency> |
定義服務(wù)接口
開發(fā)spider服務(wù)的第一步是定義spider服務(wù)接口,spider服務(wù)以java interface的方式進(jìn)行定義。本示例涉及POJO定義如下:
package com.medsoft.spider.api;public class Demo {private int id;private String name;private double bonus;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;} }public class DemoReq extends SpiderBizHead {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;} }package com.medsoft.spider.api;import com.ld.net.remoting.LDParam;public class DemoResp {private int errorNo;private String errorInfo;public int getErrorNo() {return errorNo;}public void setErrorNo(int errorNo) {this.errorNo = errorNo;}public String getErrorInfo() {return errorInfo;}public void setErrorInfo(String errorInfo) {this.errorInfo = errorInfo;} }package com.medsoft.spider.api;import java.util.List; import java.util.Map;import com.ld.net.spider.meta.SpiderBizHead;public class DemoQuery extends SpiderBizHead {private Map<String,String> param;private List<Demo> result;public List<Demo> getResult() {return result;}public void setResult(List<Demo> result) {this.result = result;}public Map<String,String> getParam() {return param;}public void setParam(Map<String,String> param) {this.param = param;}public void addParam(String key,String value) {this.param.put(key, value);} }定義接口:
package com.medsoft.spider.api;import java.util.List;import com.ld.net.spider.annotation.Service; import com.ld.net.spider.annotation.ServiceModule;@ServiceModule public interface DemoDrpcpService {@Service(desc = "Drpcp修改", serviceId = "99000011")public DemoResp opDrpcpService(DemoReq req);@Service(desc = "Drpcp list查詢", serviceId = "99000012")public List<DemoResp> queryDrpcpService(DemoReq req);@Service(desc = "Drpcp分頁查詢", serviceId = "99000002")public DemoQuery queryDrpcpService1(DemoQuery req);@Service(desc = "調(diào)用其他MS", serviceId = "99000003")public String callAS(DemoQuery req); }@ ServiceModule標(biāo)識(shí)接口DemoDrpcpService為spider服務(wù)模塊,@Service定義了具體的服務(wù)。
需要注意的是,spider運(yùn)行時(shí)要求所有參數(shù)必須通過單個(gè)DTO進(jìn)行傳遞,否則在啟動(dòng)時(shí)會(huì)出錯(cuò)而終止,這更多的出于服務(wù)管理的需要而非技術(shù)的限制或性能的下降。
服務(wù)端開發(fā)
?????? spider服務(wù)的實(shí)現(xiàn)和標(biāo)準(zhǔn)的j2ee開發(fā)一樣,創(chuàng)建一個(gè)標(biāo)準(zhǔn)的java web工程,只要定義java類實(shí)現(xiàn)服務(wù)接口即可,沒有任何額外的侵入性。
package com.medsoft.spider.server;import java.util.ArrayList; import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.ld.net.base.utils.JsonUtils; import com.ld.net.spider.exception.SpiderException; import com.medsoft.spider.api.DemoDrpcpService; import com.medsoft.spider.api.DemoQuery; import com.medsoft.spider.api.DemoReq; import com.medsoft.spider.api.DemoResp; import com.medsoft.spider.other.api.OtherService;@Service public class DemoDrpcpServiceImpl implements DemoDrpcpService {@Autowiredprivate OtherService otherService;@Overridepublic DemoResp opDrpcpService(DemoReq req) {System.out.println("接收到spider調(diào)用請求: " + JsonUtils.toJson(req));return new DemoResp();}@Overridepublic DemoQuery queryDrpcpService1(DemoQuery req) {System.out.println("接收到spider調(diào)用請求: " + JsonUtils.toJson(req));return new DemoQuery();}@Overridepublic String callAS(DemoQuery req) {System.out.println("調(diào)用其他系統(tǒng)的AS");try {return otherService.doAs(req);} catch (SpiderException e) {throw e;}}@Overridepublic List<DemoResp> queryDrpcpService(DemoReq req) {List<DemoResp> list = new ArrayList<DemoResp>();DemoResp e1 = new DemoResp();DemoResp e2 = new DemoResp();list.add(e1);list.add(e2);return list;} }?
?????? 如上所示,實(shí)現(xiàn)非常簡單,沒有任何spider侵入性,故不再重復(fù)講解。
?????? 需要注意的是,上述紅色字體的OtherService,該服務(wù)為標(biāo)準(zhǔn)Spring Bean服務(wù)或者微服務(wù)MS或其它子系統(tǒng)提供的公用業(yè)務(wù)服務(wù),比如查詢賬戶信息,視具體而定。
?
客戶端開發(fā)
?????? 客戶端調(diào)用spider服務(wù)在開發(fā)上和調(diào)用標(biāo)準(zhǔn)的本地spring bean服務(wù)完全相同,創(chuàng)建一個(gè)標(biāo)準(zhǔn)的java web工程,只要設(shè)置目標(biāo)服務(wù)自動(dòng)注入就可以直接使用了,如下所示:
@Controller public class IndexAction {@Autowiredprivate DemoDrpcpService demoDrpcpService;@RequestMapping(value="/to_pnp2_cnp1.html",method=RequestMethod.GET)public @ResponseBody String indexV(Model model,HttpServletRequest request){DemoQuery req = new DemoQuery();DemoReq param = new DemoReq();req.setAppVersion("v1.1");req.setSystemId("02");req.setCompanyId("100001");param.setId(8888);param.setName("zhangsan");return JsonUtils.toJson(demoDrpcpService.queryDrpcpService1(req));} }直接通過功能號(hào)調(diào)用spider服務(wù)
? ? 除了上述通過注入接口方式調(diào)用spider服務(wù)外,spider運(yùn)行時(shí)還支持直接通過功能號(hào)的方式調(diào)用,如下所示:
DemoReq param = new DemoReq();param.setId(8888);param.setName("zhangsan");param.setCompanyId(companyId);param.setSystemId(systemId);ServiceDefinition service = ServiceDefinitionContainer.getService("99000011");try {return (DemoResp) service.getMethod().invoke(BeanManagerHelper.getBean(service.getClz()), param);} catch (IllegalAccessException | IllegalArgumentException| InvocationTargetException e) {e.printStackTrace();}? ??兩種方式的調(diào)用效果相同。
接口包與實(shí)現(xiàn)包的部署
?????? 使用Spider開發(fā)的分布式系統(tǒng)最簡單的情況下通常具有如下的部署結(jié)構(gòu):
? ? ??
?????? 在復(fù)雜的生產(chǎn)部署中,其部署結(jié)構(gòu)可能會(huì)異常復(fù)雜,如下所示:
? ? ? ?
? ? ? ?本示例中,我們以簡單的客戶端/服務(wù)端為例介紹包的部署與配置文件的設(shè)置。
?????? spider客戶端只需要放置定義服務(wù)接口的jar或class即可。
?????? spider服務(wù)端需要同時(shí)放置定義服務(wù)接口的jar或class,和服務(wù)實(shí)現(xiàn)。一般來說,這兩者都打包在jar中而非分散的class會(huì)比較合理。
?
Spider配置
?
?????? Spider包含一個(gè)配置文件,名稱為spider.xml,可以修改,具體位置可參見《spider概要設(shè)計(jì)-配置文件一節(jié)》,目前支持三種配置文件指定方式,在標(biāo)準(zhǔn)的maven工程下,建議將其放在src/main/resources下,作為標(biāo)準(zhǔn)配置文件的一部分。
客戶端spider.xml示例
?
<?xml version="1.0" encoding="UTF-8"?> <spider><nodeName value="ANB" cloud="false" role="production"serviceCenter="0.0.0.0" appVersion="" charset="GBK" /><plugins><plugin pluginId="spider.localService" serviceTimeout="10000"zlibCompress="false" encrypt="false" anonymous="true"serviceProxyPackage="com.medsoft.spider.api"><server enable="false" port="7070" reliable="false"threadCount="200" serviceExportPackage="" /></plugin><plugin pluginId="spider.channel"><cluster clusterName="CNB-1" connectionSize="1"><workNode address="127.0.0.1" port="18021" /></cluster></plugin><plugin pluginId="spider.filter"></plugin></plugins><routeItems><routeItem serviceId="99*" clusterName="CNB-1" /><!-- <routeItem serviceId="*" appVersion="" subSystemId=""systemId="" companyId="" clusterName="spider-server" /> --></routeItems> </spider>?
? ? ? ?上述配置中,紅色部分是與客戶端直接相關(guān)的配置。
服務(wù)端spider.xml示例
<?xml version="1.0" encoding="UTF-8"?> <spider><nodeName value="MSNP-1" cloud="false" role="production"serviceCenter="0.0.0.0" appVersion="" serviceDefineType="spider" needLdPackAdapter="false" charset="GBK"/><plugins><plugin pluginId="spider.localService" serviceTimeout="10000"zlibCompress="false" encrypt="false" anonymous="true"serviceProxyPackage=""><server enable="true" port="18051" reliable="false"threadCount="200" serviceExportPackage="com.medsoft.spider.api" /></plugin><plugin pluginId="spider.channel"></plugin><plugin pluginId="spider.filter"></plugin></plugins><routeItems><routeItem serviceId="*" clusterName="spider.localService" /><!-- <routeItem serviceId="*" appVersion="" subSystemId=""systemId="" companyId="" clusterName="spider-server" /> --></routeItems> </spider>? ? ? ?上述配置中,紅色部分是與客戶端直接相關(guān)的配置。
服務(wù)端配置注意事項(xiàng)
?????? spider啟動(dòng)時(shí)會(huì)進(jìn)行下列自檢操作:
? ? ? 1、在/tmp/spider/下檢查是否存在${nodeName}.pid文件,如果存在,則說明本服務(wù)器上存在同名已啟動(dòng)spider實(shí)例,不允許啟動(dòng);
? ? ? 2、運(yùn)行服務(wù)器模式時(shí),檢查本節(jié)點(diǎn)spider.xml中定義的服務(wù)器端口號(hào)是否已經(jīng)被占用,如果已經(jīng)被占用,則提示端口號(hào)已經(jīng)被占用,不允許啟動(dòng);
運(yùn)行方式
?????? 當(dāng)前版本spider支持運(yùn)行于標(biāo)準(zhǔn)java應(yīng)用程序和web容器下兩種模式,他們提供完全相同的核心服務(wù)。在運(yùn)行于標(biāo)準(zhǔn)java程序模式下時(shí),spider提供的RESTFUL管理控制臺(tái)和API將不可用。
web.xml配置
?????? 客戶端和服務(wù)端的web.xml配置要求相同,如不需要啟用web監(jiān)控,只需要包含如下即可:
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spider-base-service.xml</param-value> </context-param> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>如需啟用web監(jiān)控,則還需要包含如下:<servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spider-base-web.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>啟動(dòng)運(yùn)行
?????? 上述步驟均完成后,就可以啟動(dòng)spider服務(wù)端和客戶端進(jìn)行驗(yàn)證了。Spider服務(wù)端和客戶端的啟動(dòng)順序無關(guān)緊要,spider運(yùn)行時(shí)會(huì)每隔指定間隔自動(dòng)進(jìn)行檢測并嘗試建立斷開和尚未建立的連接。
?
總結(jié)
以上是生活随笔為你收集整理的spider RPC入门指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛B的调试工具:OzCode
- 下一篇: Nginx 多站点配置