我们还可以通过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访问的密码,如图
这样就可以通过下面信息登录我们的程序(SSH客户端可使用puTTY、SecureCRT等),登录界面如图
主机:localhost
端口:2000
账号:user
密码:上面截图
登录后的效果如图
11.3.3 常用命令
(1)help
输入help命令,获得命令列表,如图
(2)metrics
输入metrics命令,效果如图
(3)endpoint
输入下面命令获得端点列表,如图
endpoint list
调用某一个端点,如调用health,如图
endpoint invoke health
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为我们定制的命令,如图
如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命令,可获得如图所示结果