Spring Cloud 입문 튜 토리 얼 - ribbon 클 라 이언 트 부하 균형 실현
우 리 는 이전 블 로그 의 코드 를 바탕 으로 Ribbon 구성 요 소 를 추가 하여 클 라 이언 트 부하 균형 을 제공 합 니 다.부하 균형 은 높 은 병발, 고성능, 신축 가능 한 서 비 스 를 실현 하 는 중요 한 구성 부분 으로 요청 을 하나의 클 러 스 터 에 분산 시 켜 모든 서버 의 부담 을 줄 일 수 있다.클 라 이언 트 부하 균형 은 클 라 이언 트 프로그램 에서 실 행 됩 니 다. 예 를 들 어 웹 프로젝트 와 같은 다음 에 클 라 이언 트 의 IP 주소 목록 을 가 져 와 서 무 작위 로 server 를 선택 하여 요청 을 보 냅 니 다.서버 부하 균형 에 비해 서버 자원 을 소모 할 필요 가 없다.
기초 환경
프로젝트 원본 코드
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
제 블 로그 장 욱 건 블 로그 에 오신 것 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.