bboss rpc使用介绍

[url=https://github.com/bbossgroups/bboss]bboss 3.4[/url]及后续版本在原有的rpc功能基础上做了非常大的改进,支持丰富的协议簇(http/netty/mina/jms/webservice/rmi/jgroups/restful)。bboss rpc客户端可以类似于webservice和rmi的客户端方式对bboss ioc容器、mvc容器中配置的任何组件发起远程调用。为了支撑这个功能,3.4版中新增了组件:
org.frameworkset.spi.ClientProxyContext

该组件提供了以下能力而在本地无需服务组件的实现类和配置文件,只需接口以及接口依赖的相关的类即可:
1.对mvc容器中配置的组件的远程调用
2.对其他类型容器中配置的组件的远程调用

三个主要的接口如下:
[size=medium][b]1.获取MVC容器中的服务组件调用代理[/b][/size]

/**
* 获取MVC容器中的服务组件调用代理
* @param <T> 泛型类型
* @param name 服务组件访问地址
* @param type 组件接口类型,使用泛型来实现接口的自动类型转换
* @return 服务组件调用代理
*/
public static <T> T getWebMVCClientBean(String name,Class<T> type)

[size=medium][b]2.获取ApplicationContext类型容器中的服务组件调用代理[/b][/size]

/**
* 获取ApplicationContext类型容器中的服务组件调用代理
* @param <T> 泛型类型
* @param context 容器标识,一般是容器初始化的配置文件路径
* @param name 服务组件访问地址
* @param type 组件接口类型,使用泛型来实现接口的自动类型转换
* @return 服务组件调用代理
*/
public static <T> T getApplicationClientBean(String context,String name,Class<T> type)

[size=medium][b]3.获取DefaultApplicationContext类型容器中的服务组件调用代理[/b][/size]

/**
* 获取DefaultApplicationContext类型容器中的服务组件调用代理
* @param <T> 泛型类型
* @param context 容器标识,一般是容器初始化的配置文件路径
* @param name 服务组件访问地址
* @param type 组件接口类型,使用泛型来实现接口的自动类型转换
* @return 服务组件调用代理
*/
public static <T> T getSimpleClientBean(String context,String name,Class<T> type)

每种接口的使用实例如下,全部基于http协议实现:

[size=medium][b]1.获取mvc容器中组件的远程服务调用接口,mvc容器由服务端mvc框架自动初始化[/b][/size]
ClientInf mvcinf = ClientProxyContext.getWebMVCClientBean(
"(http::localhost:8080/bboss-mvc/http.rpc)" +
"/client.proxy.demo?user=admin&password=123456",
ClientInf.class);
mvcinf.helloworld("aaaa,多多");


[size=medium][b]2.获取DefaultApplicationContext类型容器中的服务组件调用代理[/b][/size]
//服务器端容器org/frameworkset/spi/ws/webserivce-modules.xml必须是以下方式创建
// DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/ws/webserivce-modules.xml");
ClientInf simpleinf = ClientProxyContext.getSimpleClientBean("org/frameworkset/spi/ws/webserivce-modules.xml",//容器标识
"(http::localhost:8080/bboss-mvc/http.rpc)/client.proxy.simpledemo?user=admin&password=123456",//服务组件地址
ClientInf.class);//服务接口
simpleinf.helloworld("aaaa,多多");


[size=medium][b]3.获取服务器端默认容器中组件的远程服务调用接口[/b][/size]
ClientInf defaultinf = ClientProxyContext.getApplicationClientBean( "(http::localhost:8080/bboss-mvc/http.rpc)" +
"/client.proxy.simpledemo?user=admin&password=123456", ClientInf.class);
defaultinf.helloworld("aaaa,多多");


[size=medium][b]4.http协议补充说明[/b][/size]
服务端必须在web.xml文件中配置以下servlet
<servlet>
<display-name>RPCHttpServLet</display-name>
<servlet-name>RPCHttpServLet</servlet-name>
<servlet-class>org.frameworkset.spi.remote.http.RPCHttpServLet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RPCHttpServLet</servlet-name>
<url-pattern>*.rpc</url-pattern>
</servlet-mapping>


[size=medium][b]5.http协议串说明[/b][/size]
http::localhost:8080/bboss-mvc/http.rpc
协议部分 ip部分 port部分 应用上下文 匹配rpcservlet串
我们用()将上面的url串括起来,然后再添加服务端组件标识和认证参数user和password:
/client.proxy.simpledemo?user=admin&password=123456
client.proxy.simpledemo为服务端组件,?user=admin&password=123456中的user参数就是认证账户,password参数就是认证口令,如果服务开启了认证机制,就需要在客户端设置这两个参数,反之无需配置。

我们可以在服务组件方法中通过org.frameworkset.spi.security.SecurityContext获取客户端传递过来的账户信息,静态方法:
SecurityContext securityContext = SecurityContext.getSecurityContext();
String user = securityContext.getUser();
String password = securityContext.getPassword();


[size=medium][b]6.通过配置文件来配置客户端调用组件的实例[/b][/size]
可以通组件工厂模式来在aop配置文件中配置一个客户端代理组件,我们这里是以http协议为列,从mvc容器中获取服务client.proxy.demo的客户端调用实例。

先看配置文件:
org/frameworkset/spi/remote/clientproxy/consumer.xml
consumer.xml文件的内容如下:
<properties>
<property name="clientservice" factory-class="org.frameworkset.spi.ClientProxyContext" factory-method="getWebMVCClientBean">
<construction>
<property name="servicaddress" value="(http::localhost:8080/bboss-mvc/http.rpc)/client.proxy.demo?user=admin&password=123456"/>
<property name="serviceclass" value="org.frameworkset.spi.remote.clientproxy.ClientInf"/>
</construction>
</property>
</properties>


consumer.xm中配置了名称为clientservice的组件,该组件实例通过代理类org.frameworkset.spi.ClientProxyContext的静态方法getWebMVCClientBean来创建,通过构造器construction指定了getWebMVCClientBean方法需要的两个参数:
参数一 服务地址信息
(http::localhost:8080/bboss-mvc/http.rpc)/client.proxy.demo?user=admin&password=123456
参数二 服务接口类信息
org.frameworkset.spi.remote.clientproxy.ClientInf

这样我们就可以加载consumer.xml文件创建一个DefaultApplicationContext类型的容器,然后获取到组件的客户端调用实例,代码如下:

//定义容器对象
DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/remote/clientproxy/consumer.xml");
//获取客户端组件实例
ClientInf client = context.getTBeanObject("clientservice", ClientInf.class);
//发起远程方法调用
client.helloworld("aaa");


通过这种方式,我们就可以把之前通过代码调用ClientProxyContext创建客户端代理转换为通过aop容器管理创建客户端调用代理模式,这两种方式是等价的。

[size=large][b]服务配置:[/b][/size]
<property name="mysfirstwsservice" 	enablerpc="true" class="org.frameworkset.web.ws.WSServiceImpl"/>


[b][color=blue][size=large]理论上bboss ioc容器中配置的组件都可以作为远程服务调用,但是必须通过enablerpc属性开启为远程服务,对应的业务组件才能作为远程服务发布,
enablerpc="true" 开启
enablerpc="false" 禁用[/size][/color][/b]


[size=medium][b]7.总结[/b][/size]
本文介绍了通过ClientProxyContext来获取bboss中三种不同类型容器(mvc容器、独立容器、默认容器)中配置的组件客户端调用代理的方法,并以http协议为列介绍了使用方法;介绍了客户端如何传递认证信息的方法;介绍了协议串的配置方法和含义;同时也对比了通过代码直接创建代理和通过aop配置文件创建代理的两种方式,实际情况可以任意选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值