使用Spring框架實(shí)現(xiàn)遠(yuǎn)程服務(wù)暴露與調(diào)用

一、前言

Spring框架提供了通過(guò)HTTP協(xié)議實(shí)現(xiàn)遠(yuǎn)程調(diào)用的方式,具體是調(diào)用方使用HttpInvokerProxyFactoryBean生成一個(gè)代理對(duì)象,通過(guò)代理對(duì)象遠(yuǎn)程通過(guò)http服務(wù)調(diào)用服務(wù)提供方法的服務(wù)并,服務(wù)提供方通過(guò)HttpInvokerServiceExporter在服務(wù)端暴漏遠(yuǎn)程調(diào)用接口。

二、遠(yuǎn)程服務(wù)暴露

2.1 簡(jiǎn)單使用

  • 第一步需要定義需要暴露的服務(wù)接口和實(shí)現(xiàn)
public interface UserServiceBo {
    String sayHello(String name);  
    String sayHello2(String name);  
    String testPojo(Person person);
}
public class UserServiceImpl implements UserServiceBo{

    @Override
    public String sayHello(String name) {
    
        return name; 
    }

    @Override
    public String sayHello2(String name) {
    
        return name;
    }

    @Override
    public String testPojo(Person person) {
        return JSON.toJSONString(person);
    }  
}
  • 第二步創(chuàng)建服務(wù)導(dǎo)出HttpInvokerServiceExporter的實(shí)例
    <bean id="userService" class="com.test.UserServiceImpl" />
<bean name="useServiceExporter" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
    <property name="service" ref="userService" />
    <property name="serviceInterface" value="com.test.UserServiceBo" />
</bean>
  • 第三步 暴露遠(yuǎn)程服務(wù)的URL
<bean id="simpleUrlRequestHandler"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="true" />
    <property name="urlMap">
        <map>
          <entry key="/remote/test/userService" value-ref="useServiceExporter" />
        </map>
    </property>
</bean>

注意這個(gè)bean要配置到dispatcher類(lèi)的配置文件里面。

2.2 原理

image.png

三、遠(yuǎn)程服務(wù)調(diào)用

3.1 簡(jiǎn)單使用

    HttpInvokerProxyFactoryBean factoryBean = new HttpInvokerProxyFactoryBean();
        factoryBean.setServiceUrl("http://127.0.0.1:7001/test/userService.do");
        factoryBean.setServiceInterface(UserServiceBo.class);
        factoryBean.afterPropertiesSet();
        UserServiceBo userService = (UserServiceBo) factoryBean.getObject();
        
        System.out.println(userService.sayHello("jiaduo"));
        

3.2 原理

image.png

四、總結(jié)

Spring框架提供了通過(guò)HTTP協(xié)議實(shí)現(xiàn)遠(yuǎn)程調(diào)用的方式,我們可以通過(guò)重寫(xiě)invoker自定義http請(qǐng)求header和body傳遞一些信息到服務(wù)暴露端,比如函數(shù)簽名指,序列化協(xié)議等。

通過(guò)重寫(xiě)exporter可以進(jìn)行鑒權(quán)操作,比如進(jìn)行函數(shù)簽名校驗(yàn),然后可以定制反序列化方式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評(píng)論 6 342
  • 成年之后再去看安徒生童話,帶來(lái)了更多的深思,從中能看到更多的內(nèi)涵。紅舞鞋并不是簡(jiǎn)單的告誡孩子不要有虛榮心。 可能是...
    sherlywu88閱讀 10,749評(píng)論 0 0
  • 我有個(gè)姓李的爺爺去世了,在家已經(jīng)停放了三天,今天要出山了。 還沒(méi)睡醒,就聽(tīng)到媽媽在叫我,說(shuō)什么八點(diǎn)半就要去那里吃飯...
    大啊大的閱讀 5,568評(píng)論 0 0

友情鏈接更多精彩內(nèi)容