bboss rpc使用介绍

bboss 3.4及后续版本在原有的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.对其他类型容器中配置的组件的远程调用

三个主要的接口如下:
1.获取MVC容器中的服务组件调用代理

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

2.获取ApplicationContext类型容器中的服务组件调用代理

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

3.获取DefaultApplicationContext类型容器中的服务组件调用代理

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

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

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


2.获取DefaultApplicationContext类型容器中的服务组件调用代理
//服务器端容器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,多多");


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


4.http协议补充说明
服务端必须在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>


5.http协议串说明
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();


6.通过配置文件来配置客户端调用组件的实例
可以通组件工厂模式来在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容器管理创建客户端调用代理模式,这两种方式是等价的。

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


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



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



你可能感兴趣的:(rpc,bbossgroups)