一、前言
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),然后可以定制反序列化方式。