이제 본격적으로 MSA를 테스트 하기 위해서 서비스를 여러개 만드려고 한다.
간단하게 User-Service와 Post-Service로 실습을 하려고 한다.
마찬 가지로 유저서비스와 포스트서비스의 yml파일은 이전 장 에서 배웠던 config서버로 해두면 실습할 때 편리하다.
여기서 유저 서비스와 포스트 서비스를 만드는데, 이때 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 를 찾아보면 될것 같다.
유저서비스의 설정파일은 다음과 같다.
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로 들어가보면
잘 되는 것을 볼 수 있다. 여기에 Spring Security와 JWT를 적용 시킨 후 다음 장으로 실습하면 될 것 같다.
POST-SERVICE도 마찬가지로 실행해보면 된다.
다음 장에서는 각각의 서비스들의 요청을 한 서비스가 받는 게이트웨이 서비스에 대해 작성하려고한다.
참고 자료