1. 程式人生 > >springbootadmin微服務監控

springbootadmin微服務監控

最近公司需要調研一套微服務監控,摸索了一下prometheus和springbootadmin最終還是覺得springbootadmin更好用所以就記錄一下自己的學習歷程

首先springbootadmin(以下簡稱SBA)是基於springboot  actuator的也是通過/actuator/health去拉取每個服務的statusInfo的

其次SBA有兩種實現方式springboot和SBA版本2.0.4,springcloud是F版本

1.基於server和client的服務端和客戶端模式

server端加入依賴

 <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

啟動類:

@SpringBootApplication
@EnableAdminServer
//@EnableDiscoveryClient
public class SpringbootadminApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootadminApplication.class, args);
    }

//    @Configuration
//    public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
//        @Override
//        protected void configure(HttpSecurity http) throws Exception {
//            http.authorizeRequests().anyRequest().permitAll()
//                    .and().csrf().disable();
//        }
//    }
}

配置檔案:

spring.application.name=admin-server

server.port=8009

啟動服務訪問localhost:8009就可以看到ui頁面了,如下:

client客戶端依賴:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.0.4</version>
        </dependency>

啟動類:

@SpringBootApplication
//@EnableDiscoveryClient
//@EnableEurekaClient
public class SpringbootadminclientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootadminclientApplication.class, args);
    }
}

配置檔案:

spring.application.name=admin-client

server.port=8010

spring.boot.admin.client.url=http://localhost:8009 #申明SBA的地址

management.endpoints.web.exposure.include=* #SpringBoot 2.x版本所有節點預設關閉的,這裡開啟是為了SBA過來獲取該服務狀態時候可以訪問/actuator/health介面

第二種實現方式是基於springcloud的實現模式,這種實現模式也很簡單,我們只需要在server端加入一個

@EnableDiscoveryClient註解,SBA就會主動去拉取註冊中心的註冊服務列表,從而獲取他們的服務動態資訊

官方文件上是這麼說的:The Spring Boot Admin Server can use Spring Clouds DiscoveryClient to discover applications. The advantage is that the clients don’t have to include the spring-boot-admin-starter-client. You just have to add a DiscoveryClientimplementation to your admin server - everything else is done by AutoConfiguration.

程式碼實現如下:

我們只需要在server的啟動類上加一個註解即可

@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient//加入該註解即可
public class SpringbootadminApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootadminApplication.class, args);
    }

//    @Configuration
//    public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
//        @Override
//        protected void configure(HttpSecurity http) throws Exception {
//            http.authorizeRequests().anyRequest().permitAll()
//                    .and().csrf().disable();
//        }
//    }
}

配置檔案中加入註冊中心的地址:

spring.application.name=admin-server

server.port=8009

eureka.client.service-url.defaultZone=http://localhost:8001/eureka  #加入該配置

management.endpoints.web.exposure.include=*

啟動服務就可以看到註冊到註冊中心的所有服務都會被監控,這裡要特別注意一點就是,如果springboot用的版本2的話,所有的服務都要手動配置開啟/actuator/health節點的訪問許可權,下圖EUREKA-CLIENT就是沒有手動開啟導致的(其實服務是up狀態)

下圖是註冊中心已經註冊的服務列表,在上路中都被監控了,這也說明這個思路是沒錯的

接下來再說一說SBA的授權認證問題

因為服務比較多,不可能直接訪問ip埠就可以檢視所有服務狀態的,所以需要做一個登入認證

這個只需要加入一下依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

然後再加入配置類:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

    public SecurityConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()
                .anyRequest().authenticated()
                .and()
                 //上邊程式碼是為了允許所有人訪問靜態資源和登入頁面
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf()
              .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())//Cookie啟用CSRF保護
                .ignoringAntMatchers(
                        adminContextPath + "/instances",
                        adminContextPath + "/actuator/**"
                );//禁用執行器端點的CRSF保護

    }
}

 接下來需要在配置檔案配置使用者名稱和密碼

spring.security.user.name=admin

spring.security.user.password=admin

如果你是使用方式一(server-client的方式)你需要在你的server配置中加入以下配置進行授權

spring.boot.admin.client:
    url: client的地址
    instance:
      metadata:
        user.name: ${spring.security.user.name}
        user.password: ${spring.security.user.password}

如果你是使用方式二(註冊中心拉取服務列表的方式)需要加入以下配置進行授權

eureka:
  instance:
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}

加入以上配置和程式碼之後重啟服務再次訪問server的ip埠就會是一個登入頁面輸入配置檔案的使用者名稱和密碼就可以檢視監控資訊了

最後在說一個發郵件的功能,一般發郵件都是自己手寫一個JavaMailSender,這裡我們只需要配置一下自己的郵件資訊就可以傳送了,所以是很方便簡潔的,配置如下:

spring.boot.admin.notify.mail.enabled=true//開啟郵件通知功能
spring.mail.host=smtp.xxx.com
spring.mail.port=25
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
#spring.mail.properties.mail.smtp.starttls.enable=true
#spring.mail.properties.mail.smtp.starttls.required=true

[email protected]//傳送者
[email protected]//抄送
[email protected]//發給誰

這樣配置完成重啟服務如果有服務DOWN或者UP就會發送郵件通知

好了以上只是一些主題功能,還有很多通知可以手動開啟實現就不一一列出來了,我也沒研究,哈哈只研究了一下郵件,還有日誌級別也可以在這裡修改等等

官網地址:http://codecentric.github.io/spring-boot-admin/2.0.4/#_securing_spring_boot_admin_server