【性能监控 APM 一】JMX && jstatd

【性能监控 APM 一】JMX && jstatd

【性能监控 APM 二】JMC && jvisualvm && jconsole

【性能监控 APM 三】springboot-admin

【性能监控 APM 四】hertzbeat

【性能监控 APM 五】Prometheus + Grafana

 

一、JMX概述

  JMX(Java Management Extensions,即Java管理扩展),为java程序提供监控管理功能的框架。也可以通过自定义实现MBean来实现对具体的指标进行检测。在本地的话,通过jvisualvm、jconsole、jmc可以直接连接本地的jvm。开启远程需要在程序启动时添加下面示例JVM参数,本实例是在java11基础上进行。

1、JMX开启远程访问

java \
-Dcom.sun.management.jmxremote=true  \
-Dcom.sun.management.jmxremote.port=9000 \
-Dcom.sun.management.jmxremote.rmi.port=9100 \
-Djava.rmi.server.hostname=100.100.100.100 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.registry.ssl=false \
-jar sa-web.jar
  • com.sun.management.jmxremote :本地JMX是否开启远程服务
  • java.rmi.server.hostname :本地jmx服务的IP或域名
  • com.sun.management.jmxremote.port :本地JMX服务开放的端口
  • com.sun.management.jmxremote.rmi.port : rmi服务端口
  • com.sun.management.jmxremote.authenticate:本地JMX服务是否开启认证
  • com.sun.management.jmxremote.ssl :本地JMX服务是否开启SSL连接。

2、添加JMX远程访问认证

java  \
-Dcom.sun.management.jmxremote=true  \
-Djava.rmi.server.hostname=100.100.100.100 \
-Dcom.sun.management.jmxremote.port=9100  \
-Dcom.sun.management.jmxremote.ssl=false  \
-Dcom.sun.managementote.ssl=false  \
-Dcom.sun.management.jmxremote.authenticate=true  \
-Dcom.sun.management.jmxremote.password.file=/java/jdk-11.0.20/conf/management/jmxremote.password  \
-Dcom.sun.management.jmxremote.access.file=/java/jdk-11.0.20/conf/management/jmxremote.access  \
-jar sa-web.jar
  • com.sun.management.jmxremote.password.file :远程连接的密码文件
  • com.sun.management.jmxremote.access.file :远程连接的权限文件

认证文件jmxremote.password、jmxremote.access两个文件一般在 java安装目录下面的配置文件夹中,例如我这里是 /java/jdk-11.0.20/conf/management 文件夹中。jmxremote.password文件是我们复制jmxremote.password.template模板文件并改名的。这两个文件必须要有相关的读写权限,然后我们在两个文件末尾分别添加以下内容:

jmxremote.access 文件末尾添加内容如下,表示admin账号具有读写权限:
admin readwrite

jmxremote.password 文件末尾添加内容如下,表示 账号和密码:
admin Hw@654321

以上开启了jmx远程连接的认证以后,通过jvisualvm,jmc,jconsole就使用 admin Hw@654321 密码账号进行认证登录就可以了。

3、添加远程SSL访问

nohup java  \
-Dcom.sun.management.jmxremote=true  \
-Dcom.sun.management.jmxremote.port=9200 \
-Dcom.sun.management.jmxremote.rmi.port=9300 \
-Djava.rmi.server.hostname=100.100.100.100 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
-Djavax.net.ssl.keyStore=/java/ssl/server/visualvm-server.keystore \
-Djavax.net.ssl.keyStorePassword=Hw@654321 \
-Djavax.net.ssl.trustStore=/java/ssl/server/visualvm-server.truststore \
-Djavax.net.ssl.trustStorePassword=Hw@654321  \
-XX:+UnlockCommercialFeatures \
-XX:+FlightRecorder \
-jar sa-web.jar > /dev/null 2>&1 &
  • 开启远程ssl访问
 -Dcom.sun.management.jmxremote.ssl=true 
 -Dcom.sun.management.jmxremote.registry.ssl=true 
 -Dcom.sun.management.jmxremote.ssl.need.client.auth=true 
  • 配置远程访问ssl认证信息
-Djavax.net.ssl.keyStore=/java/ssl/server/visualvm-server.keystore \
-Djavax.net.ssl.keyStorePassword=Hw@654321 \
-Djavax.net.ssl.trustStore=/java/ssl/server/visualvm-server.truststore \
-Djavax.net.ssl.trustStorePassword=Hw@654321  \
  • javax.net.ssl.keyStore : 秘钥仓库文件

  • javax.net.ssl.trustStore :证书仓库文件

  • 证书的生成
    通过以下shell脚本,利用jdk 的keyTool 来生成认证文件:

#!/bin/bash

#============================================#
#   下面为生成密钥及相关信息配置,注意修改   #
#============================================#
# 默认变量值
	# 客户端密钥文件别名
CLIENT_ALIAS=visualvm
	# 服务端密钥文件别名
SERVICE_ALIAS=visualvm-server
	# 默认密码 
PASSWORD="Hw@654321"
	# 默认域名或ip
HOSTNAME="default_hostname"
	# 有效天数, 默认设置1年
TIME_DAY=365

# 解析参数
while getopts ":h:p:d:" opt; do
  case ${opt} in
    h )
      HOSTNAME=$OPTARG
      ;;
    p )
      PASSWORD=$OPTARG
      ;;
    d )
      TIME_DAY=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 1>&2
      echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
      exit 1
      ;;
    : )
      echo "Invalid option: -$OPTARG requires an argument" 1>&2
      echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
      exit 1
      ;;
  esac
done

# 使用 shift 命令将处理过的参数移除,确保后面不再跟随任何非法参数
shift $((OPTIND -1))

# 如果只输入 -h 参数,则使用默认密码
if [ "$PASSWORD" == "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; then
  echo "Using default password"
# 如果只输入 -p 参数,则使用默认 hostname
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" == "default_hostname" ]; then
  echo "Using default hostname"
# 如果同时输入 -h 和 -p 参数,则使用用户指定的值
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; then
  echo "Using specified values"
else
  echo "Invalid arguments: $@" 1>&2
  echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
  echo "OR USER: sh ${0} -h [HOSTNAME]  ,This will use the default password" 1>&2
  exit 1
fi

# 输出变量值
echo "password: $PASSWORD"
echo "hostname: $HOSTNAME"
echo "time day: $TIME_DAY"

#============================================#
#          客户端相关密钥          #
#============================================#

# client keystore
keytool -genkeypair -alias $CLIENT_ALIAS -keyalg RSA -validity $TIME_DAY -storetype pkcs12 -keystore "$CLIENT_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOST OU=Alphalion O=dev L=GZ S=GD C=CN"

# client cer
keytool -exportcert -alias $CLIENT_ALIAS -storetype pkcs12 -keystore "$CLIENT_ALIAS.keystore" -file "$CLIENT_ALIAS.cer" -storepass $PASSWORD


# 这个命令会将客户端的证书导入到服务端的信任库中,以便服务端能够在 SSL/TLS 握手期间验证客户端证书的有效性。
keytool -importcert -alias $CLIENT_ALIAS -file "$CLIENT_ALIAS.cer" -keystore "$SERVICE_ALIAS.truststore" -storepass $PASSWORD -noprompt


#============================================#
#          服务端相关密钥          #
#============================================#

# server keystore(跟第一步格式是一样的)	
keytool -genkeypair -alias $SERVICE_ALIAS -keyalg RSA -validity $TIME_DAY -storetype pkcs12 -keystore "$SERVICE_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOST OU=Alphalion O=dev L=GZ S=GD C=CN"

# server cer (跟第二步格式一样)
keytool -exportcert -alias $SERVICE_ALIAS -storetype pkcs12 -keystore "$SERVICE_ALIAS.keystore" -file "$SERVICE_ALIAS.cer" -storepass $PASSWORD

# 这个命令会将服务端的证书导入到客户端的信任库中,以便客户端能够在 SSL/TLS 握手期间验证服务端证书的有效性。
keytool -importcert -alias $SERVICE_ALIAS -file $SERVICE_ALIAS.cer -keystore "$CLIENT_ALIAS.truststore" -storepass $PASSWORD -noprompt


#============================================#
#                    移动清理                 #
#============================================#
# 转移目录。服务端的密钥保存在server目录下,客户端的密钥保存在client目录下
mkdir -p ./client ./server
cp $CLIENT_ALIAS.cer $CLIENT_ALIAS.keystore $CLIENT_ALIAS.truststore ./client
cp $SERVICE_ALIAS.cer $SERVICE_ALIAS.keystore $SERVICE_ALIAS.truststore ./server

# 删除源文件
rm *.cer *.keystore *.truststore

执行脚本:

sh jvisualvm_keyStore.sh -h  [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]

当前目录下生成client和server两个文件夹,server文件夹下的认证文件就是我们本地启动服务命令中需要配置的文件。client文件夹下的文件可以复制到客户端,通过jvisualvm连接时设置相应文件。

二、jstatd 概述

  jstatd是一个rmi的server应用,用于监控jvm的创建、结束以及相关运行状态,并且提供接口让监控工具(如visualvm)可以远程连接到本机的jvm,监控启动在此jvm的所有程序 。

1、配置

在java安装目录的bin目录下(例如我本地是/java/jdk-11.0.20/bin),创建 jstatd.policy 文件,并添加以下内容。

  • jdk9以前:
grant codebase "file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar" {
    permission java.security.AllPermission;
};
  • jdk9以后:
grant codebase "jrt:/jdk.jstatd" {
   permission java.security.AllPermission;
};

grant codebase "jrt:/jdk.internal.jvmstat" {
   permission java.security.AllPermission;
};

2、执行命令启动jstatd服务

jstatd -J-Djava.rmi.server.hostname=100.100.100.100 -J-Djava.security.policy=./jstatd.policy -p 1099 > /dev/null 2>&1 &
  • java.rmi.server.hostname 指定服务对外的ip或域名
  • java.security.policy 指定安全策略文件

 

JMX服务、jstatd服务启动以后就可以远程通过工具进行连接,进行jvm和相关应用的监控了,工具的使用请参考:【性能监控 APM 二】JMC && jvisualvm && jconsole

 

引用或转载请注明出处。

原文地址:https://www.cnblogs.com/hewei-blogs/articles/17717324.html

参考博文:https://blog.csdn.net/qq_26820793/article/details/130960116

posted @ 2023-09-20 15:31  蓝迷梦  阅读(329)  评论(0)    收藏  举报