- 浏览: 577562 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yeruby:
请教下,这个命令会将kube-scheduler的所有日志输出 ...
二、master的安装 -
107x:
不错,谢谢!
kerberos安装配置 -
yhq1212:
如何禁止NGINX先本地缓存呢
nginx upload在java中的应用 -
lcy651:
写的很好、学习了
Nginx的安装 -
huangyunbin:
楼主现在是做运维了吗
mysql的安装,CXXFLAGS
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
评论
框架是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
以及使用的配置文件
服务端的配置文件名,约定为:sipgroup-admin.properties
客户端的配置文件名,约定为:sipgroup-client.properties
<p style="text-align: left;"><strong>一、服务端的使用</strong></p>
<p style="text-align: left;">1.将接口com.sohu.sip.group.GroupBus进行初始化,对应的实现类为com.sohu.sip.group.impl.GroupBusImpl</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">2.初始化时,调用<span style="font-size: 10pt;">init()</span>方法。销毁时,调用<span style="font-size: 10pt;">destroy()</span>方法。</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">3.如果使用spring,则只需要在配置中添加</p>
<pre name="code" class="java"><bean id="groupBus" class="com.sohu.sip.group.impl.GroupBusImpl"
init-method="init" destroy-method="destroy">
</bean></pre>
<p style="text-align: left;"> </p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">4.服务端可以直接调用GroupBus接口的方法,通知组内所有成员。</p>
<pre name="code" class="java">void flushEntry(String region, String key);
void flushGroup(String region, String key);</pre>
<p> </p>
<p>5.在classpath下添加配置文件sipgroup-admin.properties</p>
<pre name="code" class="java">cache.cluster.multicast.ip=230.12.21.132
cache.cluster.bus.name=AdsenderCacheBus</pre>
<p> </p>
<p><strong><span><span>二、客户端的使用</span></span></strong></p>
<p>1.需要接受失效通知的实现类,继承接口com.sohu.sip.group.GroupBusListener</p>
<pre name="code" class="java">public class MyManagerImpl implements MyManager,GroupBusListener{
...
}</pre>
<p> </p>
<p>2.对接口的两个方法进行实现。即接受到消息时,需要进行的操作。</p>
<pre name="code" class="java">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 + ")");
}
}</pre>
<p> </p>
<p>3.和服务端一样,将接口com.sohu.sip.group.GroupBus进行初始化,对应的实现类为com.sohu.sip.group.impl.GroupBusImpl</p>
<p> </p>
<p>4.初始化时,调用<span style="font-size: 10pt;">init()</span>方法。销毁时,调用<span style="font-size: 10pt;">destroy()</span>方法。</p>
<p> </p>
<p>5.添加对应的相应列表listenerMap,</p>
<p> <strong>key</strong>为服务端调用时,使用的region</p>
<p> <strong>value</strong>为客户端对应的接口,即实现了GroupBusListener的类</p>
<p> 因为客户端,可能会有多个继承了GroupBusListener的类,而服务端调用失效通知时,应该客户端只有一个类的实现被调用才是正确的。所以通过listenerMap的对应关系,可以准确的定位到需要调用的实现类。</p>
<p> </p>
<p>6.在classpath下添加配置文件sipgroup-client.properties</p>
<pre name="code" class="java">cache.cluster.multicast.ip=230.12.21.132
cache.cluster.bus.name=AdsenderCacheBus</pre>
发表评论
-
jvm参数
2013-10-30 20:17 1270在许多应用中,由于jvm内存太小,不足以支持应用. jvm的内 ... -
代码规范
2012-05-11 10:31 1348一直以来,很多同学都在思考和问我: 代码该如果规范? 怎么来优 ... -
java公共工具包
2012-05-10 15:07 1274前人栽树,后人乘凉 结合多年的开发经验,汇集了许多同学的智慧 ... -
nginx upload在java中的应用
2011-01-05 14:00 106751.Nginx上传介绍 文件在POST上传到ngin ... -
Struts2/XWork < 2.2.0 Remote Command Execution Vulnerability 临时解决方法
2010-07-15 16:49 2791\u0023这种做为参数名应该出现几率不高 ... -
答复: 高负载系统,网络参数调整
2010-04-08 09:33 1223测试后发现,修改前后,没有太大的变化! 1.TCP ... -
答复: 基于jgroup封装,方便rpc调用,失效通知
2010-04-01 19:21 1264失效通知 一、服务端的使用 1.将接口com.so ... -
GC OutOfMemoryError
2009-07-29 09:39 1117The parallel collector will thr ... -
commons-collections-3.2的bug
2009-07-24 15:34 1574使用commons-collections-3.2的LRUMa ... -
关于jgroups在resin3.1以上版本的应用
2008-10-25 16:49 1715基于jgroups的程序,在resin3.0.X环境中一切正常 ... -
使用appfuse2.0快速搭建环境(myeclipse)
2008-02-04 16:53 4134通常我们使用APPFUSE2.0的项目,导入eclipse里, ...
相关推荐
**JGroup学习总结** JGroup是一个开源的Java框架,专门用于构建高可用、容错的分布式系统。它提供了一整套服务,包括组成员管理、消息传递、故障检测和恢复等,是许多分布式应用和中间件的基础。这篇博客将深入探讨...
EHCAHCE基于JGROUP的集群配置方案,内含相关配置文件,及配置说明
JGroup是Java编程语言中的一款强大且灵活的集群通信库,专为构建高可用性、高性能的分布式系统而设计。它的核心目标是提供可靠的消息传递,确保数据在多个节点之间的一致性和完整性。本实例将深入讲解如何使用JGroup...
它们包括消息分发器、RPC分发器等。 - **协议栈(The Protocol Stack)**:JGroups使用一个可扩展的协议栈模型来处理消息传递。该协议栈允许开发人员根据需要添加、移除或替换协议层,从而实现对网络行为的精细控制。 ...
Reliable group communication with JGroups 3.x Preface This is the JGroups manual. It provides information about: 1. Installation and configuration 2. Using JGroups (the API) 3. Configuration of the ...
根据提供的文档内容,本文将对“jgroup代码”的安装步骤及如何编写一个简单的应用进行详细的阐述与解析。 ### 一、jgroup代码简介 JGroups是一个高性能、可扩展且易于使用的分布式通信库,用于实现集群中的节点...
这时应该将更新操作封装到一个 Runnable 中,并通过 `Display.syncExec()` 方法来执行,而不是直接调用界面更新方法。这样就可以避免线程同步问题。 #### 五、代码示例分析 在给出的部分代码中,可以看到 `IMTest4...
根据提供的信息,《jgroup in action》是一本关于JGroups工具包的书籍,它详细介绍了如何使用JGroups进行可靠的多播通信。JGroups是强大的UUP(User-level UDP)开源组件,已被JBoss采用,用于底层通信。下面我们将...
JGroup 是一个强大的开源库,专门用于构建集群通信系统。它的主要目标是在集群内部实现可靠的消息传递,确保数据的一致性和高可用性。与 Java Message Service (JMS) 不同,JGroup 更专注于消息传递,而不是队列和...
在IT行业中,JBoss、JDBC、JSON和JGroup是四个关键的概念,它们在不同的领域发挥着重要作用。这里,我们将深入探讨这些技术及其在实际应用中的相关知识点。 首先,JBoss是一个开源的应用服务器,它是Java EE(企业...
《JGroup-3.0.1:构建高效集群通信的核心技术》 JGroup是一个开源的Java框架,专门用于构建高可用、高性能的集群系统。它提供了健壮的组通信服务,包括成员资格管理、消息传递、故障检测以及一致性算法等。在版本...
《JGroup配置详解》 JGroup是一个开源的Java框架,专门用于构建可靠的消息传递系统,尤其是在分布式计算环境中。本文将深入解析JGroup的协议栈配置,重点探讨传输协议和可靠消息传递机制。 **4.1 传输协议** 传输...
- **事件通知**:一旦消息被验证和处理,JGROUPS会触发一个事件,通知应用层有新消息到达。 3. 消息接收: 应用层通过监听`Channel`上的事件来接收消息。当消息被处理并准备好交付时,`Channel`会触发一个回调,...
在软件开发领域,JGroup是一个关键的组件,用于构建可靠的消息传递和组通信系统。JGroup的核心在于其协议栈,它由一系列的协议层组成,这些协议层共同负责消息的发送、接收、可靠传输以及组成员发现。本文将详细解析...
JGroup可以基于TCP协议来实现消息广播,也可以通过UDP方式来广播消息,利弊不言而喻,TCP可靠,但是代价大,性能没有UDP来的好,UDP速度快,代价小,但是消息的丢失率以及无序性有着很大的限制。但是JGroup在UDP方式...
本文将深入探讨基于JGROUPS的Ehcache实现的分布式缓存复制,这是一种在Java应用中广泛使用的缓存解决方案。 首先,Ehcache是一个开源的、高性能的Java缓存库,提供本地缓存以及分布式缓存功能。它支持多种缓存策略...
5. **Socket通信**:基于Tcp或Udp,可选择同步或异步调用,序列化和带宽成本需要注意。 6. **特殊的内存分配机制**:最大存储对象1MB,采用预分配空间并按需细分,类似酒窖的比喻,便于回收和再分配。 7. **简单的...
它基于IP多播(也支持TCP),但是有一些特殊功能,例如可靠性和组成员身份。 在这个项目中,我通过使用JGroups作为消息传递工具实现了分布式(复制)堆栈和集合。 这些复制的数据结构将使用状态转移来处理新成员...
- **Memcached**:不支持数据冗余备份,当存储数据的节点出现故障时,数据会丢失,存在单点失效问题。 - **JBossCache**:虽然支持两种冗余策略——全局复制策略和BuddyReplication策略,但在大数据量情况下全局复制...