[Spring Boot & MSA] Communication between Microservices(2)

dnjscksdn98·2020년 7월 31일
0

Spring Boot MSA

목록 보기
7/12
post-thumbnail

깃허브 소스코드
Udemy 강의

🚀 서비스 디스커버리를 사용해 서비스 검색

  • 여행 관리 서비스는 어떻게 승객 관리 서비스를 알고 요청을 보낼까요?
  • 이때 사용할 수 있는 기술은 Eureka Discovery Service입니다.
  • 해당 인스턴스가 실행이 될때 Eureka Discovery Service로 등록을 하게 됩니다.
  • 그래서 Eureka는 현재 실행되고 있는 모든 인스턴스들의 주소와 포트 번호를 알게 됩니다.
  • 그러므로 여행 관리 서비스는 Eureka를 통해서 요청을 보내야할 올바른 주소와 포트번호를 알게 되서 요청을 보낼 수 있게 됩니다.

✔ RestTemplate을 통한 통신

RestTemplate 빈 등록

  • @LoadBalanced : 스프링 클라우드가 Ribbon을 지원하는 RestTemplate 클래스를 생성하도록 지정
@SpringBootApplication
@EnableEurekaClient
public class PhotoAppApiUsersApplication {

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

	@Bean
	@LoadBalanced
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
}

RestTemplate Client 생성

  • restTemplate.exchange({url}, {HTTP Method}, {HTTP Entity(Header/Body)}, {response type}, {parameter})

  • RestTemplate 호출에서 서비스의 물리적 위치를 사용하는 대신 호출하려는 서비스의 유레카 서비스 ID를 사용합니다(spring.application.name).

  • RestTemplate이 Eureka한테 organization-service에 대한 모든 주소들을 먼저 물어보고, 받은 주소들을 가지고 로드 밸런싱(라운드 로빈 방식)을 통해서 요청을 보내게 됩니다.

@Component
public class OrganizationRestTemplateClient {

    @Autowired
    private RestTemplate restTemplate;

    public Organization getOrganization(String organizationId) {
        ResponseEntity<Organization> restExchange =
                restTemplate.exchange(
                        "http://organization-service/v1/organizations/{organizationId}",
                        HttpMethod.GET,
                        null,
                        Organization.class,
                        organizationId
                );

        return restExchange.getBody();
    }
}

✔ Feign Client를 통한 통신

  • REST 기반 서비스 호출을 추상화한 Spring Cloud Netflix 라이브러리
  • 선언적 방식(Declarative REST Client)
  • 인터페이스를 통해 클라이언트 측 프로그램 작성
  • Spring이 런타임에 구현체를 제공

의존성 설정

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

@EnableFeignClients 어노테이션 추가

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class PhotoAppApiUsersApplication {

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

Feign Client 인터페이스 생성

  • @FeignClient(name = "{service.name}") -> 인터페이스를 대표할 서비스 애플리케이션 지정
@FeignClient(name = "organization-service", path = "v1/organizations/")
public interface OrganizationFeignClient {

    @GetMapping(path = "{organizationId}", produces = MediaType.APPLICATION_JSON_VALUE)
    Organization getOrganization(@PathVariable("organizationId") String organizationId);

}

Feign Client에 대한 로깅 설정

  • 패키지 전체 활성화
logging:
  level:
    com:
      alexcode:
        photoapp:
          api:
            users:
              PhotoAppApiUsers:
                feign: DEBUG
  • 특정 클라이언트만 활성화
logging:
  level:
    com:
      alexcode:
        photoapp:
          api:
            users:
              PhotoAppApiUsers:
                feign:
                  AlbumServiceClient: DEBUG
  • 로깅 레벨에 대한 빈 생성
@Configuration
public class FeignClientConfig {

	@Bean
	Logger.Level feignLoggerLevel() {
		return Logger.Level.FULL;
	}
}
  • NONE: 로깅 없음, 디폴트값
  • BASIC: 요청 함수, URL, 응답 상태코드만을 로깅
  • HEADERS: BASIC에다가 요청과 응답의 Header까지 로깅
  • FULL: 요청과 응답의 Body, Header 그리고 그 외의 메타데이터까지 로깅
profile
Alex's Develog 🤔

0개의 댓글