심도 : 리본 사용 및 핵심 원칙 분석을 이해하는 기사

1. 리본이란

Spring Cloud Ribbon은 Netflix Ribbon을 기반으로 구현 된 클라이언트 측 부하 분산 도구 세트입니다. Ribbon
클라이언트 구성 요소는 시간 초과, 재시도 등과 같은 일련의 완전한 구성을 제공합니다. 서비스에서
제공하는 모든 머신 인스턴스는 LB (Load Balancer)를 통해 확보 되며 Ribbon은 특정 규칙 (폴링, 무작위)에 따라 이러한 서비스를 자동으로 호출합니다.
Ribbon은 자체 부하 분산 알고리즘을 구현할 수도 있습니다.

1.1 클라이언트 부하 분산이란?

프로세스의 LB는 소비자에 통합 된 클래스 라이브러리이며 공급자의 주소는 소비자를 통해 획득됩니다.
인생에서 : 당신이 줄을 서기 위해 기차역에 갈 때 (3 개의 통로가 있음)와 비슷하게, 당신이 평범한 사람이라면 덜 붐비는 팀에 줄을 섭니다
.
프로그램에서 : 소비자는 서비스 제공 업체 주소 목록을 얻은 다음 특정 전략에 따라
전화 할 주소를 얻을 수 있습니다.

1.2 서버 측 부하 분산이란?

인생에서 : 줄을 서기 위해 기차역에 갈 때와 비슷하게 기차역 가이드가 세 번째 채널에 사람이
거의 없다고 말하고 세 번째 채널 로 가서 줄을 서게됩니다.

프로그램에서 : 소비자가 호출하는 ng의 주소이고 ng는 요청의 전달을 선택합니다 (폴링 가중치, ip_hash 등).

2. 리본을 빠르게 통합

의존성 소개

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐eureka‐client</artifactId>
 </dependency>
 <!‐‐添加ribbon的依赖, eureka client启动器已经依赖了ribbon,可以不配‐‐>
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐ribbon</artifactId>
 </dependency>

@LoadBalanced 주석 추가

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

3. 리본 핵심 원리

3.1 리본 호출 프로세스

3.2 리본 부하 분산 전략

  1. RandomRule : 서버를 임의로 선택합니다.

  2. RetryRule : 선택한로드 밸런싱 전략 시스템의 재시도 메커니즘의 경우 구성 기간 내에
    서버 선택이 실패하면 항상 subRule 메서드를 사용하여 사용 가능한 서버를 선택하려고합니다.

  3. RoundRobinRule : 폴링 선택, 폴링 인덱스, 인덱스에 해당하는 서버를 선택합니다.

  4. AvailabilityFilteringRule : 연결에 실패한 회로 트립 된 것으로 표시된
    백엔드 서버를 필터링하고 이러한 높은 동시성 백엔드 서버
    를 필터링 하거나 AvailabilityPredicate 사용 하여 서버 필터링 논리를 포함합니다. 실제로 작동을 확인하는 것입니다. 각 서버는 상태에 기록됩니다.

  5. BestAvailableRule : 동시 요청이 가장 적은 서버를 선택하고 서버를 하나씩 검사합니다.
    서버가 트립되면 건너 뜁니다.

  6. WeightedResponseTimeRule : 응답 시간에 따라 가중치가 부여됩니다. 응답 시간이 길고 가중치가
    작을수록 선택 될 확률이 낮아집니다.

  7. ZoneAvoidanceRule : 서버가있는 영역의 성능과 서버의 가용성을 복합하기 위해 서버가 선택됩니다
    .

3.2.1 기본 부하 분산 정책 수정

 @Configuration
 public class AppConfig {
    
    

  @Bean
  @LoadBalanced
  public RestTemplate restTemplate() {
    
    
  return new RestTemplate();
  }
  @Bean
  public IRule myRule() {
    
    
  return new RandomRule();
  }
 }

3.2.2 사용자 지정 부하 분산 전략

1) 커스텀로드 알고리즘

public class MyRandomRule extends AbstractLoadBalancerRule {
    
    

  /** 总共被调用的次数,目前要求每台被调用5次 */
  private int total = 0;
  /** 当前提供服务的机器号 */
  private int currentIndex = 0;

  public Server choose(ILoadBalancer lb, Object key) {
    
    
  if (lb == null) {
    
    
  return null;
  }
  Server server = null;

  while (server == null) {
    
    
  if (Thread.interrupted()) {
    
    
  return null;
  }
  //激活可用的服务
  List<Server> upList = lb.getReachableServers();
  //所有的服务
  List<Server> allList = lb.getAllServers();

  int serverCount = allList.size();
  if (serverCount == 0) {
    
    
  return null;
  }

  if (total < 5) {
    
    
  server = upList.get(currentIndex);
  total++;
  } else {
    
    
  total = 0;
  currentIndex++;
  if (currentIndex >= upList.size()) {
    
    
  currentIndex = 0;
    }
  }
  if (server == null) {
    
    
  Thread.yield();
  continue;
  }

  if (server.isAlive()) {
    
    
  return (server);
  }

  // Shouldn't actually happen.. but must be transient or a bug.
  server = null;
  Thread.yield();
  }
  return server;
  }

  @Override
  public Server choose(Object key) {
    
    
  return choose(getLoadBalancer(), key);
  }

  @Override
  public void initWithNiwsConfig(IClientConfig clientConfig) {
    
    
    }
 }

2) SpringBoot 메인 프로그램에서 스캔 한 패키지 외부의 구성 클래스 정의

 @Configuration
 public class MySelfRule {
    
    
 @Bean
  public IRule myRule(){
    
    
  return new MyRandomRule();
  }
 }

참고 : 사용자 지정 부하 분산 전략은 @SpringbootApplication의 @CompentScan 주석으로
스캔 한 위치에 작성할 수 없습니다 . 그렇지 않으면 사용자 지정 구성 클래스가 모든 RibbonClients에서 공유됩니다.

3) @RibbonClient를 사용하여 부하 분산 전략을 지정하고 @RibbonClient를 SpringBoot 기본 프로그램에 추가
하여 구성 클래스 를 가져옵니다 .

 @SpringBootApplication
 @RibbonClient(name = "service‐order",configuration = MySelfRule.class)
 public class ServiceMemberApplication {
    
    }

3.3 리본 관련 인터페이스
참조 : org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration
IClientConfig : 기본적으로 DefaultClientConfigImpl에 의해 구현되는 리본의 클라이언트 구성.

IRule : 리본의로드 밸런싱 전략은 ZoneAvoidanceRule을 사용하여 기본적으로 구현되며,이 전략은 다중 영역
환경 에서 액세스하기위한 최상의 영역 인스턴스를 선택할 있습니다.

IPing : DummyPing에 의해 기본적으로 구현되는 Ribbon의 인스턴스 검사 전략입니다.이 검사 전략은 특별한
구현입니다. 실제로 인스턴스를 사용할 수 있는지 여부를 확인하지 않지만 항상 true를 반환합니다. 기본적으로 모든 서비스 인스턴스가
사용 가능한 것으로 간주 됩니다.

ServerList : 기본적으로 ConfigurationBasedServerList에 의해 구현되는 서비스 인스턴스 목록의 유지 관리 메커니즘입니다.

ServerListFilter : 서비스 인스턴스 목록 필터링 메커니즘 인 ZonePreferenceServerListFilter가 기본적으로 채택됩니다.이
전략은 요청자와 동일한 지역의 서비스 인스턴스를 우선적으로 필터링 할 수 있습니다.

ILoadBalancer : 기본적으로 ZoneAwareLoadBalancer에 의해 구현되는로드 밸런서이며 지역
인식 기능이 있습니다 .
구성을 수정하십시오.

 # 使用<clientName>.ribbon.<key>=<value>的形式进行配置
 # 参考org.springframework.cloud.netflix.ribbon.PropertiesFactory
 # PingUrl: Get http://192.168.3.1:8010/
 # 指定IPing
 service‐order.ribbon.NFLoadBalancerPingClassName=\
  com.netflix.loadbalancer.PingUrl
 # 指定IRule
 service‐order.ribbon.NFLoadBalancerRuleClassName=\
  com.netflix.loadbalancer.RandomRule

4 리본 소스 코드 분석


(원본 사진이 필요한 친구는 내 WeChat 공개 계정을 팔로우 할 수 있습니다. 입력 : 리본)

이 기사는 인터뷰와 질문을 정리해야하는 친구들과 공유되며, 원하는 제안을받을 수 있기를 바랍니다.이 정보는 주로 Java 기본, 데이터 구조, jvm, 멀티 스레딩 등을 포함합니다. 제한된 공간으로 인해, 아래에는 작은 부분 만 표시되어 있습니다. 인터뷰 질문, 정식 버전이 필요한 친구는 링크를 클릭하여 바로받을 수 있습니다. 링크 : 여기를 클릭 하여 무료로 다운로드, 코드 받기 : CSDN

여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_41770757/article/details/110552363