[소울 게이트웨이 비밀 탐색] 스프링클라우드 플러그인 원리
4338 단어 java 분산soul
플러그인 포지셔닝
springcloud 플러그인은springcloud 정방향 프록시 플러그인으로 모든springcloud 요청은 이 플러그인에 의해 부하 균형 처리를 합니다.
발효 시기
요청 헤더의 rpcType =springcloud가 활성화되고 플러그인이 활성화되면 요청 매개 변수 일치 규칙에 따라 하위 플러그인에 응답식 프록시로 호출됩니다.
2. 플러그인 처리 프로세스
1) 프로세스 클래스 플러그인을 요청하는 일반 프로세스(AbstractSoulPlugin # execute)를 검토합니다.
public Mono execute(final ServerWebExchange exchange, final SoulPluginChain chain) {
//
String pluginName = named();
final PluginData pluginData = BaseDataCache.getInstance().obtainPluginData(pluginName);
//
if (pluginData != null && pluginData.getEnabled()) {
//
final Collection selectors = BaseDataCache.getInstance().obtainSelectorData(pluginName);
...
//
final SelectorData selectorData = matchSelector(exchange, selectors);
...
//
final List rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
...
//
RuleData rule;
if (selectorData.getType() == SelectorTypeEnum.FULL_FLOW.getCode()) {
//get last
rule = rules.get(rules.size() - 1);
} else {
rule = matchRule(exchange, rules);
}
...
//
return doExecute(exchange, chain, selectorData, rule);
}
//
return chain.execute(exchange);
}
AbstractSoulPlugin은 플러그인의 존재 여부를 판단하고 활성화합니다.
2) springcloud 플러그인의 사용자 정의 프로세스 보기(SpringCloudPlugin # doExecute):
protected Mono doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
...
//
final SpringCloudRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), SpringCloudRuleHandle.class);
//
final SpringCloudSelectorHandle selectorHandle = GsonUtils.getInstance().fromJson(selector.getHandle(), SpringCloudSelectorHandle.class);
...
//
final ServiceInstance serviceInstance = loadBalancer.choose(selectorHandle.getServiceId());
...
// URI
final URI uri = loadBalancer.reconstructURI(serviceInstance, URI.create(soulContext.getRealUrl()));
// URL
String realURL = buildRealURL(uri.toASCIIString(), soulContext.getHttpMethod(), exchange.getRequest().getURI().getQuery());
// url
exchange.getAttributes().put(Constants.HTTP_URL, realURL);
exchange.getAttributes().put(Constants.HTTP_TIME_OUT, ruleHandle.getTimeout());
//
return chain.execute(exchange);
}
SpringCloudPlugin은 선택기 처리 대상을 가져온 다음 부하 균형기를 사용하여 처리 대상의 서비스 id에 따라 서비스 실례를 선택하고 URI를 재구성합니다. 이 URI에 따라 실제 URL을 생성하고 최종 URL과 시간 초과를 설정하면 플러그인 체인 하류에서 처리합니다.
참고:
springcloud 플러그인 자체는 선택기, 규칙, 주입된 부하 균형기에 따라 나누어 줄 서버를 선택하는 실례일 뿐 백엔드 서비스에 직접 요청하지 않습니다.
3. 부하 균형기
springcloud 플러그인은 처리 과정에서 플러그인 자체가divide 플러그인과 같은 탐색과 부하 균형을 담당하지 않고 부하 균형기에 의해 처리된다.
이 부하 균형기는 org를 실현해야 한다.springframework.cloud.client.loadbalancer.LoadBalancer Client, 공식적으로 사용하는 것은 org입니다.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.
3.1 리본이 뭐예요?
리본은 넷플릭스가 발표한 소스 오픈 클라이언트 부하 균형기로서 스프링클라우드-넷플릭스의 중요한 일환으로 넷플릭스의 중간 서비스를 연결시킨다.Ribbon 클라이언트 구성 요소는 연결 시간 초과, 재시도 등 다양한 구성 요소를 제공합니다.쉽게 말하면 설정 파일에 Load Balancer 뒤에 있는 모든 서비스를 표시하면 리본은 자동으로 특정한 규칙(예를 들어 간단한 윤문, 무작위 연결 등)을 바탕으로 이러한 서비스를 연결하고 사용자 정의 부하 균형 알고리즘을 실현하기 쉽다.
3.2 리본은 무엇을 할 수 있을까?
Ribbon은 클라이언트에서 로드 밸런싱을 지원하는 액세스 서비스로서, 주요 기능은 다음과 같습니다.
리본 통합을 통해springcloud 플러그인은springcloud 서비스의 서비스 발견과 부하 균형 정책을 쉽게 실현할 수 있다.
springcloud 플러그인에서 ribbon은 주로 다음과 같은 직책을 맡는다.
springcloud 플러그인은 부하 균형기를 통해springcloud 서비스에 대한 부하 균형을 실현하고 유효한 서비스의 실제 URL을 선택한 후 플러그인 체인 하류에서 처리합니다.
부하 균형기는springcloud 플러그인에서 매우 중요한 일환으로 플러그인의 부하 균형기는 기본적으로ribbon을 사용합니다.