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