使用MBeans创建定制的WebLogic Server负载均衡方案

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
本文将展示如何根据从集群的托管服务器收集的MBean信息制定一个定制负载均衡解决方案。

本文将展示如何根据从集群的托管服务器收集的MBean信息制定一个定制负载均衡解决方案。该解决方案基于BEA WebLogic Server CallRouter类和所收集MBean统计信息的组合使用。在本文中,我把使用各个服务器上的大量空闲内存作为一种策略。结果,服务器之间的大量工作将基于垂直范例(vertical paradigm)进行分布,这将导致更好地使用域中的内存资源。

简介

  使用集群应用程序的主要好处之一是可以将负载分布到几台机器上。默认情况下,WebLogic Server集群使用了一个round-robin负载均衡解决方案来分配服务器之间的负载。在选择使用round-robin算法时,来自集群存根的请求将循环遍历对象所驻留的服务器实例的列表。先选择一个特定顺序,然后按此顺序使用每台服务器,直到到达列表的末尾,接着再重复循环这一过程。

  round-robin方案简单并且可以预测。但是该策略并不根据不断变化的服务器负载作出反应。例如,如果集群中的某一台服务器负载过重,它仍将像集群中的其他服务器一样继续参与round-robining方案,因此该服务器上可能堆积很多工作。

  为了找到解决这一问题的解决方案,我们根据实际情况构建了一个用例。假设有一个应用程序,它以某种非常依赖用户交互的方式交付关键的业务功能。利用电信网络的表列数据(tabular data)生成XML文档的应用程序可能是一个好例子。根据网络拓扑和选定的区域,您可以创建一个100kb的XML文档,或者创建一个令人畏惧的1Gb的XML文档。

  因为存在上述失调情况,可能会使您在最后几个小时终止业务操作,使服务器处于过重的负载下;您可能还有一些在非常短的时间内完成的操作。

  解决这个问题的一个解决方法就是在发出调用之前调查目标节点的状态。开发人员可以有几个选择。例如,用户可以只选择不太忙的服务器。如果选择分配一组高容量的服务器来处理繁重的任务,并分配“内存小”的服务器处理基本请求,那么可能是另一番场景。无论选择哪一种策略来处理负载均衡调用,都必须了解关于weblogic.rmi.cluster.CallRouter接口的更多信息。

CallRouter类

  weblogic.rmi.cluster.CallRouter是编写定制路由策略的起点。每次调用一个EJB远程方法时,都由一个可集群的存根来调用调用路由器(call router)。该路由器负责返回该调用应该路由到的服务器的名称。集群中的每台服务器都是通过其名称惟一标识的,正如WebLogic Server Console中定义的那样。这些名称是方法路由器用来标识服务器所必须使用的名称。

  要使用此接口,则必须实现getServerList()方法,该方法在每次调用特定EJB时调用。该方法的返回值是一个字符串数组,用于指定执行此调用的服务器。服务器在此数组中的顺序非常重要。WebLogic Server根据此数组中找到的顺序联系服务器。因此,在下面的示例中,请求将转发至server1,如果该服务器处于非活动状态下,则将请求转发至server2,最后选择转发至server3:

 public String[] getServerList(Method m, Object[] params) {
    String serverList[] = {"server1","server2","server3"};
  return serverList;
 }

  该路由器类是在stateless-clustering代码段的weblogic-ejb-jar.xml中配置的,如下所示:

<weblogic-enterprise-bean>
  <ejb-name>TestRouterEJB</ejb-name>
  <stateless-session-descriptor>
     <stateless-clustering>
       <stateless-bean-is-clusterable>True</stateless-bean-is-clusterable>
       <stateless-bean-call-router-class-name>test.BeanRouter</stateless-bean-call-router-class-name>
       </stateless-clustering>
     </stateless-session-descriptor> 
  <jndi-name>TestRouterEJB</jndi-name> 
</weblogic-enterprise-bean>

  在这里,test.BeanRouter指定了用来路由针对特定EJB的bean方法调用的定制类。在调用每个方法之前,将调用此类的一个实例,并给出一个基于方法参数选择将路由到哪一台服务器的机会。它将返回一个服务器名称或者null,后者表示应该使用默认负载算法挑选服务器。

  如果目标是根据服务器的负载分配负载,那么可以根据空闲内存的数量或总分配内存(可以二者结合使用)进行您的选择。JDK提供了一个通过Runtime类检索此信息的简单方法。一个中立方法可能是将每个服务调用的内存信息持久存储在某个地方,如下所示:

long freeMemory = Runtime.getRuntime().freeMemory();
.....
// in some SQL code
INSERT into MEMORY_INFO (server_name, free_memory) values ( ?, ? )
INSERT into MEMORY_INFO (server_name, free_memory) values ( ?, ? )

  这取决于收集关于内存的统计信息并以适当方式分配调用的路由器类。不过,还有解决这个问题的更好方法,现在让我们来研究一下这个方法。


用MBeans解决这个问题 每个WebLogic Server实例都有一个自己的用来保存许多MBeans的MBean Server。MBean Server充当MBeans的注册表,为访问和操作运行在服务器上的MBeans提供服务。WebLogic Server对三组不同的MBea

用MBeans解决这个问题

  每个WebLogic Server实例都有一个自己的用来保存许多MBeans的MBean Server。MBean Server充当MBeans的注册表,为访问和操作运行在服务器上的MBeans提供服务。WebLogic Server对三组不同的MBeans进行了区分:

  • Configuration MBeans公开用来配置某一资源的属性和操作。
  • Runtime MBeans提供关于资源的运行时状态的信息。
  • Security MBeans反映了SSPI,提供对服务器安全网络配置的直接访问。

  在这里,最重要的是Runtime MBeans,它反映了资源的运行时状态。现在我们要着手做的第一件事就是找到MBean Server的主接口。主接口提供了对底层MBean服务器的访问,并允许您到达驻留在服务器上的MBeans。

  可以用两种方式检索MBeanHome。如果想使用标准Java EE方法,那么可以使用Java Naming和Directory Interface (JNDI)来检索MBeanHome:

MBeanHome home = (MBeanHome)
 ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);

  作为一种替换,您可以使用WebLogic Server Helper类:

String url = "t3://localhost:7001";
String username = "weblogic";
String password = "weblogic";
String msName = "MS1";
MBeanHome localHome = 
  (MBeanHome)Helper.getMBeanHome(username, password, url,msName);

  除了检索MBeanHome范围内的所有MBeans的列表之外,还可以检索与特定类型匹配的MBeans的列表。在本例中,焦点是ServerRuntime MBeans,它收集关于WebLogic Server实例的Runtime信息:

Set mbeanSet = home.getMBeansByType("ServerRuntime");

  包含关于JVM的运行时信息的接口是JVMRuntimeMBean,对我们有用的方法(MBean属性)如下:

  • long getHeapFreeCurrent() - 返回JVM堆中空闲内存的当前数量(以字节为单位)。
  • long getHeapSizeCurrent() - 返回JVM堆的当前大小(以字节为单位)。

  以下是集群中空闲内存的数量:

Iterator mbeanIterator = mbeanSet.iterator();
while(mbeanIterator.hasNext()) {
 serverRuntime = (ServerRuntimeMBean)mbeanIterator.next();
 if (serverRuntime.isAdminServer()) {
   log("Found admin Server");
   continue;
 }
 String strServer = serverRuntime.getName();
 long memory = serverRuntime.getJVMRuntime().getHeapFreeCurrent();
 log("Free memory on server " + strServer + " : " +freeMemory );
}

  注意,在进行迭代时,可以跳过AdminServer,因为您只对监视Managed Servers感兴趣。现在您要做的就是收集运行时统计信息,并根据您的标准对已排序的服务器列表进行排序。为此,您可以编写一个定制类,用它来实现保存排序模式的Comparable接口。下图综合了已经介绍过的一些概念:

 



图 1:客户机如何在负载均衡的情况下调用特定服务器

  在图1中,客户机调用了一个EJB [1],该EJB位于由两个节点组成的集群上。一旦调用EJB方法,集群感知存根将负责选择负载均衡算法。在选择采用定制负载均衡算法时,将发出对getServerList()的回调 [2]。一旦位于Router类中,就可以从JNDI树检索RuntimeMBean [3]并收集相关统计数据。在最后一步中 [4],将返回一个字符串数组,这些字符串是为了接收调用而分配的托管节点。

示例代码,获得展示这样一个实现的完整类清单。

Workload Management in WebLogic Server 9.0获得有关的细节信息。 汇总 既然已经查看了MBeans和CallRouter,现在让我们来查看如何将它们汇总在一起。因此,您要做的第一件事是编写您自己的定制路由器类。在准备好

Workload Management in WebLogic Server 9.0获得有关的细节信息。

汇总

  既然已经查看了MBeans和CallRouter,现在让我们来查看如何将它们汇总在一起。因此,您要做的第一件事是编写您自己的定制路由器类。在准备好该类之后,应该让应用程序可以看见它。如果该路由器类将由您的应用程序使用,最好的选择是将该类添加到EJB的JAR中。此外,可以考虑将路由器类(及其依赖项)添加到Weblogic Server的类路径中。记住,无论如何,启动时在服务器的类路径中引用的所有类和库都是由根类路径的类加载器加载的,所以在服务器运行时,您不能卸载(或刷新)这些类中的任何类。

  因此让我们来考虑第一个选择。您已经添加了一些类到EJB的JAR中,所以现在可以动态修改路由器类,不需要重新启动服务器。现在需要在weblogic-ejb-jar.xml中包含路由器类声明,正如上面所指示的那样。注意,不需要对ejb-jar.xml文件进行任何更改。一旦完成这一步骤,应用程序就准备就绪,可以为您的集群对其进行部署了。

  我尚未提及的一件事是哪些类型的EJB可以在此场景中使用。仔细观察一下WebLogic Server 8.1 DTD,您就会发现,路由器类名称只可以用于无状态会话bean。为什么呢?因为无状态会话bean类型的所有实例都是相同的,主存根或远程存根可以在任何服务器上保存它们通过任何可用对象接收的请求。这使得无状态会话bean成为定制负载均衡策略的理想候选。

  另一方面,当您处理有状态的会话bean时,客户机被“牵制”在它创建的服务器对象上。结果,因为客户机的这种受实例牵制的特性,远程存根被连接到特定服务器,而定制负载均衡没有任何意义。默认情况下,相同的情况也出现在实体bean上(读/写),在那里,负载均衡和故障转移功能只限定于主存根。

Caveats

  在规划WebLogic Server集群时,常常忽略的一个方面是:WebLogic Server并不总是对某一对象的方法调用进行负载均衡。在多数情况下,使用与存根本身搭配在一起的副本而不是使用位于远程服务器上的副本会更有效。

  配置优化也经常使每次进行方法调用时都期望或需要负载均衡的管理员或开发人员感到困惑。如果您的Web应用程序被部署到单个集群,那么配置优化会重写副本感知存根中固有的任何负载均衡逻辑。该优化声称,如果当对象调用某一副本时,该副本可在相同服务器实例上使用,则无法对该调用进行负载均衡,因为使用本地副本更有效。

  如果需要在某一集群对象的每个方法调用上进行负载均衡。则必须遵从BEA的Recommended Multi-Tier Architecture,它解释了如何相应地规划您的WebLogic Server集群。简言之,您可能需要让EJB客户机和EJB类驻留在单独的集群上。例如,您可以将servlet驻留在一个集群上,将EJB驻留在另一个单独的集群上;在此servlet中,EJB的方法调用可以在几台服务器之间进行负载均衡。

 

结束语

  通过将集群应用程序与CallRouter接口集成,您要负责设置自己的负载均衡算法。在负载均衡模式不可行,且必须在运行时根据一些变量选择服务器时,上述方法可能特别有用。BEA WebLogic Server MBeans支持您的应用程序访问运行企业应用程序的多功能环境。检索集群中单个节点的内存信息提供了获得统计数据的关键,而您的负载均衡策略需要这些数据作为基础。在使用RuntimeMBean提供的其他功能时,可能为上述示例添加额外的复杂性。这些可能就是收集关于集群节点的统计数据的管理工具的基础,也可能是执行维护活动的基础。


通过MBean server监控weblogic应用 因为最近自己一直在做一个weblogic项目监控的web工程,而苦于网上关于weblogic监控可获取属性的信息少之又少,所以自己对此做了一点小小的总结,希望看到的人能少走一些弯路。 首先,从建立Mbean server的连接说起, public class MonitorWeblogic {   public static final Logger LOG = Logger.getLo 阅读详情

相关推荐

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 590

weblogic 理解MBean

为了完全理解WebLogic服务器如何工作,并让它表现出最佳性能,我们很有必要理解几个概念。最重要的概念都在下面的内容中谈到了。本文为第一部分。   执行线程和队列   本部分内容简单描述了Oracle WebLogic服务器的内部架构,大家可以了解到该服务器如何执行工作来满足用户请求的。当客户端向WebLogic发起请求时,响应该请求的实际工作是由叫做执行线程的Java线程执行的。用户可以使

indieinside的专栏 4420

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 603

Weblogic 脚本工具 导航和编辑 MBean

导航和编辑 MBean 以下部分描述了如何使用 WLST 来导航、询问和编辑 MBean: 导航和询问 MBean 浏览运行时 MBeanMBean 层次中导航 查找 MBean 访问自定义 MBean 编辑配置 MBean 导航和询问 MBean WLST 提供了对 MBean 的简化访问。而 weblogic.Admin 实用工具(不...

管子(zero)的杂乱空间 333

使用JMX访问WebLogic Server MBean

使用JMX访问WebLogic Server MBean 本章介绍如何从JMX客户端访问WebLogic Server MBean。它解释了如何为远程客户端设置类路径; 如何与MBean服务器建立本地和远程连接; 以及如何导航MBean层次结构。 本章包括以下部分: 设置远程客户端的类路径 远程连接到MBean Server 与运行时MBean服务器建立本地连接 与Domain Runtime ...

qq_38941940的博客 1623

weblogic-ejb-jar.xml的元素解析

weblogic-ejb-jar.xml的元素解析         做EJB开发,那是几年前的事儿了。虽然EJB2.0一直为开发者所诟病,但它毕竟还是有其自身的优势,比如事务、安全管理,实例生命周期管理等,当然核心还是其提供的分布计算。在EJB规范之外,作为Application Server Vendor,BEA还在规范基础上提供了不少扩展属性,这些属性不是规范要求的,但它提供了额外的功...

yangzibin的博客 1263

WebLogic Enterprise JavaBean 编程

了解 Enterprise JavaBean 以下部分简要回顾了不同的 Enterprise JavaBean (EJB) 类型以及它们在应用程序中可提供的功能,并描述了它们如何使用其他应用程序对象和 WebLogic Server。 假定读者熟悉 Java 编程和 EJB 2.x 概念及功能。 应用程序如何使用 EJBEJB 分析及环境EJB、客户端和应用程序对象

kdsde的专栏 1272

Web——安装httpd服务(Tomcat)及Nginx+Tomcat负载均衡

文章摘要 Tomcat是一款由Apache软件基金会开发的开源轻量级Web应用服务器,支持Servlet和JSP规范,广泛应用于Java Web开发。本文详细介绍了Tomcat的安装与配置过程:包括环境准备(IP规划、关闭防火墙/SELinux)、软件包下载、解压安装Tomcat和JDK8、配置Java环境变量、启动Tomcat服务及验证访问。通过对比Apache、Nginx等主流Web服务器,突出了Tomcat在Java Web应用中的专用性优势。文中还提供了常见问题解决方案,如端口冲突时的修改方法,并附

一天不学,就浑身难受 1392

使用 JMX 访问 WebLogic Server MBean

 http://edocs.weblogicfans.net/wls/docs92/jmx/accessWLS.html  JMX 访问 WebLogic Server MBean  ,这个听不容易找的,呵呵,大家看看吧  使用 JMX 访问 WebLogic Server MBean 下列部分描述如何从 JMX 客户端访问 WebLogic Server MBean

HI,我是小瑞! 3983

[转帖]weblogic群集

weblogic从5.1的版本起就支持集群技术.从网上down的版本是没有集群支持的。license key中有控制。 [@more@]weblogic从5.1的版本起就支持集群技术.从网上down的版本是没有集群支持的。lic...

conggu1898的博客 320

使用Oracle WebLogic对应用程序外部的EJB的引用

在之前的文章中,我们对EJB v。3.0及其为您提供的用于构建Java EE应用程序的可移植机制进行了概述。 由于Java EE规范都是关于可移植性的,因此冒着重复自己的风险,我们经常强调EJB v。3.0规范上仍然存在最重要的可移植性限制:没有在外部声明和链接对EJB的引用的便携式方法你的申请。 尽管存在其他一些标准(例如Web服务)可以让您松散耦合应用程序的组件,但是远程EJB仍然是完...

最佳 Java 编程 210

中间件的数据抽取各种运行状态 ,weblogic的 , tomcat 类似 ---朋友的代码

package com.agent.opt.type.weblogic.data; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.InetSocketAddre...

dayformyjob 775

通过weblogic 9 mbean监控其应用状态

通过weblogic开放的jmx mbean可以对部署其上的应用\jms\datasource。。。很多内容进行查看和管理,下面这个demo只是借鉴了一下weblogic提供的例子作一个简单的测试。如果想通过这个实现监控,可以为这段代码加上定时设置(通过TimerTask或者quartz)。 下面这段代码主要查看应用的状态以及jms相关情况(需要依赖weblogic.jar)。   impo...

eddysheng 272

WebLogic配置连接池(通过mbean)

WebLogic配置连接池(通过mbean) 有关WebLogic配置连接池比较好的解决方案 一般配置weblgoic连接池(或DataSource)都是通过weblogic console界面来配置,通常情况下,因为很多原因,比如类的加载,driver的错误,url的错误,以及其他属性不正确等等原因,而造成配置抛出mbean的异常信息。 这类问题,在本论坛上出现了很多次,而精华区也有

zh029t的专栏 3064

JMX对weblogic的监控指标小结

weblogicServier实现了JMX规范,提供了各种各样的MBeansWebLogic Server的各项配置及性能进行监控的API。通过weblogic提供的API可以对server(服务),cluster(集群)等进行监控。下面主要罗列对server进行监控的指标。1、常用一般监控指标指标名指标描述MBean属性服务状态此服务器的当前生命周期状态。例如,服务器可以...

weixin_33995481的博客 518

Java8之JMX与MBean

Dynamic MBean必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义。另外还有两类 MBean:Open MBean 和 Model MBean,实际上它们也都是动态 MBean

CRUD工程师 2262

Weblogic 12.1.3集群管理手册(了解weblogic集群)

2  了解weblogic集群 本章节提供了对weblogic服务器集群的简单介绍。本章节包含以下部分: 2.1 什么是weblogic服务器集群? 2.2 什么是动态集群? 2.3 weblogic集群与weblogic域之间的区别? 2.4 集群有哪些好处? 2.5 集群的关键功能 2.6 哪些类型的对象能够应用到集群中? 2.7 哪些类型的对象不能够应用到集群中?

longdragen的专栏 3980

weblogic管理工具及监控 health state 的方法

1 命令行工具监控 Weblogicjrockit 自己提供了命令行监控工具,可以方便快捷的获取监控信息。(1) 配置工具的启动环境:如上图所示,在安装好weblogic后,打开cmd命令,执行 setWLSenv 脚本(setWLSenv.cmd 或 setWLSenv.sh)进行环境配置,然后就可以正常使用weblogic.Admin 工具了。(2) 执行监控命令,例如#> java weblo

抱朴守拙 6118

用Zabbix通过JMX方式监控JVM/Tomcat/Weblogic/Websphere/Jboss等

 转载自:http://www.huilog.com/?p=688 JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。 上面的介绍有点绕,我是这么简单粗暴地理解的:JMX之于JVM或JAVA...

Jay Chang 2756

Oracle WebLogic RESTful Management Services

总结 甲骨文WebLogic服务器12c是一个主要版本,包括几个新功能,包括Java EE 6,马文集成和JDK 7支持。本版本还包括对甲骨文 WebLogic 域的管理和监控非常重要的其他功能。本文将重点介绍以下功能之一:恢复性管理服务。 从甲骨文 WebLogic12c 开始,RESTful 服务现在可用于监控正在运行的服务器实例的几个方面,包括: 应用 集群 数据来源 服务器 此功能最有趣的部分是能够从任何 RESTful 客户端(包括不同的编程语言)调用此类服务。本文将说明如何使用丰满的

Vic的博客 1090
上一篇: Weblogic92, Weblogic10.3在Linux上启动慢的问题
下一篇: WebLogic Server中jms message的状态
小猴大叔
博客等级 码龄16年 9粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值