Spring Cloud 부하 균형 및 원 격 호출 상세 설명

부하 균형
마이크로 서 비 스 를 사용 한 후에 높 은 병행 압력 을 감당 하기 위해 같은 서 비 스 는 여러 개의 인 스 턴 스 를 시작 할 수 있 습 니 다.이때 소비 자 는 부하 균형 을 맞 춰 요 구 를 각 사례 로 분산 시 켜 야 한다.부하 균형 은 주로 두 가지 디자인 이 있다.
서버 부하 균형 클 라 이언 트 부하 균형
전통 적 인 분포 식 서비스 에 있어 서 대부분 서버 부하 균형 을 사용한다.보통 Nginx 나 ELB 등 도 구 를 부하 이퀄 라이저 로 사용 합 니 다.다음 그림 과 같 습 니 다.

전통 부하 균형
한편,Spring Cloud 에서'클 라 이언 트 부하 균형'방식 을 사용 하고'Ribbon'구성 요 소 를 사용 하여 클 라 이언 트 의 부하 균형 을 실현 합 니 다.마이크로 서비스 등록 센터 의존 도 를 도입 하면 자동 으로 리본 의존 도 를 도입 한다.클 라 이언 트 부하 균형 원 리 는 다음 과 같다.

클 라 이언 트 부하 균형
Ribbon 의 원리
Ribbon 은 RestTemplate 의 차단기(인 터 페 이 스 는 Client HttpRequestInterceptor)메커니즘 을 이용 하여 차단기 에서 이 루어 진 부하 균형 을 이용 했다.부하 균형 의 기본 적 인 실현 은'서비스 등록 센터'에서 사용 가능 한 서비스 주소 목록 을 얻 은 다음 에 일정한 알고리즘 을 통 해 부하 하여 어떤 서비스 주 소 를 사용 하여 HTTP 호출 을 할 지 결정 하 는 것 이다.
자세 한 내용 은 LoadBalancer Interceptor 클래스 를 볼 수 있 습 니 다.org.spring framework.cloud.client.loadbancer 패키지 에 있 습 니 다.
리본 사용 하기
먼저 생산자'service-user'를 정의 합 니 다.저 는 용기 로 여러 개의 생산자 인 스 턴 스 를 시 작 했 습 니 다.모든 인 스 턴 스 는 서로 다른 id 를 가지 고 있 습 니 다.제 예제 코드 에서 두 개의 인 스 턴 스 를 시 작 했 습 니 다.
service-user-1
service-user-2
코드:

@RestController
@RequestMapping
public class HelloController {

  @Value("${spring.cloud.consul.discovery.instanceId}")
  private String instanceId;

  @GetMapping("hello")
  public String hello() {
    return String.format("hello, this is %s", instanceId);
  }
}
그리고 소비자'서비스-order'에 대해 서 는 자바 성명 식 주해 방식 으로 리본 을 사용 할 수 있 습 니 다.소비자 가 RestTemplate 유형의 Bean 에@LoadBalanced 를 붙 이면 됩 니 다.그리고 부하 균형 정책 을 설정 합 니 다:

@Configuration
public class RibbonConfig {

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

  @Bean
  public IRule ribbonRule() {
    return new RandomRule(); //       
  }
}
그리고 자동 으로 주입 되 는 RestTemplate 형식의 Bean 을 직접 사용 할 수 있 습 니 다.

@RestController
@RequestMapping
public class HelloController {

  @Autowired
  RestTemplate restTemplate;

  @GetMapping("/ribbon/service-user")
  public String ribbonService(){
    return restTemplate.getForObject("http://service-user/hello", String.class);
  }
}
이때 소비자 의/libbon/service-user 를 방문 하여 몇 번 새로 고침 하면 다음 두 개의 무 작위 응답 을 볼 수 있 습 니 다.
hello, this is service-user-2
hello, this is service-user-1
부하 균형 정책
IRule 인터페이스의 실현 클래스 를 보면 Ribbon 의 모든 부하 균형 전략 을 볼 수 있 습 니 다.각 실현 클래스 상단 의 설명 을 보면 구체 적 인 전략 을 볼 수 있 습 니 다.

부하 이퀄 라이저
  • RandomRule:무 작위 선택;
  • RoundRobinRule:문의;
  • Weighted Response TimeRule:모든 서비스의 응답 시간 에 따라 가중치 를 설정 하고 응답 시간 이 길 수록 차지 하 는 가중치 가 적 습 니 다.
  • Availability FilteringRule:연결 에 실 패 했 기 때문에 circuit tripped 로 표 시 된 백 엔 드 server 를 걸 러 내 고 병렬 백 엔 드 server(active connections 가 설정 한 한도 값 을 초과 함)를 걸 러 냅 니 다.
  • ZoneAvoidance Rule:Composite Predicate 를 사용 하여 지역 과 가용성 에 따라 서버 를 걸 러 내 는 규칙;
  • BestAvailableRule:최소 동시 요청 서버 를 선택 하 십시오.
  • Retry Rule:기 존의 전략 을 바탕 으로 재 시도 체 제 를 추가 합 니 다.IRule 은'직렬 연결'을 지원 하기 때 문 입 니 다.
  • 원 격 호출
    Spring Cloud 는 원 격 HTTP 호출 을 위해 OpenFeign 구성 요소(이전 에는 Feign)를 제공 합 니 다.그것 은 RestTemplate 에 대한 패키지 입 니 다.
    Feign 은 성명 식 웹 서비스 클 라 이언 트 입 니 다.Feign 을 사용 하면 웹 서비스 클 라 이언 트 를 작성 하 는 것 이 더욱 간단 합 니 다.Spring Cloud 는 Feign 을 봉인 하여 Spring MVC 표준 주해 와 HttpMessageConverters 를 지원 하도록 했다.Feign 은 부하 균형 을 지원 하기 위해 마이크로 서비스 등록 센터 와 Ribbon 을 조합 해서 사용 할 수 있다.
    OpenFeign 사용 하기
    첫 번 째,의존 도입:
    
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    두 번 째 단계,시작 설정,시작 클래스 에@EnableFeignClient 설명 추가:
    
    @SpringBootApplicationbr/>@EnableFeignClients
    public class ServiceOrderApplication {
    public static void main(String[] args) {
      SpringApplication.run(ServiceOrderApplication.class, args);
    }
    }
    세 번 째 단계:호출 인 터 페 이 스 를 설명 합 니 다.제 사례 는 service-order 가 service-user 의/hello 인 터 페 이 스 를 호출 하 는 것 입 니 다.여기 의 주 해 는 Spring MVC 의 주해 와 일치 합 니 다.
    Feign 이 POST 요청 을 할 때 작은 구덩이 가 있 습 니 다.자세 한 내용 은 SpringCloud Feign Post 폼 요청 을 참고 하 십시오.
    
    @FeignClient("service-user")
    public interface UserClient {
      @GetMapping("hello")
      String getUserHello();
    }
    4 단계:사용,주 해 는@Autowired 주 해 를 사용 하여 주입 하면 됩 니 다.
    
    @RestController
    @RequestMapping
    public class HelloController {
    
      @Autowired
      UserClient userClient;
    
      @GetMapping("hello")
      public String hello() {
        return "hello, this is order service";
      }
    
      @GetMapping("userHello")
      public String user() {
        return userClient.getUserHello() + ", this is order-service";
      }
    }
    너무 쉬 워 보이 지 않 아 요?
    OpenFeign 통합 리본
    앞에서 언급 한 바 와 같이 OpenFeign 밑바닥 은 RestTemplate 에 대한 패키지 이 고,Ribbon 은 RestTemplate 에 필 터 를 추가 함으로써 이 루어 지기 때문에 OpenFeign 은 천성적으로 자동 으로 Ribbon 을 집적 하기 때문에 우 리 는 어떠한 추가 설정 도 필요 하지 않다.
    상기 코드 에서 시작 하면 서비스-order 의/userHello 포트 를 방문 하여 끊임없이 갱신 할 수 있 으 며 부하 균형 이 이 루어 진 것 을 발견 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기