Spring Boot Admin是一个不错的仪表板,用于监视您的Spring Boot应用程序。 但是,设置它并不是一件容易的事。 该文档概述了两个选项 :
- 在连接到admin应用程序的启动应用程序中包括一个客户端库–这要求将admin应用程序部署在公共位置或至少可以从您的应用程序访问的地方,并且还需要使您的应用程序知道它正在受到监视。
- 使用云发现,这意味着您的应用程序是服务发现基础结构的一部分,例如使用微服务
对于更简单的方案(例如在某些IaaS上运行的整体应用程序以及将您的管理应用程序部署在本地计算机或某些本地公司基础结构中),这两者都不是很好的选择。 如果您不需要云发现,那就太过头了,并且包括一个客户端库会引入使应用程序可以访问管理服务器的复杂性,反之亦然。 而且,这种双向依赖听起来是错误的。
幸运的是,有一个未记录但已实现的SimpleDiscoveryClient
,使您可以在任何计算机上简单地运行带有某些配置的Spring Boot Admin并将其连接到Spring Boot应用程序。
首先要求是在引导应用程序中设置弹簧引导执行器 。 执行器公开了管理应用程序运行所需的所有端点。 设置听起来很简单–您只需添加一堆依赖项并可能指定一些配置参数即可。 实际上,在实际应用中并不是那么容易–尤其是关于执行器端点的基本认证。 为了将基本身份验证仅应用于执行器端点,您需要一个单独的spring-security(除了现有的spring-security配置之外)。 例如:
@Configuration
@Order(99) // the default security configuration has order 100
public class ActuatorSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${security.user.name}")
private String username;
@Value("${security.user.password}")
private String password;
@Override
protected void configure(HttpSecurity http) throws Exception {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername(username).password(password).roles("ACTUATOR","ADMIN").build());
http.antMatcher("/manage/**").authorizeRequests().anyRequest().hasRole("ACTUATOR").and().httpBasic()
.and().userDetailsService(manager);
}
}
这有点违反直觉,但是可以。 不知道这是否是惯用的-借助弹簧安全性和弹簧靴,您永远都不知道什么是惯用的。 注意–据称应该可以在某些管理器中自动包含security.user.name
(和密码),但是我找不到它,因此我只实例化了一个内存中的实例。 注意/manage/**
路径–为了使所有执行器端点都在该路径下,您需要在应用程序属性文件中指定management.context-path=/manage
。
现在已经设置了执行器端点,我们必须附加我们的spring admin应用程序。 看起来像这样:
@Configuration
@EnableAutoConfiguration
@PropertySource("classpath:/application.properties")
@EnableAdminServer
public class BootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(BootAdminApplication.class, args);
}
@Autowired
private ApplicationDiscoveryListener listener;
@PostConstruct
public void init() {
// we have to fire this event in order to trigger the service registration
InstanceRegisteredEvent<?> event = new InstanceRegisteredEvent<>("prod", null);
// for some reason publising doesn't work, so we invoke directly
listener.onInstanceRegistered(event);
}
}
通常,应该注入ApplicationEventPublisher
并将消息推送到此处,而不是直接调用侦听器,如上所示。 我没有设法使其轻松工作,所以我解决了这个问题。
提到的application.properties文件应该位于src / main / resources中,如下所示:
spring.cloud.discovery.client.simple.instances.prod[0].uri=https://your-spring-boot-application-url.com
spring.cloud.discovery.client.simple.instances.prod[0].metadata.user.name=<basic-auth-username>
spring.cloud.discovery.client.simple.instances.prod[0].metadata.user.password=<basic-auth-password>
spring.boot.admin.discovery.converter.management-context-path=/manage
spring.boot.admin.discovery.services=*
那是在做什么 它使用由自动配置实例化的SimpleDiscoveryClient
。 实际上,该客户端直到最新版本都无法使用–抛出NullPointerException,因为元数据(处理用户名和密码)始终为空。 在1.2.2版的云中,他们修复了该问题:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
简单发现客户端就是这样-您指定启动应用程序的URL,它会定期从执行器端点获取数据。 为什么没有记录下来,为什么直到最近才真正起作用?我不知道。 另外,我不知道您为什么必须手动发送触发发现的事件。 也许这不是惯用语言,但是它不会自动发生,因此可以正常工作。
像往常一样,“工作正常”并且具有“简单的设置” –从来没有像现在这样。 如果您有比问候世界稍微复杂的东西,则必须挖一些晦涩难懂的课程并“越野”。 幸运的是,在这种情况下,它确实有效,而不是所需的丑陋解决方法。
翻译自: https://www.javacodegeeks.com/2017/07/simple-spring-boot-admin-setup.html