导语
   JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
  JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等
优点是可以非常容易的使应用程序被管理
伸缩性的架构使每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。
主要作用是提供接口,允许有不同的实现

文章目录

  • JMX简介
  • 在ZK中如何使用
      • 第一步需要定义一个战士MBean信息的接口类
      • 第二步基于接口实现具体的MBean
      • 第三步在程序的某个地方需要启动JMX的服务,并且将上面这些Bean注册到其中。
    • JConsole分析
    • Zookeeper中为什么会使用JMX
  • 总结

JMX简介

  JMX 最常见的场景是监控Java程序的基本运行状况,任何Java程序都可以开启JMX,然后使用Java监控工具来进行查看。为Java应用程序开启JMX非常简单,之主要在运行的Java程序的命令后面加入下面这些命令即可

-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=1000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

  然后就可以通过监控工具看到有关的内容。例如使用Java自带JConsole 通过JMX展示的信息,可以获取到内存情况、线程情况、类加载情况等等


  当然在JMX中它所能提供的功能还远远不止这些,针对一些具体程序的专有信息也提供了响应的接口,并且可以在JConsole中进行展示。也就是说在编写代码的时候可以把信息封装到一个MBean的Java 对象中,然后JConsole会连接到JMX服务,识别MBean并且在图形化界面中进行展示。

  从抽象的角度出发类似于浏览器发送一个请求给服务器,然后服务器返回对应的请求数据。从某种意义上讲,所有的有关JVM的监控机器,与JMX的通信原理与这个类似,只不过不是通过HTTP协议,而是基于一种客户端服务器的工作模式。这种工作模式相对于HTTP来说,JMX实现起来相对会比较简单。例如如果需要知道服务器上运行中程序的相关信息,执行了多少次数据库操作、任务队列中有多少个任务等待处理等等。

  在日常的工作中最常用的处理方式就是在应用程序中启动一个HTTP服务,类似于SpringBoot的监控,当收到来自客户端的请求的时候返回一些HTTP处理的信息,然后转换成JSON格式的数据返回给客户端,客户端会解析这个JSON数据来进行展示。JMX也是基于这种模式,只不过就是数据交换方式有所不同。下面就来看看在Zookeeper中怎么实现这个操作的。

在ZK中如何使用

  首先在org.apache.zookeeper.jmx包中就是Zookeeper对于JMX的操作进行了封装。如下代码所示

第一步需要定义一个战士MBean信息的接口类

  由于在这里是对JMX的扩展并没有严格的按照MBean这种方式进行接口编写。在代码注释中也看到了有关的说明。

/*** Zookeeper MBean info interface. MBeanRegistry uses the interface to generate* JMX object name.*/
public interface ZKMBeanInfo {/*** @return a string identifying the MBean */public String getName();/*** If isHidden returns true, the MBean won't be registered with MBean server,* and thus won't be available for management tools. Used for grouping MBeans.* @return true if the MBean is hidden.*/public boolean isHidden();
}

第二步基于接口实现具体的MBean

  如图所示在Zookeeper中其实对于很多的地方都进行了监控。所以具体实现的Bean对象也是有很多。可以根据Bean的名称来获取到具体都是支持哪些内容的监控

第三步在程序的某个地方需要启动JMX的服务,并且将上面这些Bean注册到其中。

  在Zookeeper中的org.apache.zookeeper.jmx.MBeanRegistry 类就是提供了这个功能在这类中有一个register()方法,如图所示,由于代码复制在这个地方会变形,所以使用了图片的方式。

  上面代码最为关键的一个地方就是下面这行代码,有了这行代码,在JConsole中就可以看到其中有那些操作。

  在上面代码中加入一些LOG日志,使用DEBUG级别启动来查看最终的效果

结果如下
 &emps;由于截图的原因,这里截图比较小。需要的话可以点击图片进行放大。会看到这里注入的是主线程本身和一个DataTreeBean。在上面截图中也看到的DataTreeBean。但是实际上会看到 它的名称是
其名称 org.apache.ZooKeeperService:name0=StandaloneServer_port2181,name1=InMemoryDataTree 也就是说我们要使用JConsole连接之后找到这两个其中一个就说明我们的分析是正确的。如果两个都找到就说明这个机制是没有问题的。

JConsole分析

  在配置好Java环境变量的任意命令行中输入

jconsole

  然后就进入到了如下的页面中

  选择对应的线程双击连接会看到如下的界面找到MBean即可

  会看到确实有来自Zookeeper的MBean点击之后会看到

  到这里所有的分析都很清楚,到这里会看到,这里为什么会使用这个机制,或者说在Zookeeper中使用这个机制是需要做什么样的操作,下面就进入分析阶段

Zookeeper中为什么会使用JMX

  前面的分析中提到了一个方法Zookeeper中的register()方法,下图展示了都是在什么地方调用了这个方法,调用这个方法之后分别都进行的操作是什么。根据上面的分析知道,在启动的时候注入了两个MBean这个是通过单机模式启动的。

开始注入 JMX MBean org.apache.zookeeper.server.ZooKeeperServerBean@670b40af 其名称 org.apache.ZooKeeperService:name0=StandaloneServer_port2181开始注入 JMX MBean org.apache.zookeeper.server.DataTreeBean@46daef40 其名称 org.apache.ZooKeeperService:name0=StandaloneServer_port2181,name1=InMemoryDataTree

  下面来看看集群模式启动的时候回注入那些操作,从下面的结果中可以看到,集群模式启动的时候,所注入MBean的内容要比单机模式启动的时候注入的MBean要多,而这些MBean从内容上来看都是与Leader的选举相关的东西。而在下面图中展示的注册方法调用的时候也确实前三个就是对Leader选举操作有关的内容。也就是说其实在Zookeeper集群中,是通过这种方式来管理集群中所有的节点数据属性存储

开始注入 JMX MBean org.apache.zookeeper.server.quorum.QuorumBean@2c647f16 其名称 org.apache.ZooKeeperService:name0=ReplicatedServer_id1开始注入 JMX MBean org.apache.zookeeper.server.quorum.LocalPeerBean@6c0dc17b 其名称 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1开始注入 JMX MBean org.apache.zookeeper.server.quorum.RemotePeerBean@1356e8a 其名称 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.2开始注入 JMX MBean org.apache.zookeeper.server.quorum.RemotePeerBean@7ff0e9e 其名称 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.3开始注入 JMX MBean org.apache.zookeeper.server.quorum.LeaderElectionBean@2d9461d5 其名称 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1,name2=LeaderElection

总结

  通过JMX技术来支持整个的Zookeeper集群的信息维护,可以减少通过网络传入或者是IO操作带来的传输效率上的消耗,将更多的性能转而提供给其他的操作。对于基础信息的维护再也不用多消耗其他资源而是由语言本身的特性来完成。同时利用这种操作可以通过JConsole来管理进行监控操作。在很多的场景下都是比较适用的。这也为后续系统性能监控提供了一种解决方案。当然有优势就有这个优势所来带的不足,希望可以辩证的使用技术组合构建高效工具

Zookeeper深入系列-从Zookeeper中深入JMX原理相关推荐

  1. Zookeeper概念学习系列之zookeeper是什么?

    1. Zookeeper是Hadoop的分布式协调服务. 2. 分布式应用程序可以基于它,来实现同步服务,配置维护和命名服务等. 3. zookeeper可以保证数据在zookeeper集群之间的数据 ...

  2. Zookeeper概念学习系列之分布式事务

    不多说,直接上干货! 初学者来说,肯定会有这么一个疑问.为什么会在zookeeper里牵扯到分布式事务? zookeeper到底是什么? zookeeper实际上是yahoo开发的,用于分布式中一致性 ...

  3. zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)...

    本博文的主要内容有 一.zookeeper编程入门系列之利用zookeeper的临时节点的特性来监控程序是否还在运行   二.zookeeper编程入门系列之zookeeper实现分布式进程监控 三. ...

  4. zookeeper查看注册服务器,zookeeper服务器注册

    Dubbo之旅-注册中心-Zookeeper initLimit:这个配置项是用来配置Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zooke ...

  5. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  6. ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十六篇,本文我们将继续秒杀系统的优化之路,采用统一协调调度中心中间件ZooKeeper控制秒杀系统中高并发多线程对于共享资源~代码块的并发 ...

  7. 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

    一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...

  8. hdfs+zookeeper+hbase分布式在k8s中部署(本文已过期)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 本文内容已经过期, 有时间再更新新的,不要订阅这篇文章 版本信息:java1.8+hadoop-2.7.7+zookeeper-3.4.9+hbase ...

  9. Spring Cloud 系列之 ZooKeeper 注册中心

    什么是注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串.路由信息等.服务注册中心是微服务架构中最基础的设施之一. 注册中心可以说 ...

最新文章

  1. windows核心编程-第二章 Unicode
  2. 关于开发自我训练课程
  3. scp 是我小看了你-基于密钥传输!
  4. jzoj1295-设计【差分约束系统,最短路】
  5. 众善之源 or 万恶之源?详析微服务的好与坏
  6. c/c++开发技巧_常用do_while
  7. c语言switch工资怎么弄,超级新手,用switch写了个计算器程序,求指导
  8. consul服务注册与服务发现的巨坑
  9. 我和linux的第十三天
  10. 冰点还原精灵如何修改密码
  11. 十个非常实用的PS画笔使用技巧
  12. 如何在PDF页面中插入图片?
  13. 百度CTO李一男:未来五年电子商务是关注重点
  14. 《Cocos Creator游戏实战》在游戏中显示弹幕
  15. mysql级联更新_Mysql实现级联操作(级联更新、级联删除)(转)
  16. Mac上的Redis客户端 G-dis
  17. CodeBlocks安装汉化与使用说明
  18. JSONPath库:使用类似Xpath的语法解析JSON数据
  19. BuuCTF难题详解| Misc | [HDCTF2019]你能发现什么蛛丝马迹吗
  20. 夜光带你走进React.js(三)擅长的领域

热门文章

  1. python switch高效替代_Python中用什么代替switch
  2. 怎么用class覆盖style样式
  3. 电子商务型网站该如何选择虚拟主机
  4. Alpha 冲刺报告2
  5. [LeetCode]--3. Longest Substring Without Repeating Characters
  6. MySql关键字-保留字
  7. cocos2d-x物业现场
  8. 首届CSS开发者大会|七牛助力前端开发
  9. tomcat安装成功页面翻译
  10. cocos2d-x的popScene的动画效果