티스토리 뷰

728x90

선행 작업

Spring Boot Actuator가 설정되어 있어야합니다. (2019/12/30 - [프레임워크/스프링 & 스프링 부트] - Spring boot actuator)

 

Spring Boot Admin?

  • Spring Boot Atuator를 사용하면 모든 리소스 내용을 볼수 있지만 json text형식이라 한눈에 파악하기 힘든점이 있음.
  • Spring Boot Admin을 사용하면 Actuator의 내용을 실시간 형태의 Dashboard로 손쉽게 파악이 가능하다. (물론 설정은 나의몫...)

Spring Boot Admin DashBoard


고정 서버 환경 (No Cloud Environment)

Spring Boot Admin 서버와 Actuator EndPoint를 제공하는 Client 서버가 고정적일 때의 설정입니다.

Spring Boot Admin Server설정

Gradle Depengency 추가

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'de.codecentric:spring-boot-admin-starter-server'
implementation 'org.springframework.boot:spring-boot-starter-security'

자바 설정 코드 설정

@SpringBootApplication
@EnableAdminServer
@EnableScheduling // notification 사용시 필요
public class CsAdminApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CsAdminApplication.class, args);
    }
 
}

Security 설정

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    private final AdminServerProperties adminServer;
 
    public SecuritySecureConfig(AdminServerProperties adminServer) {
        this.adminServer = adminServer;
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        String contextPath = this.adminServer.getContextPath();
 
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");
 
        http.authorizeRequests()
            .antMatchers(contextPath + "/assets/**").permitAll()
            .antMatchers(contextPath + "/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage(contextPath + "/login").successHandler(successHandler).and()
            .logout().logoutUrl(contextPath + "/logout").and()
            .httpBasic().and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .ignoringAntMatchers(
                contextPath + "/instances",
                contextPath + "/actuator/**"
            );
    }
}

security application.yml 설정

spring:
  security:
    user:
      name: {{username}}
      password: {{password}}
  boot:
    admin:
      ui:
        brand: <img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>
        title: Spring Boot Admin

Spring Boot Admin Client Server설정

Gradle Depengency 추가

compile group: 'de.codecentric', name: 'spring-boot-admin-starter-client', version: '2.1.5'

application.yml 설정

spring:
  boot:
    admin:
      client:
        url: http://localhost:8081 # Spring Boot Admin Server URL
        instance:
          metadata:
            # Spring Boot Admin Server에서 Client의 Actuator endpoint에 접근 인증시 사용
            user:
              name: {{username}}
              password: {{password}}
        # Client가 Spring Boot Admin에 접근 인증시 사용
        username: {{username}}
        password: {{password}}

 


클라우드 서버 환경 (Kubernetes)

kubernetes설정에 대해 설명이 부족해 애먹었음

클라우드 환경의 경우 어드민 서버 및 클라이언트 서버의 IP가 수시로 바뀌기 때문에 위의 설정대로 할수가 없음.

Spring Boot Admin 설정

Gradle Depengency 추가

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'de.codecentric:spring-boot-admin-starter-server'
implementation 'org.springframework.boot:spring-boot-starter-security'
 
 
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter', version: '2.1.1.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-kubernetes', version: '1.0.1.RELEASE'

자바 설정 코드 설정

@SpringBootApplication
@EnableAdminServer
@EnableScheduling // notification 사용시 필요
public class CsAdminApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CsAdminApplication.class, args);
    }
 
}

Security 설정

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    private final AdminServerProperties adminServer;
 
    public SecuritySecureConfig(AdminServerProperties adminServer) {
        this.adminServer = adminServer;
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        String contextPath = this.adminServer.getContextPath();
 
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");
 
        http.authorizeRequests()
            .antMatchers(contextPath + "/assets/**").permitAll()
            .antMatchers(contextPath + "/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage(contextPath + "/login").successHandler(successHandler).and()
            .logout().logoutUrl(contextPath + "/logout").and()
            .httpBasic().and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .ignoringAntMatchers(
                contextPath + "/instances",
                contextPath + "/actuator/**"
            );
    }
}

security application.yml 설정

spring:
  security:
    user:
      name: {{username}}
      password: {{password}}
  boot:
    admin:
      ui:
        brand: <img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>
        title: Spring Boot Admin

application.yml 설정

spring:
  boot:
    admin:
      discovery:
        # Service Discovery시 무시할 서비스
        ignored-services: 'kubernetes'
        converter:
          # Spring Boot Client의 Actuator endpoint를 임의로 변경하였으므로 Admin Server에서 접근할수 있게 맞춰준다.
          management-context-path: '/secure/actuator'

Spring Boot Client 설정

Application.class에 @EnableDiscoveryClient 추가

service discovery?

클라우드 환경에서는 서버가 오토 스케일링등에 의해서 동적으로 생성되거나 컨테이너 기반의 배포로 인해서, 서비스의 IP가 동적으로 변경된다.
그래서 서비스 클라이언트가 서비스를 호출할때 서비스의 위치 (즉 IP주소와 포트)를 알아낼 수 있는 기능이 필요한데, 이것을 바로 서비스 디스커버리 (Service discovery)라고 한다.
출처: https://bcho.tistory.com/1252 [조대협의 블로그]
@SpringBootApplication
@EnableDiscoveryClient // Service Discovery가 가능하게 어노테이션 추가
public class Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 
}

고정 서버와 달리 Kubernetes환경에서 Admin Server가 Client Atuator 접근시 인증을
Client서버의 Service 메타 데이터를 가지고 사용함.

Client의 Service의 metadata에 현재 설정된 security 정보를 등록한다.

apiVersion: v1
kind: Service
metadata:
  labels:
    user.name: {{username}}
    user.password: {{password}}
  name: spring-boot-admin-svc
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: spring-boot-admin

출처

728x90

'프레임워크 > 스프링 & 스프링 부트' 카테고리의 다른 글

Spring STOMP  (0) 2023.03.22
Spring boot actuator  (0) 2019.12.30
Spring Boot - ORM(Object-relational mapping)  (0) 2019.08.10
Spring Boot - MVC  (0) 2019.08.10
Spring Boot - @SpringBootApplication  (0) 2019.08.10
댓글