7.4.1代码实现
- 首先,我们需要添加CRaSH需要的依赖包:
implementation 'org.jolokia:jolokia-core:+'
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-remoteshell' implementation 'org.crashub:crash.connectors.telnet:1.3.1' implementation 'de.codecentric:spring-boot-admin-starter-client:1.2.1' |
- 接着我们开启我们的应用,然后执行SSH命令:ssh -p 2000 user@localhost
- 输入密码之后,我们可以看到日志输出:
Using default password for shell access: 40c50992-ab6b-45f4-b17cf8c8e5e94677
- 如果密码是正确的,我们可以看到如下的信息:
- 接下来,我们执行命令:endpoint invoke healthEndpoint,会看到如下的信息输出:
{status=UP, dbCount={status=UP, PublisherRepository={status=UP, count=1}, ReviewerRepository={status=UP, count=0}, AuthorRepository= {status=UP, count=1}, BookRepository={status=UP, count=1}}, diskSpace= {status=UP, total=249804886016, free=2491744256, threshold=10485760}, db={status=UP, database=H2, hello=1}} |
- 如果输入help,你可以看到所有可执行的命令,然后继续添加我们自己CRaSH的命令,这样有能力添加新的发布都到我们的系统中。
- 在src/main/resources下创建我们新的文件夹命名为commands.
- 添加文件名称为publishers.groovy在src/main/resources/commands文件下。添加内容如下:
package commands import org.crsh.cli.Option import org.crsh.cli.Usage import org.crsh.cli.Command import org.crsh.command.InvocationContext import org.springframework.beans.factory.BeanFactory import org.test.bookpub.entity.Publisher import org.test.bookpub.repository.PublisherRepository @Usage("Publisher management") class publishers { @Usage("Lists all publishers") @Command def list(InvocationContext context) { PublisherRepository repository = getPublisherRepository(context) if (repository) { repository.findAll().each{publisher -> context.provide([id:publisher.id, name:publisher.name]) } } else { return "PublisherRepository is not found!" } } @Usage("Add new publisher") @Command def add(@Usage("publisher name") @Option(names=["n","name"]) String name, InvocationContext context) { PublisherRepository repository = getPublisherRepository(context) if (repository) { publisher = new Publisher(name) try { publisher = repository.save(publisher) return "Added new publisher ${publisher.id} -> ${publisher.name}" } catch (Exception e) { return "Unable to add new publisher named ${name}\n${e.getMessage()}" } } else { return "PublisherRepository is not found!" } } @Usage("Remove existing publisher") @Command def remove(@Usage("publisher id") @Option(names=["i","id"]) String id, InvocationContext context) { PublisherRepository repository = getPublisherRepository(context) if (repository) { try {repository.delete(Long.parseLong(id)) return "Removed publisher ${id}" } catch (Exception e) { return "Unable to remove publisher with id ${id}\n${e.getMessage()}" } } else { return "PublisherRepository is not found!" } } def getPublisherRepository(InvocationContext context) { BeanFactory bf = context.getAttributes().get("spring.beanfactory") PublisherRepository repository = bf.getBean(PublisherRepository) return repository } } |
- 命令创建之后,现在我们开启我们的应用,然后执行SSH命令:ssh -p 2000 user@localhost
- 我们输入publishers, 我们可以看到如下的信息:
- 让我们添加一具publisher,执行命令是:publishers add --name "Fictitious Books" 。之后,我们可以看到这样的输出:Added new publisher 2 -> Fictitious Books
- 如果我们输出publishers list, 我们会看到所有的列表:
- 远程的命令是:publishers remove --id 2,之后你会看到信息是:Removed publisher 2
- 确认我们的publisher已经在运行了,所以我们执行publishers list可以看到如下的信息:
Available Publishers: id -> name |