0

저는 Spring Cloud와 Netflix 프로젝트를 사용하여이 아키텍처에 대해 더 많이 배우기 시작했습니다.마이크로 서비스 아키텍처에서의 하이퍼 미디어 응답

일반적인 관점에서 볼 때 아키텍처를 이해하지만 실제로 앱을 코딩하고 있으므로이 아키텍처의 큰 접근 방식에 큰 영향을 미칠 수있는 최소한의 것들에 대해서는 의심의 여지가 있습니다. https://spring.io/blog/2015/07/14/microservices-with-spring

을 이제 문제 :

먼저

은, 내 응용 프로그램은 내가 봄 자체이기 때문에 유효한 것으로 간주하는이 튜토리얼을 기반으로 (이 모든 EUREKA 사용)의 난이 microservice "계정을했습니다 가정 해 봅시다 "이것은 Spring 데이터 REST에서 persistence/HATEOAS로만 구성되며 그 위에 RestTemplate을 사용하는 엔드 포인트를 사용하는 클라이언트 서비스가 있습니다 (리본의로드 밸런서를 사용하기 때문에). 필자의 관점에서 볼 때 이것은 사용자 -> 프론트 엔드 -> 클라이언트 서비스 -> 스프링 데이터 REST 엔드 포인트 (마이크로 서비스) -> DB의 작동 방식이다.

끝점 응답 (RestTemplate에서)을 얻었을 때, 마이크로 서비스에 직접 연결되는 하이퍼 미디어가 포함되어 있으며,로드 균형 조정기를 무시하면서 마이크로 서비스를 진행할 수 있습니다. 나를 위해, 그것의 목적을 죽인다. 그리고 만약 내가 서로에게 5 microservices 스케일링을 좋아한다면, 그것은 사용자가 현재로드 밸런서에 의해 관리되는 5 마이크로 서비스의 광범위한 방법 중 하나에 집중하고 있음을 의미합니다.

l1 : 사용자가 API에 대한 지식을 가진 (그런 다음 구조의 일부를 죽이는) 것이 좋습니까?

유레카가 감지 한 서비스에 대한 링크를 추가하고 해당 마이크로 서비스에 대한 현재 끝점을 삭제하더라도 해당 링크는 작동하지 않으므로 하이퍼 미디어 링크가 잘리고 있음을 의미합니다.

질문 2 : 다른 접근법이 있습니까? 어떤 종류의 프록시, 외부로드 밸런서, DNS 등을 통해?

P.D : 나는 충분히 명확한 지 모르겠습니다. 뭔가 안개가 낀다면 알려주세요.

P.D.2 : 요약 질문 : 해당 미디어 링크를 어떻게해야합니까? 실제로 그 (것)들을 "맞은"얻기 위하여 그 (것)들에게 다른 것을 또는 시키십시오 (말하십시오)?

편집 : 아래의 조언에 따라 필자는 내 문제의 해결책 인 것 같은 Zuul을 추가했습니다. 이제, 주울에 관해서, 나는 어디에서 걸러 내야합니까?

내 응용 프로그램은 account-microservice (스프링 데이터 REST) ​​및 account-web-service (RestTemplate로드 균형 조정기가있는 클라이언트)와 같이 지금 당장입니다. 그것들은 유레카 등록 이름입니다.

@EnabledZuulProxy는 어디에 있어야합니까? 마이크로 서비스 내부 또는 클라이언트 내부?

내 microservice가 :

@SpringBootApplication 
@EnableEurekaClient 
public class AccountServer { 

    public static void main(String[] args) { 
     System.setProperty("spring.config.name", "AccountServerClient"); 
     SpringApplication.run(AccountServer.class, args); 
    } 
} 

//Config: 
spring.application.name=account-microservice 
spring.application.freemarker.enabled=false 
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 
eureka.client.instance.leaseRenewalIntervalInSeconds=5 

내 클라이언트 :

@SpringBootApplication 
@EnableEurekaClient 
@EnableZuulProxy 
@EnableCircuitBreaker 
public class AccountMicroService { 

    public static void main(String[] args) { 
     // Tell server to look for registration.properties or registration.yml 
     System.setProperty("spring.config.name", "AccountMicroServiceClient"); 
     SpringApplication.run(AccountMicroService.class, args); 
    } 
} 

//Config 
# Spring properties 
spring.application.name=account-web-service 
spring.freemarker.enabled=false 
eureka.instance.leaseRenewalIntervalInSeconds: 5 
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 
zuul.routes.account-web-service.path=/accounts/** 
zuul.routes.account-web-service.serviceId=account-web-service 
zuul.routes.account-web-service.stripPrefix=false 

클라이언트 코드가 소비하는

나의 현재 설정이 하나 (현재 @EnabledZuulProxy가 클라이언트에)입니다 SDR :

//@HystrixCommand(fallbackMethod="test") 
public ResponseEntity<PagedResources<AccountResource>> findAll(Pageable pageable) throws RestClientException, URISyntaxException { 

    return restTemplate.exchange(serviceUrl + "/accounts" + "?page={page}&size={size}&sort={sort}", HttpMethod.GET, 
      null, new ParameterizedTypeReference<PagedResources<AccountResource>>() { 
      }, pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort()); 
} 

이렇게하면 전혀 작동하지 않습니다. 필터링도 없습니다. 만약 내가 그것을 변경하고 그것을 microservice에서 사용한다면, 클라이언트에게 마이크로 서비스로 향하는 모든 것을 보냅니다. 클라이언트로부터의 요청도 루프로 끝나고 오류가 발생합니다 (타임 아웃,로드 밸런서가 가득 차서 회로가 깨졌습니다.) ...) 이것은 일반적으로 다음과 같습니다 : com.netflix.zuul.exception.ZuulException : 전달 오류.

편집 2 : 나는 마침내 Zuul이 작동되었고, 그것이 무엇을 이해했다. 이제 새 게이트웨이 응용 프로그램에 액세스하면 요청이 내 마이크로 서비스로 전달되고 결과 하이퍼 미디어가 이제는 원하는 게이트웨이를 가리키고 있습니다.

문제는 처음에 아키텍처 였고 코딩 문제로 바뀌었지만 이제는이 기술에 대해 분명히 생각합니다.

차 한잔은 주울이 언제, 어떻게하는지 이해하고있었습니다. @ Ryan Baxter 가이드 라인과이 두 기사 : https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-dohttps://spring.io/guides/gs/routing-and-filtering/이 작업을 수행하는 데 필요한 기본 정보. 나는 이것을 위해 내가 한 일과 내가 이해 한 것을 대답 할 것이다.

답변

1

Spring Cloud Netflix의 Zuul을로드 밸런서로 사용하면 Spring HATEOAS가 존중할 X-Forwarded-Host 헤더가 자동으로 추가됩니다. 헤더가 존재하면 HATEOAS는 헤더의 호스트 값을 사용하여 링크를 생성합니다. Zuul을 사용하지 않는 경우로드 밸런서를 구성하여 해당 헤더를 추가해야합니다.

+0

실제로 나는 Zuul을 사용하기 시작했지만 아무 것도하지 않는 것처럼 보입니다. 하이퍼 미디어는 항상 같고 zuul에 의한 추가 라우팅이없는 것처럼 작동합니다. 나를 안내하는 마음? –

+0

'RestTemplate'으로 전화를 걸려면 다른 서비스가 이해할 수 있도록 올바른 헤더를 추가해야합니다. – spencergibb

+0

어떻게해야할까요? 모든 RestTemplate에 X-Forwarded-Host : serviceName 헤더를 추가하기 만하면됩니까? –

0

좋아, 내가 한 것은 단순히 Zuul을 사용하는 것입니다 (@ Ryan이 제안한대로). 것은 처음에, 나는 그런 종류의 접근법을 얻지 못했다. 이것은 @ Ryan의 제안을 내 질문의 맨 아래에 추가 한 두 개의 기사와 함께 내부화 한 후 마침내 모든 권리가 있습니다 (희망 사항).

첫 번째 : 필자의 프로젝트가 Zuul (제안 된 두 개의 링크로 게이트웨이 응용 프로그램을 만들어서)을 사용하고 클래스 경로에 Hybrix와 Ribbon을 모두 가지고 있기 때문에 Zuul은 모두 함께 묶어 다기능 프록시 게이트웨이로 전환해야합니다. 회로 차단기 및로드 밸런싱 특성.

두 번째 : 나머지 템플릿로드 밸런서를 제거했기 때문에 : a) 포트 순방향 헤더를 보내지 않아서 마이크로 서비스 하이퍼 미디어를 얻는 응답이 있습니다. 이는 Zuul의 프록시 기능을 거의 무효화합니다. 그리고 b) Zuul이 게이트웨이 프록시로드 밸런서 역할을하기 때문에 나는 나머지 템플리트로 리본을 다시 사용하는 보일러 판이라고 생각합니다.

내 응용 프로그램은 다음과 같습니다. 사용자 -> {[Zuul의 게이트웨이 -> Zuul이 전달한 스프링 데이터 REST 마이크로 서비스] < - Eureka}.

내가 무슨 일이 일어나고 있었는지 그리고 결국 내 문제를 해결하기 위해 무엇을했는지 지적한 이후로 @ Ryan의 답변을 받아 볼 것입니다.아직도, 나는 내가 끝낸 것에 대한 다른 설명이 다른 SO 사용자에게 도움이 될 수 있다고 생각하기 때문에 대답하고있다.

내 솔루션에 문제가 있으면 의견을 말하십시오.

관련 문제