精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-01
最后修改:2010-04-01
jgroup的优势、劣势,我这里就不想做过多的讨论了。 如果你使用jgroup,不妨看看我对其进行的简单封装, 之前也没做做过什么开源的项目,做为一次尝试吧,最终还是决定拿出来和大家一起分享,欢迎拍砖。
SIP-GROUP是基于jgroup的封装 使用rpc调用: 服务端规定客户端调用的接口,客户端就可以直接调用该接口,不用关心内部的实现,就像调用本地的接口一样的方便。 失效通知: 服务端不需要额外的编码,直接调用groupBus.flushEntry(String region, String key),客户端就能接受到相应的消息
源代码地址:https://code.google.com/p/sip-group/
下面我们来具体谈一下使用方法: rpc调用 一.服务端的使用 1.首先定义存根,即供客户端远程调用的接口(interface) public interface CacheManager{ String say(String word); } 2.对该存根进行实现,和实现普通的接口没有区别。 public class CacheRPCServerImpl implements CacheManager{ public String say(String word){ return "hello "+word; } .... } 3.修改存根的实现类,继承com.sohu.sip.group.impl.AbstractCacheRPCServer public class CacheRPCServerImpl extends AbstractCacheRPCServer implements CacheManager{ ...... }
4.在服务端启动时,初始化,并调用init()方法。销毁时,调用destroy()方法
5.如果使用spring,则只需要在配置中添加 <bean id="cacheRPCServer" class="com.sohu.sip.adsender.service.impl.CacheRPCServerImpl" init-method="init" destroy-method="destroy"> </bean>
6.在classpath下添加配置文件sipgroup-admin.properties #server max thread count scheduler.max.threads=500 #服务端最大的进程数 #rpc cache.rpc.multicast.ip=230.12.21.132 #组播地址(服务端客户端保持一致) cache.rpc.server.port=10020 #服务端对外提供rpc服务的端口 cache.rpc.group.name=AdsenderRPCGroup #服务名称(服务端客户端保持一致)
二、客户端的使用 1.将服务端的存根(interface),保存到本地。 如:interface CacheManager
2.使用工厂模式初始化存根
ClientProxyFactory factory =new ClientProxyFactory(); CacheManager remotecacheManager = (CacheManager)factory.getObject("com.sohu.sip.adsender.group.CacheManager");
3.如果使用spring,则只需要在配置中添加 <bean id="remoteFactory" class="com.sohu.sip.group.client.ClientProxyFactory" abstract="false" lazy-init="default" autowire="default" dependency-check="default"> </bean> <bean id="remoteCacheManager" factory-bean="remoteFactory" factory-method="getObject"> <constructor-arg> <value>com.sohu.tech.vote.group.CacheManager</value> </constructor-arg> </bean> 4.在classpath下添加配置文件sipgroup-client.properties #rpc cache.rpc.multicast.ip=230.12.21.132 #保持与服务端一致 cache.rpc.timeout=10000 #超时设置 cache.rpc.server.port=10020 #服务端提供的端口 cache.rpc.server.ip=192.168.0.100 #服务端的ip cache.rpc.group.name=AdsenderRPCGroup #保持与服务端一致
5.客户端可以直接调用生产出来的remoteCacheManager,
6.测试,客户端调用 String str= remoteCacheManager.say("world") 返回的str为 hello world
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-01
最后修改:2010-04-01
失效通知 一、服务端的使用 1.将接口com.sohu.sip.group.GroupBus进行初始化,对应的实现类为com.sohu.sip.group.impl.GroupBusImpl
2.初始化时,调用init()方法。销毁时,调用destroy()方法。
3.如果使用spring,则只需要在配置中添加 <bean id="groupBus" class="com.sohu.sip.group.impl.GroupBusImpl" init-method="init" destroy-method="destroy"> </bean>
4.服务端可以直接调用GroupBus接口的方法,通知组内所有成员。 void flushEntry(String region, String key); void flushGroup(String region, String key);
5.在classpath下添加配置文件sipgroup-admin.properties cache.cluster.multicast.ip=230.12.21.132 cache.cluster.bus.name=AdsenderCacheBus
二、客户端的使用 1.需要接受失效通知的实现类,继承接口com.sohu.sip.group.GroupBusListener public class MyManagerImpl implements MyManager,GroupBusListener{ ... }
2.对接口的两个方法进行实现。即接受到消息时,需要进行的操作。 public void flushEntry(String region, String key) { if (log.isDebugEnabled()) { log.debug("flushEntry(region = " + region + ", key = " + key + ")"); } } public void flushGroup(String region, String groupKey) { if (log.isDebugEnabled()) { log.debug("flushGroup(region = " + region + ", groupKey = " + groupKey + ")"); } }
3.和服务端一样,将接口com.sohu.sip.group.GroupBus进行初始化,对应的实现类为com.sohu.sip.group.impl.GroupBusImpl
4.初始化时,调用init()方法。销毁时,调用destroy()方法。
5.添加对应的相应列表listenerMap, key为服务端调用时,使用的region value为客户端对应的接口,即实现了GroupBusListener的类 因为客户端,可能会有多个继承了GroupBusListener的类,而服务端调用失效通知时,应该客户端只有一个类的实现被调用才是正确的。所以通过listenerMap的对应关系,可以准确的定位到需要调用的实现类。
6.在classpath下添加配置文件sipgroup-client.properties cache.cluster.multicast.ip=230.12.21.132 cache.cluster.bus.name=AdsenderCacheBus |
|
返回顶楼 | |
发表时间:2010-04-01
编译后生成的jar
以及使用的配置文件 服务端的配置文件名,约定为:sipgroup-admin.properties 客户端的配置文件名,约定为:sipgroup-client.properties |
|
返回顶楼 | |
发表时间:2010-04-03
最后修改:2010-04-03
bbossgroups RPC 是基于bbossaop的轻量级rpc框架,感兴趣的朋友可以用一用。bbossgroups提供的RPC
框架是bboss aop子项目中一个子模块,具有以下特点: 1.支持多种通讯协议jms,jgroups,mina,webservice,restful,并且协议可扩展 2.提供强有力的安全管理插件(可插拔的认证、鉴权、数据包加/解密插件),保证远程通讯安全可靠。 3.开发部署模式简便,打破传统的RPC开发模式,你只需启动aop框架中提供的各种协议之一(例如jms, jgroups,mina,webservice)或者同时启动几种协议,你就可以对aop框架中管理的任何组件发起远程方 法调用,唯一的前提是你的方法参数和返回结果必须是实现java.io.Serializable接口。同时你可以通过 rpc框架的各种安全管理插件来保护你开放的远程组件服务。 4.远程方法调用方式简单,你只需要按照以下格式即可发起一个远程方法调用 带认证信息格式: (protocol::uri)/serviceid?user=userAccount&password=userPassword; 不带认证信息格式: (protocol::uri)/serviceid; protocol:远程通讯协议 uri:服务器地址 serviceid:部署在aop框架中的组件服务标识 例如: (mina::172.16.17.216:12347)/test.security.bean?user=admin&password=123456,其中的账号为admin,密码为123456 @Test public void testMinaSecurityBean() { BussinessBeanInf beaninf = (BussinessBeanInf)BaseSPIManager.getBeanObject("(mina::172.16.17.216:12347)/test.security.bean?user=admin&password=123456"); System.out.println("testMinaSecurityBean beaninf.getCount():"+beaninf.getCount()); System.out.println("testMinaSecurityBean beaninf.printMessage(message):"+beaninf.printMessage("test.security.bean")); } @Test public void testJmsSecurityBean() { BussinessBeanInf beaninf = (BussinessBeanInf)BaseSPIManager.getBeanObject("(jms::yinbiaoping-jms)/test.security.bean?user=admin&password=123456"); System.out.println("testJmsSecurityBean beaninf.getCount():"+beaninf.getCount()); System.out.println("testJmsSecurityBean beaninf.printMessage(message):"+beaninf.printMessage("test.security.bean")); } @Test public void testJGroupSecurityBean() { BussinessBeanInf beaninf = (BussinessBeanInf)BaseSPIManager.getBeanObject("(jgroup::172.16.17.216:1186)/test.security.bean?user=admin&password=123456"); System.out.println("testJGroupSecurityBean beaninf.getCount():"+beaninf.getCount()); System.out.println("testJGroupSecurityBean beaninf.printMessage(message):"+beaninf.printMessage("test.security.bean")); } @Test public void testWebServiceSecurityBean() { BussinessBeanInf beaninf = (BussinessBeanInf)BaseSPIManager.getBeanObject("(webservice::http://172.16.17.216:8080/WebRoot/cxfservices)/test.security.bean?user=admin&password=123456"); System.out.println("testJGroupSecurityBean beaninf.getCount():"+beaninf.getCount()); System.out.println("testJGroupSecurityBean beaninf.printMessage(message):"+beaninf.printMessage("test.security.bean")); } 5.安全管理机制可以方便地启用和关闭 6.远程方法调用过程可自动调优,即自动区分远程目标地址是本地地址还是远程地址,判别rpc调用是远 程方法调用还是当做本地方法调用 7.可以简单地实现单点服务调用和多播服务调用,如果是多播服务调用,rpc框架提供了获取不同服务器 返回结果的相应接口,简单实用 8.bbossgroups rpc服务框架提供远程服务通讯的质量保障,例如故障重连,访问超时等等 9.bbossgroups rpc应用场景广泛,可以用于普通的rpc服务调用场景,也可以用作集群环境中各节点应用 之间通讯工具,因为你可以轻易地发布你的应用的远程组件,轻易地发起远程方法调用(只是获取组件实 例的方法不同,方法调用和普通的对象方法调用一样) 10.rpc框架充分集成并吸纳了各种通讯协议本身的优点(jms,webservice,jgroup,mina)。 11.通过restful风格的协议,可以方便地实现rpc服务的路由功能 目前提供的大致功能就这些了,有什么考虑不周或者不正确的地方还请大家批评指正,一起交流学习,更 详细的情况介绍请访问我的博客http://blog.csdn.net/yin_bp。 bbossgroups项目发布的版本是1.0,将在1.0rc版本中增加对jboss netty协议框架的支持,呵呵 。 bbossgroups rpc框架包含在子项目bboss aop框架中,下载地址: http://sourceforge.net/projects/bboss/files/bbossgroups-1.0/bbossaop.zip/download 文档下载地址: http://sourceforge.net/projects/bboss/files/bbossgroups-1.0/bbossgroups%20document.zip/download |
|
返回顶楼 | |
发表时间:2011-02-21
我怎么搞不通
|
|
返回顶楼 | |
浏览 3581 次