Spring Cloud 입문 튜 토리 얼 - ribbon 클 라 이언 트 부하 균형 실현

7334 단어 SpringCloudRibbon
간단 한 소개
우 리 는 이전 블 로그 의 코드 를 바탕 으로 Ribbon 구성 요 소 를 추가 하여 클 라 이언 트 부하 균형 을 제공 합 니 다.부하 균형 은 높 은 병발, 고성능, 신축 가능 한 서 비 스 를 실현 하 는 중요 한 구성 부분 으로 요청 을 하나의 클 러 스 터 에 분산 시 켜 모든 서버 의 부담 을 줄 일 수 있다.클 라 이언 트 부하 균형 은 클 라 이언 트 프로그램 에서 실 행 됩 니 다. 예 를 들 어 웹 프로젝트 와 같은 다음 에 클 라 이언 트 의 IP 주소 목록 을 가 져 와 서 무 작위 로 server 를 선택 하여 요청 을 보 냅 니 다.서버 부하 균형 에 비해 서버 자원 을 소모 할 필요 가 없다.
기초 환경
  • JDK 1.8
  • Maven 3.3.9
  • IntelliJ 2018.1
  • Git

  • 프로젝트 원본 코드
    Gitee 코드 클 라 우 드
    설정 업데이트
    우 리 는 이번에 로 컬 에서 두 제품 서비스 프로그램 을 시작 하여 부하 균형 을 검증 해 야 하기 때문에 두 번 째 프로그램 에 서로 다른 포트 를 제공 해 야 한다.Spring Cloud 설정 서비스 센터 의 설정 은 기본적으로 로 컬 시스템 환경 변 수 를 덮어 씁 니 다. 시스템 환경 변 수 를 통 해 제품 서비스의 포트 를 설정 해 야 하기 때문에 설정 센터 git 창고 에서 제품 서비스의 설정 파일 product-service.yml 을 수정 해 야 합 니 다.
    server:
      port: 8081
    spring:
      cloud:
        config:
          allow-override: true
          override-system-properties: false
    allow-override 의 기본 값 은 true 입 니 다. 설명 을 하려 는 것 입 니 다. 원 격 설정 센터 의 설정 항목 이 로 컬 설정 을 덮어 쓸 수 있 도록 하 는 것 입 니 다. 로 컬 설정 이 원 격 설정 을 덮어 쓸 수 있 도록 하 는 것 이 아 닙 니 다.물론 false 로 설정 할 수 있 지만 더 정확 한 덮어 쓰기 규칙 을 제공 하기 위해 기본 값 을 유지 합 니 다.원 격 설정 센터 의 설정 파일 은 로 컬 설정 을 덮어 쓸 수 있 지만 로 컬 시스템 변 수 를 덮어 쓰 지 마 십시오.수정 이 완료 되면 git 창고 에 제출 합 니 다.
    또한 override-system-properties=false 프로젝트 의 productService 에 로 그 를 추가 하여 부하 균형 이 적용 되 는 지 검증 합 니 다.
    package cn.zxuqian.controllers;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class ProductController {
    
        private static Logger log = LoggerFactory.getLogger(ProductController.class);
    
        @RequestMapping("/products")
        public String productList() {
            log.info("Access to /products endpoint");
            return "  ,  ,  ,T ";
        }
    }
    

    웹 에 리본 설정
    우선 ProductController 에 리본 의존 도 를 추가 합 니 다.
    
        org.springframework.cloud
        spring-cloud-starter-netflix-ribbon
    

    그리고 pom.xml 클래스 를 수정 하고 다음 코드 를 추가 합 니 다.
    @EnableCircuitBreaker
    @EnableDiscoveryClient
    @RibbonClient(name = "product-service")
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        @LoadBalanced
        public RestTemplate rest(RestTemplateBuilder builder) {
            return builder.build();
        }
    }

    이 항목 은 Ribbon 부하 균형 클 라 이언 트 로 표시 하기 위해 Application 주 해 를 사 용 했 습 니 다. 제품 서비스 클 라 이언 트 중 한 대 를 선택 하여 필요 한 서 비 스 를 방문 해 야 합 니 다. 여기 @RibbonClient(name = "product-service") 속성 은 produtService 프로젝트 에 설 정 된 name 속성 에 대응 합 니 다.spring.application.name 설명 은 @LoadBalanced 서 비 스 를 선택 하 는 uri 로 설정 되 어 요청 을 보 냅 니 다.RestTemplate 클래스 에 다음 코드 를 추가 합 니 다.
    @Service
    public class ProductService {
    
        private final RestTemplate restTemplate;
    
        @Autowired
        private DiscoveryClient discoveryClient;
    
        public ProductService(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        @HystrixCommand(fallbackMethod = "backupProductList")
        public String productList() {
            List instances = this.discoveryClient.getInstances("product-service");
            if(instances != null && instances.size() > 0) {
                return this.restTemplate.getForObject(instances.get(0).getUri() + "/products", String.class);
            }
    
            return "";
        }
    
        public String backupProductList() {
            return "  ,  ";
        }
    
        public String productListLoadBalanced() {
            return this.restTemplate.getForObject("http://product-service/products", String.class);
        }
    }

    여기에 LoadBalancerClient 방법 이 새로 추가 되 었 습 니 다. 이전 ProductService 방법 과 같은 서 비 스 를 방 문 했 습 니 다. Ribbon Client 로 부하 균형 을 이 루 었 을 뿐 입 니 다. 이곳 의 uri host 는 productListLoadBalanced 즉 방문 할 서비스의 이름 이 되 었 고 productList 에 설 정 된 product-service 속성 과 일치 합 니 다.마지막 으로 우리 @RibbonClient 에 다음 코드 를 추가 합 니 다.
    @RestController
    public class ProductController {
    
        @Autowired
        private ProductService productService;
    
        @RequestMapping("/products")
        public String productList() {
            return productService.productList();
        }
    
        @RequestMapping("/productslb")
        public String productListLoadBalanced() {
            return productService.productListLoadBalanced();
        }
    }
    name 요청 을 전문 적 으로 처리 하 는 방법 을 만 들 고 ProductController 부하 균형 을 맞 추 는 방법 을 호출 합 니 다.
    여기까지 우리 의 코드 가 완성 되 었 습 니 다. 코드 는 간단 해 보이 지만 사실은 모든 설정 이 기본 값 을 사 용 했 습 니 다.Ribbon 은 Ribbon Client 를 설정 하기 위해 프로 그래 밍 식 과 설정 식 두 가지 방식 을 제공 합 니 다.간단하게 소개 하고 리본 에 깊이 들 어 갈 때 여러분 과 함께 설정 을 어떻게 수정 하 는 지 보 겠 습 니 다.Ribbon 은 다음 과 같은 설정 을 제공 합 니 다 (왼쪽 은 인터페이스 이 고 오른쪽 은 기본 구현 입 니 다).
  • /productslb ribbonClientConfig: DefaultClientConfigImpl
  • productServie : ZoneAvoidanceRule
  • IClientConfig : DummyPing
  • IRule ribbonRule ribbonServerList: ConfigurationBasedServerList
  • IPing ribbonPing ribbonServerListFilter: ZonePreferenceServerListFilter
  • ServerList<Server> ribbonLoadBalancer: ZoneAwareLoadBalancer
  • ServerListFilter<Server> ribbonServerListUpdater: PollingServerListUpdater

  • 이 프로젝트 는 Eureka 를 사 용 했 기 때문에 일부 설정 항목 은 기본 구현 과 다 릅 니 다. 예 를 들 어 Eureka 는 ILoadBalancer 대체 ServerListUpdater 를 사용 하여 Eureka 에 등 록 된 서비스의 목록 을 얻 습 니 다.아래 에 간단 한 Congiguration 류 가 있 는데 Spring 홈 페이지 에서 왔 습 니 다.
    public class SayHelloConfiguration {
    
      @Autowired
      IClientConfig ribbonClientConfig;
    
      @Bean
      public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
      }
    
      @Bean
      public IRule ribbonRule(IClientConfig config) {
        return new AvailabilityFilteringRule();
      }
    
    }

    Ribbon 은 기본적으로 Ping 검사 server 의 건강 상 태 를 보 내지 않 습 니 다. 기본 값 은 정상 입 니 다. 그 다음 에 IRune 기본 값 은 DiscoveryEnabledNIWSServerList AWS EC2 문제 가 많은 zone 을 피 하 는 데 사 용 됩 니 다. 이 는 로 컬 테스트 환경 에서 사용 할 수 없 는 것 입 니 다. 그리고 ribbonServerList Ribbon 자체 의 차단기 기능 을 켜 서 정상적으로 작 동 하지 않 는 서버 를 걸 러 낼 수 있 습 니 다.
    테스트
    먼저 저희 ZoneAvoidanceRule 설정 센터 서 비 스 를 시작 한 다음 에 AvailabilityFilteringRule Eureka 등록 과 발견 서 비 스 를 시작 한 다음 에 두 개 configserver 를 시작 합 니 다. 첫 번 째 는 저희 가 정상적으로 registry 플러그 인 을 사용 하여 시작 할 수 있 습 니 다. 두 번 째 는 새로운 포트 를 제공 해 야 합 니 다. 다음 명령 으로 시작 할 수 있 습 니 다.
    $ SERVER_PORT=8082 mvn spring-boot:run

    마지막 으로 우리 의 productService 클 라 이언 트 프로젝트 를 시작 하고 방문 spring-boot:run 한 다음 에 몇 번 새로 고침 하면 web 실행 중인 두 명령 행 창 이 무 작위 로 우리 의 log 가 나타 납 니 다.
     Access to /products endpoint

    제 블 로그 장 욱 건 블 로그 에 오신 것 을 환영 합 니 다.

    좋은 웹페이지 즐겨찾기