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