[Cloud] Spring Cloud

호호빵·2022년 6월 21일
0

Cloud

목록 보기
4/5

Spring Cloud

  • MSA 구현을 위한 도구 모음
  • MSA의 개발, 배포, 운영에 필요한 아키텍쳐를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반 프레임워크
  • 분산 시스템 상에 필요한 여러 패턴들을 표준 패턴화 시켜 손쉽게 개발할 수 있도록 지원함



LB와 Eureka

  • LB(Load Balancer) : 여러 대의 서버에 트래픽을 골고루 분산하기 위해 분배해주는 기술
    - 각 모듈의 연결 정보를 LB에 등록해 LB는 MSA의 각 모듈에 대한 연결 정보(ip,port,hostname)를 가지고 있음.
    - CI/CD를 수행하면서 각 모듈은 업그레이드 되고 연결정보가 바뀌게 되면 새롭게 LB에 등록해야 함. -> Eureka 해결

Eureka

  • Netfilx에 서 제공하는 MSA를 위한 클라우드 오픈 소스
  • LB, Middle-tier server의 에러 대응을 위한 Rest 기반 서비스
  • 등록과 해지를 바로 적용 가능하게 함
  • MSA의 서비스들의 목록과 위치(ip,port)가 동적으로 변화하는 환경에서 서비스들을 효율적으로 관리하기 위한 Service Discovery Server/Client

Discovery : 다른 서비스의 연결 정보를 찾는 것

Registry : 서비스의 연결 정보를 등록하는 것

Eureka Server

Eureka server

  • Service Registration : 자신을 등록하는 서버
  • Service Registry : Client가 가용한 서비스 목록을 요청하는 서버

Eureka client

  • 서비스들의 위치 정보를 Eureka Server로부터 fetch하는 서비스
  1. Eureka Server 프로젝트 생성
  2. Eureka Client 프로젝트 생성
  3. Eureka Client2 프로젝트 생성
  4. Eureka Gateway 프로젝트 생성
@EnableEureKaServer or @ EnableEurekaClient 추가

# Eureka Server
// application.properties
server.port=8761

spring.application.name=discovery-service

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false


# Eureka Client
// application.properties
server.port=0

eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

spring.application.name=my-service1  // 2는 바꿔서

eureka.instance.instance-id=${spring.application.name}:${spring.application.instance_id:${random.value}}


# Gateway
//application.yml
server:
  port: 8080

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

spring:
  application:
    name: gateway-service

  cloud:
    gateway:
      routes:
        - id: my-serv1
          uri: lb://MY-SERVICE1
          predicates:
            - Path=/serv1/**
        
        - id: my-serv2
          uri: lb://MY-SERVICE2
          predicates:
            - Path=/serv2/**
         



Gateway

  • frontend 개발자에게 통일된 요청 정보가 필요함
  • Eureka는 단지 등록된 서비스들을 관리하는 역할만 함.
  • Load Balance와 유저 인증등 통일된 로직을 한곳에서 할 수 있음.
  • Spring 측에서 Zuul을 대체한 Spring cloud Gateway를 만듬. (netty vs tomcat)


# Mycontroller   // client에 
@RestController
public class MyController {
    @GetMapping("/serv1/test")
    public String test() {
        return "test";
    }
}


# Filter, application.yml 에 추가
cloud:
    gateway:
      routes:
        - id: my-serv1
          uri: lb://MY-SERVICE1
          predicates:
            - Path=/serv1/**
          filters:
            - RewritePath=/serv1/?(?<segment>.*), /$\{segment}


# Logging Filter
# Global Filter
# Custom Filter 등등 이 있음


OpenFeign

feign : RestTemplate 호출 등을 JPA Repository 처럼 interface로 단순히 추상화 한 프로젝트

# build.gradle 에 추가
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

@EnableFeignClients  // @FeignClient가 있는 interface를 찾아서 등록

# FeignServiceBRemoteService 인터페이스 추가
@FeignClient(name = "MY-SERVICE2")
public interface FeignServiceBRemoteService {
    @RequestMapping("info/{test}")
    String getServiceBInfo(@PathVariable("test") String test);
}
# Client controller 변경
@RequiredArgsConstructor
@RestController
public class MyController {

    private final FeignServiceBRemoteService feignServiceBRemoteService;
    @GetMapping("/test")
    public String test() {
        return feignServiceBRemoteService.getServiceBInfo("service1");
    }
}


# Client2 controller 변경
@RequiredArgsConstructor
@RestController
public class MyController{

@GetMapping("/info/{test}")
    publicStringtest(@PathVariable Stringtest) {
        return "service2에서 응답"+test;
    }
}

Circuit Breaker

  • 에러가 더이상 전파되지 않도록 하는 장치
  • retry와 fallback, 얽혀있는 client들을 빠르게 해제
    (Netflix의 Hystrix, Resilience4j)
  • Retry
    • 실패한 실행을 짧은 지연을 가진 후 재시도합니다.
  • Circuit Breaker
    • 실패한 실행에 대해서 또 다른 시도가 들어올 때 바로 실패 처리합니다.
  • Rate Limiter
    • 일정 시간동안 들어올 수 있는 요청을 제한합니다.
  • Time Limiter
    • 실행 되는 시간을 특정 시간을 넘지않도록 제한합니다.
  • Bulkhead
    • 동시에 실행할 수를 제한합니다.
  • Cache
    • 성공적인 실행을 캐시합니다. 다음번에 동일한 요청으로 들어오면 바로 반환합니다.
  • Fallback
    • 실행을 실패(Exception)하는 경우에 대신 실행되게하는 프로세스입니다.

Spring Cloud 강의 노션
Eureka 란

profile
하루에 한 개념씩

0개의 댓글