我们还可以通过SSH或TELNET监控和管理我们的应用,这一点Spring Boot是借助CraSH(http://www.crashub.org)来实现的。在应用中,我们只需在Spring Boot项目中添加spring-boot-starter-remote-shell依赖即可。

11.3.1 新建Spring Boot项目

新建Spring Boot项目,依赖为Remote Shell(spring-boot-starter-remote-shell)。
项目信息:

groupId:com.wisely
arctifactId:ch11_3
package:com.wisely.ch11_3

11.3.2 运行

启动程序,此时控制台会提示SSH访问的密码,如图
Spring Boot实战(十一)应用监控 11.3 SSH
这样就可以通过下面信息登录我们的程序(SSH客户端可使用puTTY、SecureCRT等),登录界面如图

主机:localhost
端口:2000
账号:user
密码:上面截图

Spring Boot实战(十一)应用监控 11.3 SSH
登录后的效果如图
Spring Boot实战(十一)应用监控 11.3 SSH

11.3.3 常用命令

(1)help

输入help命令,获得命令列表,如图
Spring Boot实战(十一)应用监控 11.3 SSH

(2)metrics

输入metrics命令,效果如图
Spring Boot实战(十一)应用监控 11.3 SSH

(3)endpoint

输入下面命令获得端点列表,如图

endpoint list

Spring Boot实战(十一)应用监控 11.3 SSH
调用某一个端点,如调用health,如图

endpoint invoke health

Spring Boot实战(十一)应用监控 11.3 SSH

11.3.4 定制登录用户

我们可以通过在application.properties下定制下面的属性,实现用户的账号密码的定制:

shell.auth.simple.user.name=lmz
shell.auth.simple.user.password=lmz

11.3.5 扩展命令

可以在spring-boot-starter-remote-shell.jar中看到Spring Boot为我们定制的命令,如图
Spring Boot实战(十一)应用监控 11.3 SSH
如beans.groovy的代码为:

package commands

import org.springframework.boot.actuate.endpoint.BeansEndpoint

class beans {

	@Usage("Display beans in ApplicationContext")
	@Command
	def main(InvocationContext context) {
		def result = [:]
		context.attributes['spring.beanfactory'].getBeansOfType(BeansEndpoint.class).each { name, endpoint ->
			result.put(name, endpoint.invoke())
		}
		result.size() == 1 ? result.values()[0] : result
	}

}

需要特别指出的是,这里使用了Groovy语言来编制命令,Groovy语言是由Spring主导的运行于JVM的动态语言,是可以替代java作为开发语言的。在这里还需说明的是,Spring Boot即可以用Java语言开发,也可以用Groovy语言开发,本文为了减少学习曲线,以及考虑绝大数读者的使用现状,所以没有对Groovy语言及Groovy开发Spring进行介绍,读者如有兴趣可自行学习Groovy。
另一个值得注意的是InvocationContext,我们可以通过InvocationContext获得下表所示的属性。

属性名 描述
spring.boot.version Spring Boot 的版本
spring.version Spring框架的版本
spring.beanfactory 访问Spring的BeanFactory
spring.enviroment 访问Spring的Enviroment

这里将以Groovy语言演示一个命令的定制,命令可以放在以下目录,Spring Boot会自动扫描:

classpath*:/commands/**
classpah*:/crash/commands/**

在src/main/resources下新建commands文件夹,新建hello.groovy,内容如下:

package commands
import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext
class hello{
	@Usage("Say Hello") //使用@Usage注解解释该命令的用途。
	@Command      //使用@Command注解当前是一个CRaSH命令
	def main(InvocationContext context) {
	
		def bootVersion = context.attributes['spring.boot.version']; //获得Spring Boot的版本,注意Groovy的方法和变量声明关键字为def
		def springVersion = context.attributes['spring.version']  //获得Spring框架的版本
		
		return "Hello,your Spring Boot version is "+bootVersion +",your Spring Framework version is "+springVersion   //返回命令执行结果
		
	}
}

运行
此时我们运行程序,并以SSH客户端登录,输入hello命令,可获得如图所示结果
Spring Boot实战(十一)应用监控 11.3 SSH

相关文章: