1 : 리본이란 무엇입니까?
리본은 Netflix가 발표 한 오픈 소스 프로젝트입니다. 주요 기능은 클라이언트 측 소프트웨어로드 밸런싱 알고리즘을 제공하여 Netflix의 중간 계층 서비스를 함께 연결하는 것입니다. 리본 클라이언트 구성 요소는 연결 시간 초과, 재 시도 등과 같은 일련의 완전한 구성 항목을 제공합니다. 리본은 특정 규칙 (예 : 간단한 폴링, 인스턴트 연결 등)에 따라 이러한 기계를 자동으로 연결하는 데 도움이됩니다. 또한 리본을 사용하여 맞춤형로드 밸런싱 알고리즘을 구현할 수있는 매우 쉬운 방법이 있습니다.
둘 : LB 체계 분류
현재 주류 LB 체계는 두 가지 범주로 나눌 수 있습니다. 하나는 중앙 집중식 LB입니다. 다른 하나는 LB 논리를 소비자와 통합하는 과정 중 LB이며, 소비자는 주소를 사용할 수있는 서비스 등록 센터에서 알고있는 다음 이러한 주소 자체에서 적절한 서버를 선택합니다. 리본은 후자에 속합니다. 소비자 프로세스에 통합 된 클래스 라이브러리 일뿐입니다. 이를 통해 소비자는 서비스 제공 업체의 주소를 얻습니다.
셋째 : 리본의 주요 구성 요소 및 워크 플로
리본의 핵심 구성 요소 (모두 인터페이스 유형)는 다음과 같습니다.
ServerList
주소 목록을 얻는 데 사용됩니다. 정적 (고정 된 주소 세트 제공) 또는 동적 (레지스트리의 주소 목록에 대한 반복 쿼리) 일 수 있습니다.
ServerListFilter
Dynamic ServerList를 사용할 때만 사용되며 원래 서비스 목록의 특정 정책을 사용하여 일부 주소를 고려하는 데 사용됩니다.
이룰
LB 결과로 최종 서비스 주소를 선택하십시오. 선택 정책에는 폴링, 응답 시간에 따른 가중치, 회로 차단기 (Hystrix를 사용할 수있는 경우) 등이 포함됩니다.
리본이 작동하면 ServerList를 사용하여 사용 가능한 모든 서비스 목록을 얻은 다음 ServerListFilter를 사용하여 일부 주소를 고려한 다음 최종 결과로 iRule을 통해 나머지 주소에서 서버를 선택하는 것이 좋습니다.
Four : 리본이 제공 한 주요로드 밸런싱 전략 소개
1 : 간단한 폴링 하중 밸런싱 (라운드 로빈)
요청은 교단식 방식으로 예정되어 있습니다. 즉, 각 일정은 i = (i + 1) mod n으로 실행되며 I-th 서버가 선택됩니다.
2 : 랜덤로드 밸런싱 (무작위)
UP 상태를 가진 서버를 무작위로 선택하십시오
3 : 가중치 반응 부하 밸런싱 (weightedResponseTime)
해당 시간에 따라 무게가 할당됩니다. 해당 시간이 길수록 무게가 작고 선택 가능성이 낮습니다.
4 : Zoneavoidancerule
서버 영역 및 서버 가용성 선택 서버의 성능을 종합적으로 결정
리본 자체로드 밸런싱 전략 비교
| 전략 이름 | 정책 진술 | 정책 설명 | 구현 지침 |
| BestavailableBerule | Public Class BestavailableBerule은 ClientConfigEnabledRoundroBinrule을 확장합니다 | 동시 요청이 가장 작은 서버를 선택하십시오 | 서버를 하나씩 확인하십시오. 서버가 트립 된 경우 무시하십시오. ActiveRequestScount의 가장 작은 서버를 선택하십시오 |
| 가용성 filteringrule | 공개 클래스 가용성 FilteringRule은 PRECTICEBASEDRULE을 확장합니다 | 연결 고장으로 인해 회로 트립으로 표시된 백엔드 서버를 필터링하고 동시성이 높은 백엔드 서버를 필터링합니다 (활성 연결은 구성된 임계 값을 초과) | 필터링 서버의 논리를 포함하기 위해 가용성 프리데리를 사용하여 실제로 상태에 기록 된 각 서버의 실행 상태를 확인하는 것입니다. |
| 가중치 반응성 | 공개 클래스 가중치 회수 정수리는 RoundRobinrule을 확장합니다 | 해당 시간에 따라 무게가 할당됩니다. 해당 시간이 길수록 무게가 작고 선택 가능성이 낮습니다. | 배경 스레드는 정기적으로 상태에서 평가 응답 시간을 읽고 각 서버의 가중치를 계산합니다. 가중치 계산도 비교적 간단합니다. 응답 시간 마이너스 각 서버의 평균 응답 시간은 서버의 가중치입니다. 상태가 방금 시작되고 통계가 형성되지 않으면 Roubine 정책을 사용하여 서버를 선택하십시오. |
| 리틀 룰 | 공개 클래스 리틀 룰은 AbstractLoadBalancerRule을 확장합니다 | 선택한로드 밸런싱 정책을 위해 기계의 메커니즘을 다시 시도하십시오. | 구성 기간 동안 서버 선택이 실패한 경우 Subrule을 사용하여 사용 가능한 서버를 계속 선택하려고합니다. |
| 라운드 로빈 룰 | 공개 클래스 Roundrobinrule은 AbstractLoadBalancerRule을 확장합니다 | Roundrobin Method Select 서버를위한 폴링 | 폴링 색인 및 색인에 해당하는 서버를 선택하십시오 |
| 무작위 | 공개 클래스 RandomRule은 AbstractLoadBalanCerrule을 확장합니다 | 무작위로 서버를 선택하십시오 | 색인에서 무작위로 인덱스 위치에 해당하는 서버를 선택하십시오. |
| ZoneAvoidancerule | 공개 클래스 Zoneavoidancerule은 술어 기반 룰을 확장합니다 | 서버 영역 및 서버 가용성 선택 서버의 성능을 종합적으로 결정 | ZoneAovoidancePredicate 및 AvailabilityPredicate를 사용하여 서버가 선택되었는지 여부를 결정하십시오. 이전에는 구역의 운영 성능이 사용 가능한지 여부를 결정합니다. 사용할 수없는 영역 (모든 서버)을 제외하십시오. 가용성 프레디 케이트는 너무 많은 연결로 서버를 필터링하는 데 사용됩니다. |
5 : 리본 만
Maven 프로젝트 이름 Ribbon_client를 만듭니다
POM 컨텐츠
<pectionies> <pectionency> <groupId> com.netflix.Ribbon </groupId> <artifactID> Ribbon-Core </artifactid> <version> 2.2.0 </version> </depectency> <groupId> com.netflix.ribbon </groupid> <artifactid> </version> 2.0 </version> 2.2.0.2.0.2.0.2.0.2.0.2.0. </의존성>
샘플 client.properties 구성 파일
# 최대의 복수 수수 샘플-클라이언트 .ribbon.maxautoretries = 1# 최대 다음 서버의 최대 샘플 클라이언트 (첫 번째 서버 제외) Sample-Client.ribbon.maxAutoretriesnexTserver = 1#이 클라이언트 샘플-클라이언트에 대해 모든 작업이 재조정 될 수 있는지 여부 Sample-Client.Ribbon.serverlistRefreshinterval = 2000# Apache httpclient sample-client.ribbon.connecttimeout = 3000# Apache Httpclient Sample-Client.RIBBON.READTIMBON.READTIMBON# 런타임에서 Archaius 속성을 통해 변경 될 수 있습니다. Sample-Client.Ribbon.listofServers = www.sohu.com : 80, www.163.com : 80, www.sina.com.cn : 80sample-client.ribbon.enableprimeconnection = true
리본 메인 코드
import java.net.uri; import com.netflix.client.clientFactory; import com.netflix.client.http.httprequest; import com.netflix.client.http.http.htttp.httpresponse; import com.netflix.config.configurationManager; import com.netflix.loadbalancer.zoneawareloadoadanoad. com.netflix.niws.client.http.restclient; public class ribbonmain {public static void main (string [] args)은 예외 {configurationManager.loadPropertiesfromResources ( "sample-client.properties"); System.out.println (configurationManager.getConfiginstance (). getProperty ( "sample-client.ribbon.listofServers")); restclient client = (restclient) clientFactory.getNamedClient ( "Sample-Client"); httprequest request = httprequest.newbuilder (). uri (new uri ( "/")). build (); for (int i = 0; i <4; i ++) {httpresponse response = client.executewithloadbalancer (request); System.out.println ( "URI의 상태 :" + response.getRequestEduri () + "는 :" + response.getStatus ()); } Zoneawareloadbalancer lb = (Zoneawareloadbalancer) client.getloadbalancer (); System.out.println (lb.getloadbalancerstats ()); configurationManager.getConfiginstance (). setProperty ( "sample client.ribbon.listofservers", "ccblog.cn:80,www.linkedin.com:80"); System.out.println ( "서버 변경 ..."); Thread.sleep (3000); for (int i = 0; i <3; i ++) {httpresponse response = client.executewithloadbalancer (request); System.out.println ( "URI의 상태 :" + response.getRequestEduri () + "는 :" + response.getStatus ()); } system.out.println (lb.getloadbalancerstats ()); }}코드 구문 분석
Archaius configurationManager를 사용하여 속성을로드하십시오.
ClientFactory를 사용하여 클라이언트 및로드 밸런서를 생성합니다.
Builder를 사용하여 HTTP 요청을 구축하십시오. URI의 "/"부분의 경로 만 지원합니다. 로드 밸런서에 의해 서버를 선택하면 클라이언트는 전체 URI를 계산합니다.
API Client.ExecuTeWithLoadBalancer () 호출은 exeucte () API가 아닙니다.
구성에서 서버 풀을 동적으로 수정합니다.
서버 목록이 새로 고침 될 때까지 대기합니다 (구성 파일에 정의 된 새로 고침 간격은 3 초입니다).
로드 밸런서에서 기록한 서버 통계를 인쇄합니다.
6 : 리본은 유레카와 결합되었습니다
먼저 Eureka_register_Service Project (등록 센터) 및 Biz-Service-0 Project (서비스 생산자)를 시작하십시오.
Maven 프로젝트 작성 Eureka_Ribbon_Client이 프로젝트가 시작되고 관련 구성이 eureka_register_service 및 biz-service-0에 따라 다릅니다.
POM 가입
<부모> <groupid> org.springframework.boot </groupid> <artifactid> Spring-boot-starter-parent </artifactid> <bersion> 1.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.30 </version> <allativePath/> <!-REPOSITION에서 모호한 부모-> </parent> <pecient <ception> <groupid> org.spramframwork.clwork.clework.clework.clework.clework.clework.clwork.scramegr. <Artifactid> Spring-Cloud-Starter-Ribbon </artifactid> </fectionency> <pectionement> <groupid> org.springframework.cloud </groupid> <trucicd> Spring-Cloud-Starter-eureka </arevactid> </fexendency> <groupid> <groupid> org.springframework.boot> <artifactid> Spring-Boot-starter-web </artifactid> </fectionency> <pectionement> <groupid> org.springframework.boot </groupid> <trefactid> spring-boot-starter-test </artifactid> <scope> test </scope> </dependencies> <peplencymanagement> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <bersion> brixton.release </version> <type> pom </type> <scope> 가져 오기 </scope> </fexendence> </sectionements> </fectionementmanagement>
애플리케이션 메인 클래스에서 @EnableDiscoveryClient 주석을 통해 Discovery 서비스 기능을 추가하십시오. resttemplate 인스턴스를 생성하고 @loadbalanced 주석을 통해 균형을 맞추십시오.
@springbootApplication @enablediscoveryClientPublic Class ribbonApplication {@bean @loadbalanced resttemplate resttemplate () {return new RestTemplate (); } public static void main (String [] args) {springApplication.run (ribbonApplication.class, args); }}Biz-Service-0의 GetUser 서비스를 소비하려면 ConsicerController를 만듭니다. 직접 resttemplate로 서비스를 호출합니다
@RestControllerPublic 클래스 CONCERERCONTROLLER {@autowired resttemplate resttemplate; @requestmapping (value = "/getUserInfo", method = retimeTemplate.getForentity ( "http : // biz-service-0/getUser", string.class) .getBody (); }} Application.properties에서 Eureka Service Registration Center를 구성하십시오
spring.application.name = ribbon-consumerserver.port = 8003eureka.client.serviceurl.defaultzone = http : // localhost : 8000/eureka/
완료 후 http : // localhost : 8003/getuserinfo를 열어 결과를 확인할 수 있습니다.
요약 : 리본은 실제로 소프트로드 밸런싱 클라이언트 구성 요소입니다. 다른 필요한 요청과 함께 사용할 수 있습니다. 유레카와 결합하는 것이 그 예일뿐입니다.
코드 주소 : https://github.com/zhp8341/springclouddemo
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.