소개
우리는 이전 블로그의 코드를 계속 구축하고 클라이언트로드 밸런싱을 제공하기 위해 리본 구성 요소를 추가합니다. 로드 밸런싱은 높은 동시성, 고성능, 확장 가능한 서비스를 달성하는 데 중요한 부분입니다. 각 서버의 부담을 완화하기 위해 클러스터의 다른 서버에 요청을 배포 할 수 있습니다. 클라이언트로드 밸런싱은 웹 프로젝트와 같은 클라이언트 프로그램에서 실행되며 클러스터의 IP 주소 목록을 얻어 요청을 보내기 위해 서버를 무작위로 선택합니다. 서버로드 밸런싱과 비교하여 서버 리소스를 소비 할 필요는 없습니다.
기본 환경
GIT : 프로젝트 소스 코드
구성 업데이트
이번에는로드 밸런싱을 확인하기 위해 두 개의 제품 서비스 프로그램을 로컬로 시작해야하므로 두 번째 프로그램에 다른 포트를 제공해야합니다. Spring Cloud Configuration Service Center의 구성은 기본적으로 로컬 시스템 환경 변수를 무시합니다. 시스템 환경 변수를 통해 제품 서비스 포트를 설정해야하므로 구성 센터 GIT 저장소에서 제품 서비스의 구성 파일을 수정해야합니다.
서버 : 포트 : 8081Spring : Cloud : Config : allow-Override : True Override-System-Properties : False
허용 오버 라이드의 기본값은 참입니다. 나는 그것을 설명하기 위해 그것을 썼다. 이는 원격 구성 센터의 구성 항목이 로컬 구성이 원격 구성을 덮어 쓰는 것이 아니라 로컬 구성을 덮어 쓸 수 있음을 의미합니다. 물론 우리는 그것을 false로 설정할 수 있지만보다 정확한 커버리지 규칙을 제공하기 위해 기본값이 여기에 보존됩니다.
원격 구성 센터의 구성 파일이 로컬 구성을 덮어 쓸 수 있지만 로컬 시스템 변수를 덮어 쓰지 않더라도 Override-System-Properties = false를 추가했습니다. 수정이 완료된 후 GIT 저장소에 제출하십시오.
또한 Load Balancing이 효과적인 지 확인하기 위해 Productservice 프로젝트의 ProductScontroller에 일부 로그를 추가하십시오.
패키지 cn.zxuqian.controllers; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.sprameframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; 개인 정적 로거 로그 = loggerFactory.getLogger (ProductController.class); @RequestMapping ( " /Products") public String ProductList () {log.info ( "Access on /Products Endpoint"); "코트, 재킷, 스웨터, 티셔츠"를 반환합니다. }}웹 용 리본을 구성하십시오
먼저 pom.xml에 리본의 종속성을 추가하십시오.
<pectionency> <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Netflix-Ribbon </artifactid> </fectionency>
그런 다음 응용 프로그램 클래스를 수정하고 다음 코드를 추가하십시오.
@enablecircuitbreaker@enablediscoveryclient@ribbonclient (name = "product-service")@springbootapplicationpublic class application {public static void main (String [] args) {springApplication.Run (applact.class, args); } @bean @loadbalanced public resttemplate rest (resttemplatebuilder builder) {return builder.build (); }} 여기서 우리는 @ribbonclient (name = "product-service") 주석을 사용 하여이 프로젝트를 리본로드 밸런싱 클라이언트로 표시합니다. 필요한 서비스에 액세스하려면 제품 서비스 클러스터 중 하나를 선택해야합니다. 여기서 이름 속성은 Spring.application.name 속성에 해당합니다.
@loadbalanced 주석은 RestTemplate이 Ribbon의 LoadBalancerClient를 자동으로 사용하여 서비스의 URI를 선택하고 요청을 보내도록 구성 될 것임을 나타냅니다.
ProductService 클래스에 다음 코드를 추가합니다.
@ServicePublic Class ProductService {Private Final RestTemplate RestTemplate; @autowired Private DiscoveryClient DiscoveryClient; Public ProductsErvice (resttemplate resttemplate) {this.resttemplate = resttemplate; } @HyStrixCommand (flangbackMethod = "BackupProductList") public String productList () {list <serviceInstance> instances = this.discoveryClient.getInstances ( "product-service"); if (instances! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instances.get (0) .geturi () + "/products", String.class); } 반품 ""; } public String BackupProductList () {return "Jack, Sweater"; } public String productListloadBalanced () {return this.resttemplate.getForObject ( "http : // product-service/products", String.class); }}새로운 ProductListLoadBalanced 방법이 여기에 추가되었으며 이전 ProductList 방법과 동일한 서비스에 액세스하지만 리본 클라이언트와로드 밸런싱입니다. 여기서 URI 호스트는 액세스 할 서비스 이름이되었으며 @RibbonClient에서 구성된 이름 속성과 일치합니다. 마지막으로 ProductController에 다음 코드를 추가하십시오.
@RestControllerPublic Class ProductController {@autowired Private ProductService ProductService; @requestmapping ( "/products") public String productList () {return productService.productList (); } @requestmapping ( "/productslb") public String productListloadBalanced () {return productService.productListLoadBalanced (); }}구체적으로 /productslb 요청을 처리하고 ProductsErvie를 호출하여로드 밸런싱을 제공하는 메소드를 작성하십시오.
이 시점에서 코드가 완료됩니다. 코드는 간단 해 보이지만 실제로 모든 구성은 기본값을 사용합니다. 리본은 리본 클라이언트를 구성하기위한 프로그래밍 및 구성 방법을 제공합니다. 간단한 소개를하겠습니다. 리본에 더 깊이 들어가면 구성을 수정하는 방법을 살펴 보겠습니다. 리본은 다음 구성을 제공합니다 (인터페이스는 왼쪽에 있고 기본 구현이 오른쪽에 있습니다).
프로젝트는 Eureka를 사용하기 때문에 일부 구성 항목은 기본 구현과 다릅니다. 예를 들어, Eureka는 RibbonserverList 대신 DiscoveryEnabledNiwsserverlist를 사용하여 Eureka에 등록 된 서비스 목록을 얻습니다. Spring 공식 웹 사이트에서 아래에 간단한 구성 클래스가 있습니다.
공개 클래스 SayHelloConfiguration {@autowired iclientconfig ribbonclientConfig; @bean public iping ribbonping (iclientconfig config) {return new pingurl (); } @bean public irule ribbonrule (iclientconfig config) {return new availabilityfilteringrule (); }}리본은 기본적으로 서버의 건강 상태를 확인하기 위해 핑을 보내지 않으며 기본값은 정상입니다. 그런 다음 IRUNE는 AWS EC2에 많은 문제가있는 영역을 피하기 위해 기본적으로 ZoneaVoidancerule로 구현됩니다. 이것은 로컬 테스트 환경에서 사용할 수 없습니다. 그런 다음 availabilityFilteringRule로 교체됩니다. 이를 통해 리본과 함께 제공되는 회로 차단기 기능이 제대로 작동하지 않는 서버를 필터링 할 수 있습니다.
시험
먼저 Configserver Configuration Center 서비스를 시작한 다음 등록 Eureka 등록 및 검색 서비스를 시작한 다음 두 개의 ProductsErvices를 시작하십시오. 첫 번째는 Spring-Boot : RUN 플러그인을 시작하고 두 번째는 새로운 포트를 제공하는 것입니다. 이는 다음 명령으로 시작할 수있는 새 포트를 제공하는 것입니다.
$ server_port = 8082 MVN 스프링 부트 : 실행
마지막으로 웹 클라이언트 프로젝트를 시작하고 http : // localhost : 8080/productslb를 방문한 다음 몇 번 새로 고치십시오. ProductService를 실행하는 두 개의 명령 줄 Windows가 무작위로 나타날 것임을 알 수 있습니다.
/제품에 대한 액세스 종말점
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.