【性能监控 APM 一】JMX && jstatd
【性能监控 APM 二】JMC && jvisualvm && jconsole
【性能监控 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
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/17717324.html

浙公网安备 33010602011771号