Software Architecture/MSA

[MSA ๊ตฌ์ถ•ํ•˜๊ธฐ] 2. Eureka ์„œ๋ฒ„ ๊ตฌ์ถ• (Service Discovery)

bu119 2024. 3. 12. 18:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”Š ์šฐ๋ฆฌ๋Š” Spring Cloud๋ฅผ ํ™œ์šฉํ•˜์—ฌ MSA๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.

๐Ÿ”Š ์ด๋ฒˆ์—๋Š”, Service Discovery๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ด๋‹ค. 

 

Service Discovery ํŒŒํŠธ 1

 

Service Discovery์˜ ์—ญํ• ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด,

Service Discovery๋ž€?

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ •๋ณด(์œ„์น˜ ๋“ฑ)๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™ธ๋ถ€์˜ ์š”์ฒญ์ด๋‚˜ ์„œ๋น„์Šค๊ฐ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

 

Spring Cloud์—์„œ๋Š” Spring Cloud Netflix Eureka๊ฐ€ Service Discovery์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Eureka๋Š” Eureka Server์™€ Eureka Client๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

Eureka ์„œ๋ฒ„๋ž€?

Eureka ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ MSA๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฐ์‹œ์ž ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ. ๊นŠ๊ฒŒ ๋ณด๋ฉด ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋“ค์„ Gateway์—๊ฒŒ ์•Œ๋ ค์ฃผ์–ด ์‹œ๊ฐ„๊ณผ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ ์Šค์ผ€์ผ ์•„์›ƒ๋˜๋Š” ์„œ๋ฒ„๋“ค์„ ๋ชจ๋‘ ๊ฐ€์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, Eureka ์„œ๋ฒ„๋Š” ๊ฐ€๋™๋˜๋Š” ์„œ๋ฒ„๋ฅผ ํ™•์ธ ํ›„ Gateway์—๊ฒŒ ๊ทธ ๋ชฉ๋ก์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๐Ÿ”Š ๋จผ์ €,  Service Discovery์˜ Eureka Server๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ด๋‹ค.

 


Spring Cloud Eureka ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

 

 

Eureka ์„œ๋ฒ„ ์„ค์ •์„ ์œ„ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€

ํ•„์ˆ˜ ์˜์กด์„ฑ

  • Eureka Server
  • Spring Security
// build.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

 

2. Main ํด๋ž˜์Šค ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ๋ก

Eureka ์„œ๋ฒ„๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

// EurekaServerApplication

package com.caffeinedoctor.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer // EurekaServer๋กœ ๋“ฑ๋ก
public class EurekaServerApplication {

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

}

 

main๋ฉ”์„œ๋“œ์— @EnableEurekaServer ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด Discovery ์„œ๋ฒ„๋กœ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

3. Eureka ์„œ๋ฒ„ ์„ค์ •

application.properties ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  application.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์„ค์ •์„ ํ†ตํ•ด Eureka ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

# application.yml 

# ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ํฌํŠธ ๋ฒˆํ˜ธ ์ง€์ •
# ์œ ๋ ˆ์นด ์„œ๋ฒ„ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ๋ณดํ†ต 8761๋ฒˆ ์‚ฌ์šฉ
server:
  port: 8761
  
# ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„ ์ง€์ •
spring:
  application:
    name: eureka-server

# ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ eureka ์„ค์ •
eureka:
  client:
    # eureka ๋“ฑ๋ก ์—ฌ๋ถ€
    # ์œ ๋ ˆ์นด ์„œ๋ฒ„๊ฐ€ ์ž๊ธฐ์ž์‹ ์„ ๋“ฑ๋ฃํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ
    register-with-eureka: false
    # Eureka ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๋“ค์˜ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ์†์„ฑ
    fetch-registry: false

 

  • ํฌํŠธ ๋ฒˆํ˜ธ: 8761
  • Service ์ด๋ฆ„: eureka-server
  • register-with-eureka (๋””ํดํŠธ true)
    • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ž์‹ ์„ ๋“ฑ๋กํ•  ๊ฑด์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€์ด๋‹ค.
    • ์ฆ‰, ์œ ๋ ˆ์นด ์„œ๋ฒ„์— ๋“ฑ๋กํ•˜๊ฒ ๋ƒ๋Š” ๋œป์ด๋‹ค.
    • ์ง€๊ธˆ Service๋Š” Eureka Server์ด๋‹ˆ ๋“ฑ๋ก์ด ํ•„์š” ์—†์–ด์„œ false๋กœ ์„ค์ •ํ•œ๋‹ค.
  •  fetch-registry (๋””ํดํŠธ true)
    • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ๊ฑด์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€์ด๋‹ค.
    • true ์„ค์ • ์‹œ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค Eureka server๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ๋กœ์ปฌ๋กœ ์บ์‹ฑ๋œ๋‹ค.
    • ์ฆ‰, Client๊ฐ€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ์„ค์ •์ด๋‹ค.
    • ์ง€๊ธˆ Service๋Š” Eureka Server์ด๋‹ˆ ๊ฒ€์ƒ‰์ด ํ•„์š” ์—†์–ด์„œ false๋กœ ์„ค์ •ํ•œ๋‹ค.

 

4. ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •

Eureka ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€๋ง์—์„œ๋งŒ ์กด์žฌํ•ด์•ผ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์™ธ๋ถ€๋ง์— ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€๋ง์—์„œ๋„ ๋ณด์•ˆ์„ ์ค‘์š”์‹œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์„ ์ง„ํ–‰ํ•œ๋‹ค. ์‹œํ๋ฆฌํ‹ฐ๋Š” httpBasic ๋ฐฉ์‹ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

// SecurityConfig

package com.caffeinedoctor.eurekaserver.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;


// ์‹œํ๋ฆฌํ‹ฐ ์ปค์Šคํ…€ config๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠน์ • ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์ ‘๊ทผ์„ ๋ง‰๋Š”๋‹ค.
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // ์•”ํ˜ธํ™” ์‹œํ‚ค๊ธฐ
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {

        return new BCryptPasswordEncoder();
    }

    // ํŠน์ • ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ ๋ณด์•ˆ ์„ค์ •ํ•˜๊ธฐ
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // csrf ๋ฌด์‹œ
        http.csrf((auth) -> auth.disable());

        // ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๊ฒŒ ํ•œ๋‹ค.
        http.authorizeHttpRequests((auth) -> auth.anyRequest().authenticated());

        // ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ http ๋ฒ ์ด์ง ๋ฐฉ์‹
        http.httpBasic(Customizer.withDefaults());

        return http.build();
    }

    // ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์•„์ด๋”” ๋“ฑ๋กํ•˜๊ธฐ (์ธ ๋ฉ”๋ชจ๋ฆฌ ํƒ€์ž…)
    @Bean
    public UserDetailsService userDetailsService() {
        // ์‹œ์šฉ์ž1 ์ƒ์„ฑ
        UserDetails user1 = User.builder()
                .username("์•„์ด๋””")
                .password(bCryptPasswordEncoder().encode("๋น„๋ฐ€๋ฒˆํ˜ธ"))
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user1);
    }
}

 

๋ฐ˜์‘ํ˜•

Spring Cloud Eureka ์„œ๋ฒ„  ์‹คํ–‰

 


์ฐธ๊ณ  ์ž๋ฃŒ

https://covenant.tistory.com/251

https://devhan.tistory.com/m/260

https://substantial-park-a17.notion.site/6-Eureka-057c942a7a4041bf87ab5cd3043af021

 

728x90
๋ฐ˜์‘ํ˜•