Spring Boot Admin 배 갱 안내

Spring Boot Admin 1. x 의 허름 한 페이지 는 직시 할 수 없 지만 2. x 시리즈 로 업데이트 되면 환골탈태 하 는 것 처럼 사용 하기 좋다.
이 블 로 그 는 개인 적 으로 Spring Boot Admin 을 사용 하 는 과정 에서 만난 구 덩이 를 기록 하고 모든 구 덩이 는 상세 한 구 덩이 를 메 우 는 방법 을 첨부 합 니 다.
환경 매개 변수:
  • Spring Boot 2.x
  • Spring Boot Admin 2.x
  • JDK1.8+
  • CentOS

  • 서비스 직접 등록 실패
    흔히 볼 수 있 는 등록 실패 문 제 는 다음 과 같은 두 가지 로 나 눌 수 있다.
  • Spring Boot Admin 서버 와 클 라 이언 트 가 같은 서버 에 없습니다
  • 안전 검사 가 통과 되 지 않 음 을 알 립 니 다
  • 첫 번 째 문제 의 해결 방법:
    클 라 이언 트 에 boot. admin. client. intance. service - url 속성 을 설정 하여 Spring Boot Admin 서버 에서 네트워크 를 통 해 클 라 이언 트 의 데 이 터 를 가 져 올 수 있 도록 해 야 합 니 다 (그렇지 않 으 면 기본 값 은 호스트 이름 으로 가 져 옵 니 다)
      boot:
        admin:
          client:
            url: ${your spring boot admin url}
            username: ${your spring boot admin username}
            password: ${your spring boot admin password}
            instance:
              prefer-ip: true
              service-url: ${your spring boot client url} 

    두 번 째 문제 의 해결 방법:
    우선, 안전 검사 문 제 는 바로 현재 서버 에서 계 정 비밀 번 호 를 설정 한 다음 에 클 라 이언 트 가 등록 할 때 계 정 비밀 번 호 를 제공 하여 로그 인하 여 검 사 를 완성 하 는 것 이다.
    이 과정의 실현 은 Spring 온 가족 통 프로젝트 로 Spring Security 를 사용 하여 해결 하 는 것 을 추천 하기 때문에 검증 에 실패 하면 대부분 Spring Security 의 배치 에 문제 가 생 긴 다.
    다음은 서버 와 클 라 이언 트 를 각각 설정 하여 이 문 제 를 처리 하 는 방법 을 소개 합 니 다.
    서버 설정
    Maven 을 통 해 Spring Security 의존 도 를 불 러 옵 니 다.
    
      org.springframework.boot
      spring-boot-starter-security
    

    서버 의 사용자 이름과 비밀 번 호 를 설정 합 니 다. (클 라 이언 트 가 등록 할 때 이 계 정 비밀 번 호 를 사용 하여 로그 인 합 니 다)
    spring:
      security:
        user:
          name: liumapp
          password: superliumapp

    Spring Security 설정 클래스 작성
    import de.codecentric.boot.admin.server.config.AdminServerProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
    import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
    
    /**
     * file SecuritySecureConfig.java
     * author liumapp
     * github https://github.com/liumapp
     * email [email protected]
     * homepage http://www.liumapp.com
     * date 2018/11/29
     */
    @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");
            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())
                    .ignoringAntMatchers(
                            adminContextPath + "/instances",
                            adminContextPath + "/actuator/**"
                    );
            // @formatter:on
        }
    }

    위의 코드 는 Admin Server Properties 류 에 주의 하 셔 야 합 니 다. 일부 소스 코드 를 탐색 하 십시오.
    @ConfigurationProperties("spring.boot.admin")
    public class AdminServerProperties {
        /**
         * The context-path prefixes the path where the Admin Servers statics assets and api should be
         * served. Relative to the Dispatcher-Servlet.
         */
        private String contextPath = "";
        
        /**
         * The metadata keys which should be sanitized when serializing to json
         */
        private String[] metadataKeysToSanitize = new String[]{".*password$", ".*secret$", ".*key$", ".*$token$", ".*credentials.*", ".*vcap_services$"};
    
        /**
         * For Spring Boot 2.x applications the endpoints should be discovered automatically using the actuator links.
         * For Spring Boot 1.x applications SBA probes for the specified endpoints using an OPTIONS request.
         * If the path differs from the id you can specify this as id:path (e.g. health:ping).
         */
        private String[] probedEndpoints = {"health", "env", "metrics", "httptrace:trace", "httptrace", "threaddump:dump", "threaddump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents", "mappings", "scheduledtasks", "configprops", "caches", "beans"};
        
        //    ...
        
    }

    Admin ServerProperties 가 Spring Boot Admin 의 설정 속성 을 정의 하 는 것 을 발견 할 수 있 습 니 다. 로그 인 도 그 중의 하나 입 니 다. 따라서 저 희 는 Spring Security 설정 류 를 작성 할 때 Admin ServerProperties 를 도입 해 야 합 니 다.
    여기까지 Spring Boot Admin 서버 에서 Spring Security 에 대한 설정 이 끝 났 습 니 다. 클 라 이언 트 의 Security 설정 을 시작 하 겠 습 니 다.
    클 라 이언 트 설정
    우선 클 라 이언 트 에 대해 저 희 는 Spring Boot Admin Client 의존 외 에 Spring Security 의존 도 를 추가 로 도입 해 야 합 니 다.
    
        de.codecentric
        spring-boot-admin-starter-client
        2.0.2
    
    
        org.springframework.boot
        spring-boot-starter-security
    

    이 를 바탕 으로 클 라 이언 트 application. yml 프로필 을 작성 하여 계 정 비밀 번 호 를 설정 합 니 다.
    spring:
      boot:
        admin:
          client:
            url: ${your sba server url}
            username: ${your sba username}
            password: ${your sba password}
            instance:
              service-base-url: ${your client url}

    다음은 클 라 이언 트 의 Spring Security 를 설정 하여 서버 에서 actuator 가 노출 된 데 이 터 를 읽 을 수 있 도록 합 니 다.
    설정 클래스 추가:
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration
    public class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().permitAll()
                    .and().csrf().disable();
        }
    }

    여기 서 안전 검증 으로 등록 에 성공 하지 못 하 는 문 제 를 해결 할 수 있다.
    로그 인 에 성 공 했 지만 로 그 를 표시 할 수 없습니다.
    이 문제 의 발생 원인 은 두 가지 가 있다.
  • 클 라 이언 트 로그 가 파일 로 저장 되 지 않 았 습 니 다
  • 클 라 이언 트 용기 화 배치 후 로그 파일 이 호스트 디스크 에 비치 지 않 았 습 니 다
  • 첫 번 째 상황 에 대해 서 는 해결 방법 이 간단 합 니 다. 시스템 에서 생 성 된 로 그 를 파일 로 저장 하면 됩 니 다.
    logging:
      file: ./log/client.log
      pattern:
        file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"      

    두 번 째 상황 은 비교적 복잡 하 다. 먼저 어떤 도구 로 용 기 를 배치 하 는 지 나 누 어야 하지만 일반적으로 파일 을 통 해 직접 매 핑 하면 된다.
    docker 의 경우 docker 에서 volumes 를 설정 하여 로그 파일 을 매 핑 합 니 다.
    volumes:
      - ./log:/client/log/

    등록 은 성 공 했 지만 정보 표시 가 완전 하지 않 습 니 다.
    가끔 이런 경우 도 있 습 니 다. Spring Boot Admin 클 라 이언 트 등록 서버 는 성공 적 이지 만 통계 페이지 에 표 시 된 데이터 가 너무 적 습 니 다 (로그 란 만 있 을 수 있 습 니 다)
    이러한 문 제 를 일 으 킨 이 유 는 클 라 이언 트 의 actuator 인터페이스 주 소 를 서버 에 방문 하지 않 았 기 때문이다.
    그러면 해결 방법 도 간단 합 니 다. 서버 에서 actuator 를 방문 할 수 있 도록 허락 하면 됩 니 다.
    우선 프로젝트 에 actuator 의존 이 있 는 지 확인 해 야 합 니 다. (일반적으로 spring - boot - admin - starter - client 자체 에 이 의존 이 포함 되 어 있 기 때문에 추가 로 도입 할 필요 가 없습니다)
    
      org.springframework.boot
      spring-boot-starter-actuator
    

    그리고 actuator 포트 를 열 어 client 엔 드 설정 파일 에 다음 과 같은 내용 을 추가 합 니 다.
    management:
      endpoints:
        web:
          exposure:
            include: "*"

    또한 client 와 server 도 메 인 이름 이 다른 상황 이 존재 하 는 것 을 고려 하여 도 메 인 간 도 메 인 을 해결 하고 도 메 인 간 설정 류 를 추가 합 니 다.
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @author liumapp
     * @file CorsConfig.java
     * @email [email protected]
     * @homepage http://www.liumapp.com
     * @date 2018/8/11
     */
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
       
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowCredentials(true)
                    .allowedHeaders("*")
                    .allowedOrigins("*")
                    .allowedMethods("*");
    
        }
    }

    문 제 는 곧 해결 할 수 있다.

    좋은 웹페이지 즐겨찾기