티스토리 뷰

이번엔 Gateway에 Config Server를 연동할 예정입니다.

User-Service의 Login은 토큰을 발급하는데 해당 토큰은 Secret에 따라서 바뀌게 됩니다.

Gateway에 인증 시스템이 있으니 User-Service의 Secret 값이 바뀌면 당연히 Gateway의 Secret값도 

동일한 값으로 변경되어야 합니다. 서론이 너무 길었네요 바로 시작하겠습니다.


#pom.xml

user-service와 동일하게 dependency를 추가해줍니다.

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

#bootstrap.yml

bootstrap Server의 접속 정보를 설정합니다.

spring:
   cloud:
      config:
         uri: http://127.0.0.1:8888
         name: ecommerce

#application.yml

application.yml의 route 정보를 수정해줍니다. gateway에서 User-Service에 원활하게 접속할 수 있도록 

/user-service/actuator/** Path를 추가해줍니다. RewritePath 정보도 추가해줘야 원활하게 동작이 됩니다.

/user-service/actuator/**  에서 /actuator/** 형태로 Rewrite해줘야 하기 때문입니다.

! routes: 

- id: user-service
  uri: lb://USER-SERVICE
  predicates:
     - Path=/user-service/actuator/**
     - Method=GET,POST
  filters:
     - RemoveRequestHeader=Cookie
     - RewritePath=/user-service/(?<segment>.*),/$\{segment}
     - AuthorizationHeaderFilter

 

그리고 Actuator의 설정을 진행해줍니다. 저번과 달라진 것은 httptrace옵션을 추가할 것인데 

해당 옵션은 Bean이 있어야 동작합니다. 밑에서 바로 추가해주겠습니다.

management:
   endpoints:
      web:
         exposure:
            include: refresh, health, beans, httptrace

#ApigatewayServiceApplication.java

Application 클래스에서  @Bean Annotation을 통해서 httpTraceRespository 메서드를 정희해줍니다.

return값으로는 HttpTrace와 관련된 정보를 담아줍니다.

package com.example.apigatewayservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableEurekaClient
public class ApigatewayServiceApplication {

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

   @Bean
   public HttpTraceRepository httpTraceRepository(){
      return new InMemoryHttpTraceRepository();
   }

}

#ecommerce.yml

이제 ecommerce.yml 파일을 다시 수정해줍니다.

token:
   expiration_time: 86400000
   secret: ggpark_token

gateway:
  ip: 0.0.0.0

git에서 commit하는 것으로 마무리 짓습니다.

git add ecommerce.yml

git commit -m "changed some values"

#Test Case 1

테스트를 진행합니다. 다만, 주의하실점은 User-Service와 Gateway-Service를 재시작 해주시길 바랍니다.

상기의 과정을 진행하지 않으면 token인증에 실패해 404에러 폭탄을 맞습니다. 

회원등록 > 로그인 > 토큰복사 > 인증 토큰을 활용한 /actuator/health 접근 과정을 진행하면

아래와 같은 화면이 출력됩니다.  "status": "UP" 이 나오면 정상적으로 실행된겁니다.

 


#ecommerce.yml

그럼 이제 다시 ecommerce.yml파일을 수정해줍니다.

바뀌었음을 명시적으로 알기위해서 changed를 붙혀줬습니다. 

Cmd를 통해서 Commit하는 과정도 잊지 말고 진행해주세요!!! 제일 중요해요!!! 

token:
   expiration_time: 86400000
   secret: ggpark_token_changed

gateway:
  ip: 0.0.0.0

#TestCase 2

실제 테스트를 진행합니다. 일단 user-service의 actuator에 접근해 config정보를 Refresh 해줍니다.

아래와 같은 메시지가 출력되면서 200 OK가 출력된다면 성공입니다. 

POST 형태로 보내주는것 잊지말아주세요!

Health_Check를 해보면 다음과 같이 변경이 되어 있습니다.

이번엔 Gateway의 Config 정보를 Refresh해줍니다. 

재 로그인을 진행해줍니다. Token Value가 이제 바뀐 token.secret에 따라서 변경됩니다. 

해당 내용을 다시 복사해줍니다.

다시 해당 토큰 값을 이용해서 health_check를 진행해줍니다.

 

해당 토큰값을 이용하지 않으면 404에러를 출력합니다. 인증에 사용된 secret가 변경됨에 따라서 인증 Token값도 변경되기 때문에 기존의 바뀌기전의 값의 Token값은 더 이상 동작하지 않기에 Gateway와 User-Service 모두 Refresh 한 뒤에 재 로그인 과정을 통해서 토큰을 재 발급 받아야 합니다. 

어쩌구 저쩌구... 했지만, 과정이 다소 복잡해 보이지만 서버를 내릴 필요 없이 이용 할 수 있는 점이 매력적입니다. 

다만 아무리 봐도 비효율적이라고 생각이 듭니다. 그리고 이렇게 생각한건 저 뿐만이 아니라서 나온 것이 바로

Spring Cloud Bus입니다. 일단 해당 방식으로 마무리 한 뒤 Bus에 대해서 포스팅 하도록 하겠습니다. 

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함