spring boot 2.0.3+spring cloud (Finchley)8、微服務監控Spring Boot Admin


參考:Spring Boot Admin 2.0 上手

Spring Boot Admin 用於管理和監控一個或多個Spring Boot程序,在 Spring Boot Actuator 的基礎上提供簡潔的可視化 WEB UI,提供如下功能:

  • 顯示 name/id 和版本號
  • 顯示在線狀態
  • Logging 日志級別管理
  • JMX beans 管理
  • Threads 會話和線程管理
  • Trace 應用請求跟蹤
  • 應用運行參數信息,如:
    • Java 系統屬性
    • Java 環境變量屬性
    • 內存信息
    • Spring 環境屬性

使用Spring Boot Admin監控Spring Cloud微服務

首先需要一個服務注冊中心Eureka Server,讓Spring Boot Admin(以下簡稱 SBA)服務端向它注冊服務。

服務端

在主Maven工程下新建Moeule工程admin-server,pom文件引入依賴。其中SBA的依賴必需在dependency中指定version版本號(包括server和client),用spring boot initializer自動建工程,引入依賴時,版本號會寫在properties中,<spring-boot-admin.version>2.0.1</spring-boot-admin.version>,而在我的測試中,這樣並不能起作用,不能引入依賴。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cralor</groupId>
    <artifactId>admin-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>admin-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.cralor</groupId>
        <artifactId>chap12-admin</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

啟動類加上注解@EnableAdminServer

@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {

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

配置文件配置端口號、程序名、服務注冊中心地址。

server:
  port: 5000
spring:
  application:
    name: admin-server
eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/

客戶端

在建立了我們的服務端之后,我們可以將一個 Spring Boot 應用程序注冊為客戶端。注冊客戶端有兩種方式,一種就是通過引入 SBA Client,另外一種是基於 Spring Cloud Discovery。我們這里先介紹通過引入 SBA Client 的方式。

SBA Client

新建工程admin-client。pom文件引入依賴,客戶端需要引入actuator依賴,服務端不需要。

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.0.1</version>
</dependency>

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

配置文件:SBA服務端http://localhost:5000,actuator監控暴露全部端口,顯示所有信息。

server:
  port: 8762
spring:
  application:
    name: admin-client
  boot:
    admin:
      client:
        url: http://localhost:5000
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10 #表示eureka client發送心跳給server端的頻率,默認為30秒
    health-check-url-path: /actuator/health #健康檢查的地址(依賴spring-boot-starter-actuator)
  client:
    registryFetchIntervalSeconds: 5 #表示eureka client間隔多久去拉取服務注冊信息,默認為30秒
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS

依次啟動eureka-server、admin-server和admin-client(兩個客戶端8762、8763)。訪問SBA服務端http://localhost:5000

Wallboard:

 Applications:

 Journal:

 Instance details:

Spring Cloud Discovery

如果我們的項目中使用了 Spring Cloud,那么我們其實並不用通過 SBA Client 來向 SBA 注冊,而是讓 SBA 通過注冊中心(Eureka、Consul 等)來發現服務。這里以 Eureka 作為注冊中心來說明。

 在admin-client中只需要改變引入的依賴,其他不需要改變。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!--<dependency>-->
    <!--<groupId>de.codecentric</groupId>-->
    <!--<artifactId>spring-boot-admin-starter-client</artifactId>-->
    <!--<version>2.0.1</version>-->
<!--</dependency>-->

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

重啟 SBA 服務端和客戶端,就能看的和使用 SBA Client 一樣的效果了。

在Spring Boot Admin中集成Turbine

 因為SBA最新版本為2.0.1,而spring-boot-admin-server-ui-turbine的版本為1.5.7,整合會出現問題,暫時不做測試。。。

安全配置,在Spring Boot Admin中添加安全登陸界面

SBA 服務端可以訪問客戶端的敏感端點,因此手冊上 建議我們應該為服務端和客戶端添加一些安全配置。

服務端的安全配置

向服務端添加 Spring Security 依賴

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

配置文件設置賬號密碼,並添加一些配置

server:
  port: 5000
spring:
  application:
    name: admin-server
  security:
    user:
      name: 'admin'
      password: 'admin'
eureka:
  client:
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
  instance:
    leaseRenewalIntervalInSeconds: 10
    health-check-url-path: /actuator/health
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

新增一個安全配置類。

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");

        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().disable();
        // @formatter:on
    }

}

一個簡單的安全配置就完成了,訪問 http://localhost:5000 就會發現需要認證了。

 

如果這時你的客戶端是使用的 SBA Client 的方式,你會注意到客戶端這時已無法再注冊到服務端了(Spring Cloud Discovery 的話不受影響)。為了能將客戶端注冊到服務端,我們還必須在客戶端的配置文件中添加以下內容:

spring.boot.admin.client:
  username: "admin"
  password: "admin"

因為 SBA 客戶端的注冊方式有兩種,所以在客戶端的安全配置上也是分為了兩種。下面我們來為客戶端增加安全配置。

客戶端的安全配置

SBA Client

客戶端的配置文件

server:
  port: 8762
spring:
  application:
    name: admin-client
  security:
    user:
      name: "client"
      password: "client"
  boot:
    admin:
      client:
        url: http://localhost:5000
        username: "admin"
        password: "admin"
        instance:
          metadata:
             user.name: ${spring.security.user.name}
             user.password: ${spring.security.user.password}
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10 #表示eureka client發送心跳給server端的頻率,默認為30秒
    health-check-url-path: /actuator/health #健康檢查的地址(依賴spring-boot-starter-actuator)
  client:
    registryFetchIntervalSeconds: 5 #表示eureka client間隔多久去拉取服務注冊信息,默認為30秒
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS

重啟 SBA Server 和 Clients 可看到效果。

Spring Cloud Discovery

配置文件

server:
  port: 8762
spring:
  application:
    name: admin-client
  security:
    user:
      name: "client"
      password: "client"

eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
    health-check-url-path: /actuator/health
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}
  client:
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

重啟 SBA Server 和 Clients 。

(ps:在我的測試中,SBA client和Spring Cloud Discovery,不管用這兩個配置文件的哪一個都可以...)

Eureka 的 metadataMap

Eureka 中的 metadataMap 是專門用來存放一些自定義的數據,當注冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 里取。實際上,每個 instance 都有各自的 metadataMap,map 中存放着需要用到的屬性。例如,上面配置中的 eureka.instance.metadata-map.user.name,當這個服務成功注冊到 Eureka 上,Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 里的屬性,然后放入請求頭,向此服務發送請求,訪問此服務的 Actuator 開放的端點。

關於 SBA 的更多認證方式可以參見 joshiste/spring-boot-admin-samples

 

 案例代碼地址:https://github.com/cralor7/springcloud

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM