文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Spring Boot Admin是一款很酷的仪表板,用于监视你的spring boot应用。然而,设置它并不是那么简单。 文档概述了两种选项

  • 在启动应用程序(boot application)中包含连接到管理应用程序(admin application )的客户端库 - 这需要将管理应用程序部署到公有或至少能从应用程序访问的位置,并使您的应用程序意识到它正在被监视。
  • 使用云发现(cloud discovery),这意味着您的应用程序是服务发现基础设施( service discovery infrastructure)的一部分,例如,使用微服务
第 1 段(可获 1.06 积分)

对于更简单的场景,两者都不是很好的选择,例如在一些IaaS上运行的单片应用程序,并将您的管理应用程序部署在本地机器或当地公司的一些基础设施中。 如果您尚不需要云发现,那么这种做法就是过度使用了,包括客户端库引入了使你的应用程序可以访问管理服务器的复杂性,而不是相反。 此外,这种双向依赖听起来是错误的。

幸运的是,有一个非正式的,但是实现了SimpleDiscoveryClient,它可以使用一些与机器无关的配置简单地运行Spring Boot Admin并将其连接到你的spring boot应用程序。

第 2 段(可获 1.3 积分)

首先需要在你的boot应用程序中设置spring boot actuator。 Actuator公开了admin应用程序所需的所有端点(endpoint)。 这听起来很简单- 你只需添加一堆依赖关系,并可能需要指定一些配置参数,就是这样。 实际上,在实际的应用程序中,可不是那么容易 - 特别是关于actuator端点的基本身份认证。 您需要一个单独的spring-security(除了现有的spring-security配置之外),以便仅将基本验证应用于actuator端点。 例如。:

第 3 段(可获 1.2 积分)
@Configuration
@Order(99) // 默认的安全配置顺序是 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);

    }
}

 

 

第 4 段(可获 2 积分)

这有点违反直觉,但它确实有效。 不知道这是不是习惯用法 - 使用spring security和spring boot你永远不会知道什么是习惯用法。 注意 - 据说应该可以让security.user.name(和密码)自动包含在一些管理器中,但是我没有找到这样的用法,所以我只在内存中实例化了一个。 请注意/manage/** 路径 - 为了使所有actuator 端点在该路径下,您需要在应用程序属性文件中指定management.context-path=/manage。

现在actuator端点已经设置,我们必须绑定上我们的spring admin应用程序。 看起来像这样:

第 5 段(可获 1.23 积分)
@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() {
        // 我们必须触发此事件来启动服务注册
        InstanceRegisteredEvent<?> event = new InstanceRegisteredEvent<>("prod", null);
        // 因为某些原因导致发布失败,因此我们直接调用
        listener.onInstanceRegistered(event);
    }
}
第 6 段(可获 2 积分)

通常,应该注入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=*

 

第 7 段(可获 0.66 积分)

它是做什么用的呢? 它使用SimpleDiscoveryClient通过自动配置实例化。 实际上,直到最新版本之前该客户端都不能工作 - 它抛出NullPointerException异常,因为(处理用户名和密码的)元数据始终为空。 在1.2.2版本的cloud-commons中,修复了它们:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-commons</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

简单发现客户端(simple discovery client)其实就是 - 你指定boot应用程序的URL,它会定期从actuator端点获取数据。 为什么它没被记录,为什么直到最近才实际工作 - 我也不知道。 此外,我也不知道为什么你必须手动发送触发发现的事件。 也许这不是惯用的,但它不会自动发生,这使得它可以工作。

第 8 段(可获 1.63 积分)

照例,那些看上去“刚好可用”和“设置简单”的东西,其实并不是这样。 如果你有比Hello World稍微复杂一点的东西,你必须深挖一些晦涩的类,然后尝试一些“野路子”。 幸运的是,在本例中,它实际上是有效的,而不是需要丑陋的解决方法。

第 9 段(可获 0.61 积分)

文章评论

访客
<script>alert("close me!")</script>