본문 바로가기
카테고리 없음

스프링으로 배우는 MSA (3) - Spring Cloud Netflix User Service, Post Service

by DarrenH 2023. 6. 24.
반응형

이제 본격적으로 MSA를 테스트 하기 위해서 서비스를 여러개 만드려고 한다. 

간단하게 User-Service와 Post-Service로 실습을 하려고 한다. 

 

마찬 가지로 유저서비스와 포스트서비스의 yml파일은 이전 장 에서 배웠던 config서버로 해두면 실습할 때 편리하다.

 

스프링으로 배우는 MSA (2) - Spring Cloud Netflix Config Server

MSA프로젝트를 시작 하기 앞서 Config서버를 만드려고한다. config서버는 우리가 스프링 프로젝트에서 application.properties/yml 파일을 따로 모아서 관리하려고 한다. 해당 파일을 왜 따로 관리하냐면,

darrenh.tistory.com

 

여기서 유저 서비스와 포스트 서비스를 만드는데, 이때 DB도 각각 다른 DB서버를 바라보게 해주면 된다. 

 

그게 MSA니까..

 

프로젝트를 새로 만들고 user-service와 post-service를 만들어 준다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.6.7'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2021.0.0")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.7.8'
    implementation 'com.google.code.gson:gson:2.7'
    implementation 'commons-io:commons-io:2.6'
    runtimeOnly 'mysql:mysql-connector-java:8.0.25'
    implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'

    //security && JWT
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'io.jsonwebtoken:jjwt:0.9.1'

    implementation 'org.springframework.cloud:spring-cloud-starter-config'
    implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'

    implementation 'org.springframework.boot:spring-boot-starter-actuator'

    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

보면 엄청 많은 디펜던시가 있는 것을 알 수 있다. MSA여도 로그인 검증을 해주기 위해 SpringSecurity와 JWT를 이용했다. 

이부분에 대해서는 https://darrenh.tistory.com/11 를 찾아보면 될것 같다. 

 

[Spring Security] + [JWT] 스프링 시큐리티 JWT 로그인[실습]

저번 포스팅에 이어서 이번에는 직접 코드를 작성하도록하겠습니다. 버전 : Spring Boot 2.7.2 SQL : JPA IDEA : IntelliJ 디렉토리 구조 저희가 Spring Security와 JWT를 사용해야하므로 해당 Gradle을 추가해줍니

darrenh.tistory.com

유저서비스의 설정파일은 다음과 같다.


server:
  port: 9000


spring:
  application:
    name: user-service
  datasource:
    url: jdbc:mysql://localhost:3306/scg?useUnicode=yes&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Seoul
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: DB아이디
    password: DB비밀번호

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    database: mysql
logging.level:
  org.hibernate.SQL: debug

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}


management:
  endpoints:
    web:
      exposure:
        include: refresh,health,beans,httptrace
      base-path: /first-service/management


secret: user-service-default2

뭐가 많은데 여기서는 eureka설정만 보면 된다. 이렇게 하면 유레카서버에 등록을 한다는 뜻이다.

 그리고 user-service에서 bootstrap.yml파일을 만들어야하는데 이를 만드는 이유는 application.yml보다 먼저 읽어지기 때문에 부트스트랩에 config서버를 바라보게 하면 된다. 

resource밑에 bootstrap.yml파일을 생성 해준다.

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: user
      profile: default

이전 장에서 봤듯이 해당 이름 규칙을 {application-name}-{profiles}.yml 로 했었는데 name에 application-name을 적어주고, profile는 profiles를 적어주면 된다. 나는 config서버를 8888포트로 했기때문에 그것도 그대로 적어준다. 

! 여기서 config서버를 먼저 켜줘야 동작 된다. 

 

이제 메인 클래스에 어노테이션을 붙여 준다. 

@EnableDiscoveryClient
@SpringBootApplication
public class SpringUserServiceApplication {

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

}

이렇게하면 유레카 서버에 등록되는 것을 확인할 수 있다. 

1. config서버 실행

2. eureka서버 실행

3. 유저 서비스 실행

서비스가 등록 된 것을 확인 할 수 있다. 

 

controller파일을 보면 

@RestController
@RequestMapping("/first-service")
public class MemberController {
    private final Environment environment;

    public MemberController(Environment environment) {
        this.environment = environment;
    }

    @GetMapping("/health-check")
    public String healthCheck() {
        return String.format("secret : %s",
                environment.getProperty("secret"));
    }

}

해당 url로 들어가보면 

user-default.yml 에 있던 secret 값이 나옴

잘 되는 것을 볼 수 있다. 여기에 Spring Security와 JWT를 적용 시킨 후 다음 장으로 실습하면 될 것 같다.

 

POST-SERVICE도 마찬가지로 실행해보면 된다. 

 

다음 장에서는 각각의 서비스들의 요청을 한 서비스가 받는 게이트웨이 서비스에 대해 작성하려고한다.

 

 

참고 자료

https://imprint.tistory.com/m/213

반응형