zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【web安全】浅谈web安全之XSS
    【css】浅谈BFC
    nodejs笔记一--模块,全局process对象;
    逼真打字机效果;
    深入理解CSS3 animation的steps
    网址链接收藏
    用hoverclock插件实现HTML5时钟
    JS多种方法实现随机颜色;
    canvas实现跟随鼠标旋转的箭头
    封装insertAfter、addClass、格式化时间
  • 原文地址:https://www.cnblogs.com/cralor/p/9258979.html
Copyright © 2011-2022 走看看