免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
簡(jiǎn)單之美 | 基于Dubbo的Hessian協(xié)議實(shí)現(xiàn)遠(yuǎn)程調(diào)用

Dubbo基于Hessian實(shí)現(xiàn)了自己Hessian協(xié)議,可以直接通過(guò)配置的Dubbo內(nèi)置的其他協(xié)議,在服務(wù)消費(fèi)方進(jìn)行遠(yuǎn)程調(diào)用,也就是說(shuō),服務(wù)調(diào)用方需要使用Java語(yǔ)言來(lái)基于Dubbo調(diào)用提供方服務(wù),限制了服務(wù)調(diào)用方。同時(shí),使用Dubbo的Hessian協(xié)議實(shí)現(xiàn)提供方服務(wù),而調(diào)用方可以使用標(biāo)準(zhǔn)的Hessian接口來(lái)調(diào)用,原生的Hessian協(xié)議已經(jīng)支持多語(yǔ)言客戶端調(diào)用,支持語(yǔ)言如下所示:

下面,我們的思路是,先基于Dubbo封裝的Hessian協(xié)議,實(shí)現(xiàn)提供方服務(wù)和消費(fèi)方調(diào)用服務(wù),雙方必須都使用Dubbo來(lái)開(kāi)發(fā);然后,基于Dubbo封裝的Hessian協(xié)議實(shí)現(xiàn)提供方服務(wù),然后服務(wù)消費(fèi)方使用標(biāo)準(zhǔn)的Hessian接口來(lái)進(jìn)行遠(yuǎn)程調(diào)用,分別使用Java和Python語(yǔ)言來(lái)實(shí)現(xiàn)。而且,我們實(shí)現(xiàn)的提供方服務(wù)通過(guò)Tomcat發(fā)布到服務(wù)注冊(cè)中心。
首先,使用Java語(yǔ)言定義一個(gè)搜索服務(wù)的接口,代碼如下所示:

1package org.shirdrn.platform.dubbo.service.rpc.api;
2 
3public interface SolrSearchService {
4    String search(String collection, String q, String type, int start, int rows);
5}

上面接口提供了搜索遠(yuǎn)程調(diào)用功能。

基于Dubbo的Hessian協(xié)議實(shí)現(xiàn)提供方服務(wù)

提供方實(shí)現(xiàn)基于Dubbo封裝的Hessian協(xié)議,實(shí)現(xiàn)接口SolrSearchService,實(shí)現(xiàn)代碼如下所示:

01package org.shirdrn.platform.dubbo.service.rpc.server;
02 
03import java.io.IOException;
04import java.util.HashMap;
05import java.util.Map;
06 
07import org.apache.commons.logging.Log;
08import org.apache.commons.logging.LogFactory;
09import org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService;
10import org.shirdrn.platform.dubbo.service.rpc.utils.QueryPostClient;
11import org.springframework.context.support.ClassPathXmlApplicationContext;
12 
13public class SolrSearchServer implements SolrSearchService {
14 
15    private static final Log LOG = LogFactory.getLog(SolrSearchServer.class);
16    private String baseUrl;
17    private final QueryPostClient postClient;
18    private static final Map<String, FormatHandler> handlers = new HashMap<String, FormatHandler>(0);
19    static {
20        handlers.put("xml", new FormatHandler() {
21            public String format() {
22                return "&wt=xml";
23            }
24        });
25        handlers.put("json", new FormatHandler() {
26            public String format() {
27                return "&wt=json";
28            }
29        });
30    }
31 
32    public SolrSearchServer() {
33        super();
34        postClient = QueryPostClient.newIndexingClient(null);
35    }
36 
37    public void setBaseUrl(String baseUrl) {
38        this.baseUrl = baseUrl;
39    }
40 
41    public String search(String collection, String q, String type, int start, int rows) {
42        StringBuffer url = new StringBuffer();
43        url.append(baseUrl).append(collection).append("/select?").append(q);
44        url.append("&start=").append(start).append("&rows=").append(rows);
45        url.append(handlers.get(type.toLowerCase()).format());
46        LOG.info("[REQ] " + url.toString());
47        return postClient.request(url.toString());
48    }
49 
50    interface FormatHandler {
51        String format();
52    }
53}

因?yàn)榭紤]到后面要使用標(biāo)準(zhǔn)Hessian接口來(lái)調(diào)用,這里接口方法參數(shù)全部使用內(nèi)置標(biāo)準(zhǔn)類(lèi)型。然后,我們使用Dubbo的配置文件進(jìn)行配置,文件search-provider.xml的內(nèi)容如下所示:

01<?xml version="1.0" encoding="UTF-8"?>
02 
07 
08    <dubbo:application name="search-provider" />
09    <dubbo:registry
10        address=" />
11    <dubbo:protocol name="hessian" port="8080" server="servlet" />
12    <bean id="searchService"
13        class="org.shirdrn.platform.dubbo.service.rpc.server.SolrSearchServer">
14        <property name="baseUrl" value="http://nginx-lbserver/solr-cloud/" />
15    </bean>
16    <dubbo:service
17        interface="org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService"
18        ref="searchService" path="http_dubbo/search" />
19 
20</beans>

因?yàn)槭褂肨omcat發(fā)布提供方服務(wù),所以我們需要實(shí)現(xiàn)Spring的org.springframework.web.context.ContextLoader來(lái)初始化應(yīng)用上下文(基于Spring的IoC容器來(lái)管理服務(wù)對(duì)象)。實(shí)現(xiàn)類(lèi)SearchContextLoader代碼如下所示:

01package org.shirdrn.platform.dubbo.context;
02 
03import javax.servlet.ServletContextEvent;
04import javax.servlet.ServletContextListener;
05 
06import org.shirdrn.platform.dubbo.service.rpc.server.SolrSearchServer;
07import org.springframework.context.support.ClassPathXmlApplicationContext;
08import org.springframework.web.context.ContextLoader;
09 
10public class SearchContextLoader extends ContextLoader implements ServletContextListener {
11 
12    @Override
13    public void contextDestroyed(ServletContextEvent arg0) {
14        // TODO Auto-generated method stub
15 
16    }
17 
18    @Override
19    public void contextInitialized(ServletContextEvent arg0) {
20        String config = arg0.getServletContext().getInitParameter("contextConfigLocation");
21        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
22        context.start();
23    }
24 
25}

最后,配置Web應(yīng)用部署描述符文件,web.xml內(nèi)容如下所示:

01<?xml version="1.0" encoding="UTF-8"?>
02<web-app id="WebApp_ID" version="2.4"
05    <display-name>http_dubbo</display-name>
06 
07    <listener>
08        <listener-class>org.shirdrn.platform.dubbo.context.SearchContextLoader</listener-class>
09    </listener>
10    <context-param>
11        <param-name>contextConfigLocation</param-name>
12        <param-value>classpath:search-provider.xml</param-value>
13    </context-param>
14 
15    <servlet>
16        <servlet-name>search</servlet-name>
17        <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
18        <init-param>
19            <param-name>home-class</param-name>
20            <param-value>org.shirdrn.platform.dubbo.service.rpc.server.SolrSearchServer</param-value>
21        </init-param>
22        <init-param>
23            <param-name>home-api</param-name>
24            <param-value>org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService</param-value>
25        </init-param>
26        <load-on-startup>1</load-on-startup>
27    </servlet>
28    <servlet-mapping>
29        <servlet-name>search</servlet-name>
30        <url-pattern>/search</url-pattern>
31    </servlet-mapping>
32 
33    <welcome-file-list>
34        <welcome-file>index.html</welcome-file>
35        <welcome-file>index.htm</welcome-file>
36        <welcome-file>index.jsp</welcome-file>
37        <welcome-file>default.html</welcome-file>
38        <welcome-file>default.htm</welcome-file>
39        <welcome-file>default.jsp</welcome-file>
40    </welcome-file-list>
41</web-app>

啟動(dòng)Tomcat以后,就可以將提供方服務(wù)發(fā)布到服務(wù)注冊(cè)中心,這里服務(wù)注冊(cè)中心我們使用的是ZooKeeper集群,可以參考上面Dubbo配置文件search-provider.xml的配置內(nèi)容。

下面,我們通過(guò)兩種方式來(lái)調(diào)用已經(jīng)注冊(cè)到服務(wù)注冊(cè)中心的服務(wù)。

  • 基于Dubbo的Hessian協(xié)議遠(yuǎn)程調(diào)用

服務(wù)消費(fèi)方,通過(guò)Dubbo配置文件來(lái)指定注冊(cè)到注冊(cè)中心的服務(wù),配置文件search-consumer.xml的內(nèi)容,如下所示:

01<?xml version="1.0" encoding="UTF-8"?>
02 
07 
08    <dubbo:application name="search-consumer" />
09    <dubbo:registry
10        address=" />
11    <dubbo:reference id="searchService"
12        interface="org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService" />
13 
14</beans>

然后,使用Java實(shí)現(xiàn)遠(yuǎn)程調(diào)用,實(shí)現(xiàn)代碼如下所示:

01package org.shirdrn.platform.dubbo.service.rpc.client;
02 
03import java.util.concurrent.Callable;
04import java.util.concurrent.Future;
05 
06import org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService;
07import org.springframework.beans.BeansException;
08import org.springframework.context.support.AbstractXmlApplicationContext;
09import org.springframework.context.support.ClassPathXmlApplicationContext;
10 
11import com.alibaba.dubbo.rpc.RpcContext;
12 
13public class SearchConsumer {
14 
15    private final String collection;
16    private AbstractXmlApplicationContext context;
17    private SolrSearchService searchService;
18 
19    public SearchConsumer(String collection, Callable<AbstractXmlApplicationContext> call) {
20        super();
21        this.collection = collection;
22        try {
23            context = call.call();
24            context.start();
25            searchService = (SolrSearchService) context.getBean("searchService");
26        } catch (BeansException e) {
27            e.printStackTrace();
28        } catch (Exception e) {
29            e.printStackTrace();
30        }
31    }
32 
33    public Future<String> asyncCall(final String q, final String type, final int start, final int rows) {
34        Future<String> future = RpcContext.getContext().asyncCall(new Callable<String>() {
35            public String call() throws Exception {
36                return search(q, type, start, rows);
37            }
38        });
39        return future;
40    }
41 
42    public String syncCall(final String q, final String type, final int start, final int rows) {
43        return search(q, type, start, rows);
44    }
45 
46    private String search(final String q, final String type, final int start, final int rows) {
47        return searchService.search(collection, q, type, start, rows);
48    }
49 
50    public static void main(String[] args) throws Exception {
51        final String collection = "tinycollection";
52        final String beanXML = "search-consumer.xml";
53        final String config = SearchConsumer.class.getPackage().getName().replace('.', '/') + "/" + beanXML;
54        SearchConsumer consumer = new SearchConsumer(collection, new Callable<AbstractXmlApplicationContext>() {
55            public AbstractXmlApplicationContext call() throws Exception {
56                final AbstractXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
57                return context;
58            }
59        });
60 
61        String q = "q=上海&fl=*&fq=building_type:1";
62        int start = 0;
63        int rows = 10;
64        String type = "xml";
65        for (int k = 0; k < 10; k++) {
66            for (int i = 0; i < 10; i++) {
67                start = 1 * 10 * i;
68                if (i % 2 == 0) {
69                    type = "xml";
70                } else {
71                    type = "json";
72                }
73                String result = consumer.syncCall(q, type, start, rows);
74                System.out.println(result);
75                // Future<String> future = consumer.asyncCall(q, type, start,
76                // rows);
77                // System.out.println(future.get());
78            }
79        }
80    }
81 
82}

執(zhí)行該調(diào)用實(shí)現(xiàn),可以遠(yuǎn)程調(diào)用提供方發(fā)布的服務(wù)。
這種方式限制了服務(wù)調(diào)用方也必須使用Dubbo來(lái)開(kāi)發(fā)調(diào)用的代碼,也就是限制了編程的語(yǔ)言,而無(wú)論是對(duì)于內(nèi)部還是外部,各個(gè)團(tuán)隊(duì)之間必然存在語(yǔ)言的多樣性,如果限制了編程語(yǔ)言,那么開(kāi)發(fā)的服務(wù)也只能在內(nèi)部使用。

  • 基于標(biāo)準(zhǔn)Hessian協(xié)議接口的遠(yuǎn)程調(diào)用

下面,使用標(biāo)準(zhǔn)Hessian接口來(lái)實(shí)現(xiàn)遠(yuǎn)程調(diào)用,這時(shí)就不需要關(guān)心服務(wù)提供方的所使用的開(kāi)發(fā)語(yǔ)言,因?yàn)樽罱K是通過(guò)HTTP的方式來(lái)訪問(wèn)。我們需要下載Hessian對(duì)應(yīng)語(yǔ)言的調(diào)用實(shí)現(xiàn)庫(kù),才能更方便地編程。

使用Java語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程調(diào)用
使用Java語(yǔ)言實(shí)現(xiàn),代碼如下所示:

01package org.shirdrn.rpc.hessian;
02 
03import org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService;
04 
05import com.caucho.hessian.client.HessianProxyFactory;
06 
07public class HessianConsumer {
08 
09    public static void main(String[] args) throws Throwable {
10 
11        String serviceUrl = ";
12        HessianProxyFactory factory = new HessianProxyFactory();
13 
14        SolrSearchService searchService = (SolrSearchService) factory.create(SolrSearchService.class, serviceUrl);
15 
16        String q = "q=上海&fl=*&fq=building_type:1";
17        String collection = "tinycollection";
18        int start = 0;
19        int rows = 10;
20        String type = "xml";
21        String result = searchService.search(collection, q, type, start, rows);
22        System.out.println(result);
23    }
24}

我們只需要知道提供服務(wù)暴露的URL和服務(wù)接口即可,這里URL為http://10.95.3.74:8080/http_dubbo/search,接口為org.shirdrn.platform.dubbo.service.rpc.api.SolrSearchService。運(yùn)行上面程序,可以調(diào)用提供方發(fā)布的服務(wù)。

使用Python語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程調(diào)用
使用Python客戶端來(lái)進(jìn)行遠(yuǎn)程調(diào)用,我們可以從https://github.com/bgilmore/mustaine下載,然后安裝Hessian的代理客戶端Python實(shí)現(xiàn)庫(kù):

2cd mustaine
3sudo python setup.py install

然后就可以使用了,使用Python進(jìn)行遠(yuǎn)程調(diào)用的實(shí)現(xiàn)代碼如下所示:

01#!/usr/bin/python
02 
03# coding=utf-8
04from mustaine.client import HessianProxy
05 
06serviceUrl = '
07q = 'q=*:*&fl=*&fq=building_type:1'
08start = 0
09rows = 10
10resType = 'xml'
11collection = 'tinycollection'
12 
13if __name__ == '__main__':
14     proxy = HessianProxy(serviceUrl)
15     result = proxy.search(collection, q, resType, start, rows)
16     print result

運(yùn)行上面程序,就可以看到遠(yuǎn)程調(diào)用的結(jié)果。

參考鏈接

本文基于署名-非商業(yè)性使用-相同方式共享 4.0許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名時(shí)延軍(包含鏈接),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問(wèn),請(qǐng)與我聯(lián)系。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
簡(jiǎn)單之美 | Dubbo實(shí)現(xiàn)RPC調(diào)用使用入門(mén)
Dubbo和Zookeeper
基于Dubbo框架構(gòu)建分布式服務(wù)
Dubbox:來(lái)自當(dāng)當(dāng)網(wǎng)的SOA服務(wù)框架
基于dubbo框架下的RPC通訊協(xié)議性能測(cè)試
【剖析 | SOFARPC 框架】系列之 SOFARPC 泛化調(diào)用實(shí)現(xiàn)剖析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服