在Weblogic集群中创建Singleton Service

Weblogic提供了很方便的集群能力,支持Loadbalance, HA等功能. 在Weblogic集群环境下,我们部署的应用一般来说是部署在所有节点同时工作的, 每个节点上都用相同的应用实例. 但有时我们可能需要类似java里单例模式的功能, 即某个应用只在一个节点上启动, 为整个cluster提供全局唯一的服务. 例如我们一个全局的计数器用来统计集群访问量. 如果每个节点上都有一个计数器部署运行,则我们还需要最后合并统计数据才能得到准确的数据. 而使用Weblogic Singleton Service则可以解决这个问题.  Weblogic Singleton Service保证在同一时间内只会在集群内的一个节点上工作; 与此同时一个更重要的特性就是支持Migration,即当其所在节点出现问题的情况下自动或手动迁移到其他的节点. 这样避免了单点故障, 和集群中其他应用一样提供了容错能力.

1, 代码实现

实现Weblogic Singleton Service很简单.
首先实现weblogic.cluster.singleton.SingletonService接口
接口也很简单,只有两个方法定义:

package weblogic.cluster.singleton;
public interface SingletonService{ 
 void activate(); // Activate the service in this server. 
 void deactivate(); //Deactivate the service on this server.
}

 

这两个相当于是Singleton Service的Lifecycle方法.

下面一个简单实现的例子:
public class MySingletionService implements SingletonService { 
private Context ctx; 

public void activate(){ 
   //在cluster-wider JNDI tree上注册实际的MyServiceImpl 
   //这样任意节点上的应用都能访问    
   Environment env = new Environment(); 
   env.setReplicateBindings(true); 
     
   env.setCreateIntermediateContexts(true); 
    ctx = env.getInitialContext();
    ctx.bind(JNDI_NAME, new   MyServiceImpl()); 

  }

  public void deactivate(){    
     ctx.unbind(JNDI_NAME); 
  }
}

 
    

2,  部署
    有两种方式部署,一种在Weblogic的classpath里指定,这样就可以在整个Cluster上指定; 另外一种就是部署到application ear中.
    前者还需要在Weblogic Console配置, 稍后就会有描述.
    后者则不需要在Console上配置,但需要在其的weblogic-application.xml里描述:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
  <singleton-service>
    <class-name>my.singleton.service.ClusterSingleton</class-name>
    <name>MyTestSingletonService</name>
  </singleton-service>
</weblogic-application>

 
如果class是打在jar里,则需要再指定jar文件
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
  <singleton-service>
    <class-name>my.singleton.service.ClusterSingleton</class-name>
    <name>MyTestSingletonService</name>
    <singleton-uri>singletondemo.jar</singleton-uri>
  </singleton-service>
</weblogic-application>

 

不过在打包时,有个要注意的地方就是在ear中的MANIFEST.MF文件里不能包含Weblogic-Application-Version. 否则,weblogic singleton service就不会被启动. 不知道这个是不是weblogic的bug.
  

3, Migration机制配置
  在部署之前先要配置Migration机制, Weblogic支持两种Migration机制: 基于数据库Database和基于内存的Consensus.

  数据库方式需要创建JDBC Data Source数据库连接以及在数据库内创建一张表. 各种数据库的建表脚本可以在<$WL_HOME>/server/db/<$dbname>/leasing.ddl找到.
  内容如下:

CREATE TABLE ACTIVE (
 SERVER VARCHAR(150) NOT NULL,
 INSTANCE VARCHAR(100) NOT NULL,
 DOMAINNAME VARCHAR(50) NOT NULL,
 CLUSTERNAME VARCHAR(50) NOT NULL, 
 TIMEOUT DATETIME, 
 PRIMARY KEY (SERVER, DOMAINNAME, CLUSTERNAME)
);

 
 

  下图为基于数据库方式的配置:
 

   在Migation Basis的下拉框下选择Database.
   Data Source For Automatic Migration选择有效的Data Source.
   Auto Migartion Table Name: 选择我们使用前面提到的leasing.ddl创建的表名, 默认是"ACTIVE".
   其它参数可以保持默认.

  Consensus方式不需要数据库,但需要配置NodeManager.

4, 配置Singleton Service.
   前面提到如果Singleton Service是在Weblogic Classpath里指定的,就需要在Weblogic Console上指定创建Singleton Service; 如果是打包在Applicaiton Ear里则会随着ear部署自动生效.

   指定创建Singelton Service方式可以很方便的执行手工Migration操作.  不过需要登录到weblogic console上配置.
   1. 创建Singleton Service:
      Enviroment->Clusters->选择Cluster->可以看到Singleton Services的标签页.


      点击"New"按钮后就会出现创建Singleton Service的页面,只有两个选项:

  •  Singleton Service Name 起个有意义的名字即可
  •  Class Name 就是刚才实现SingletonService接口的类名

 

 


     点击Next,下个页面就是选择Preferred Server. 可以从下拉菜单里选择一个. 如果所有server都启动,则我们的singleton会默认启动在我们这里选择的server上.如果默认server没有启动或有问题,则系统会自动把service启动在其他任意一个server上.

 

   2. 查看Singleton Service状态和手工迁移
      Enviroment->Clusters->选择Cluster->Singleton Services->选择刚才创建SIngleton Service打开连接.


    点击"Control"标签可以查看Singleton Service的状态, 以及正运行在那个Server上.



    

    如果要尝试手工迁移,则可选中Service,然后直接点击Migrate按钮, 会跳转到下个页面让选择New hosting Server, 最后确认提交.
   
     稍等片刻后,再回到前面"Control"的页面,查看更新后的状态, 可以看在"Current Server"已经变化了.
 
5,  测试自动Migration
  刚才是手工Migration, 在实际使用中,更常见的是自动Migration,即当Singleton Service所在的Server宕掉. Singleton Service会自动迁移到其他Server上.

  我们可以启动所有managed server, 利用刚才的方法查看Singleton Service的状态. 然后可以把Singleton Service所在的server停掉. 和手工Migration一样, 稍等片刻后刷新页面,就 可以看到这个service已经自动migrate到其他节点了.

   这个过程中如果Singleton Service所在的server正常被停掉, 则Singleton Service的deactivate()方法会被调到, 而另外一个节点会很快启动新的Service实例. 如果是非正常关闭,例如被直接kill掉, Cluster通过心跳机制也会很快发现这个故障,然后在正常的Server上启动新的service实例.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值