本篇內(nèi)容主要講解“spring cloud的FeignLoadBalancer怎么用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“spring cloud的FeignLoadBalancer怎么用”吧!
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),廣靈企業(yè)網(wǎng)站建設(shè),廣靈品牌網(wǎng)站建設(shè),網(wǎng)站定制,廣靈網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,廣靈網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
本文主要研究一下spring cloud的FeignLoadBalancer
spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java
public class FeignLoadBalancer extends AbstractLoadBalancerAwareClient{ private final RibbonProperties ribbon; protected int connectTimeout; protected int readTimeout; protected IClientConfig clientConfig; protected ServerIntrospector serverIntrospector; public FeignLoadBalancer(ILoadBalancer lb, IClientConfig clientConfig, ServerIntrospector serverIntrospector) { super(lb, clientConfig); this.setRetryHandler(RetryHandler.DEFAULT); this.clientConfig = clientConfig; this.ribbon = RibbonProperties.from(clientConfig); RibbonProperties ribbon = this.ribbon; this.connectTimeout = ribbon.getConnectTimeout(); this.readTimeout = ribbon.getReadTimeout(); this.serverIntrospector = serverIntrospector; } @Override public RibbonResponse execute(RibbonRequest request, IClientConfig configOverride) throws IOException { Request.Options options; if (configOverride != null) { RibbonProperties override = RibbonProperties.from(configOverride); options = new Request.Options(override.connectTimeout(this.connectTimeout), override.readTimeout(this.readTimeout)); } else { options = new Request.Options(this.connectTimeout, this.readTimeout); } Response response = request.client().execute(request.toRequest(), options); return new RibbonResponse(request.getUri(), response); } @Override public RequestSpecificRetryHandler getRequestSpecificRetryHandler( RibbonRequest request, IClientConfig requestConfig) { if (this.ribbon.isOkToRetryOnAllOperations()) { return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), requestConfig); } if (!request.toRequest().httpMethod().name().equals("GET")) { return new RequestSpecificRetryHandler(true, false, this.getRetryHandler(), requestConfig); } else { return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), requestConfig); } } @Override public URI reconstructURIWithServer(Server server, URI original) { URI uri = updateToSecureConnectionIfNeeded(original, this.clientConfig, this.serverIntrospector, server); return super.reconstructURIWithServer(server, uri); } //...... }
FeignLoadBalancer繼承了AbstractLoadBalancerAwareClient,它的構(gòu)造器接收ILoadBalancer、IClientConfig、ServerIntrospector,設(shè)置的retryHandler為RetryHandler.DEFAULT
其execute方法首先構(gòu)造Request.Options,然后通過(guò)request.client().execute來(lái)獲取Response,最后返回RibbonResponse
FeignLoadBalancer還覆蓋了getRequestSpecificRetryHandler方法,針對(duì)ribbon.isOkToRetryOnAllOperations()來(lái)構(gòu)建不同的RequestSpecificRetryHandler;還覆蓋了reconstructURIWithServer方法,它使用RibbonUtils的updateToSecureConnectionIfNeeded來(lái)構(gòu)建URI
spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java
protected static class RibbonRequest extends ClientRequest implements Cloneable { private final Request request; private final Client client; protected RibbonRequest(Client client, Request request, URI uri) { this.client = client; setUri(uri); this.request = toRequest(request); } private Request toRequest(Request request) { Map> headers = new LinkedHashMap<>( request.headers()); return Request.create(request.httpMethod(), getUri().toASCIIString(), headers, request.requestBody()); } Request toRequest() { return toRequest(this.request); } Client client() { return this.client; } HttpRequest toHttpRequest() { return new HttpRequest() { @Override public HttpMethod getMethod() { return HttpMethod .resolve(RibbonRequest.this.toRequest().httpMethod().name()); } @Override public String getMethodValue() { return getMethod().name(); } @Override public URI getURI() { return RibbonRequest.this.getUri(); } @Override public HttpHeaders getHeaders() { Map > headers = new HashMap<>(); Map > feignHeaders = RibbonRequest.this .toRequest().headers(); for (String key : feignHeaders.keySet()) { headers.put(key, new ArrayList (feignHeaders.get(key))); } HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(headers); return httpHeaders; } }; } public Request getRequest() { return this.request; } public Client getClient() { return this.client; } @Override public Object clone() { return new RibbonRequest(this.client, this.request, getUri()); } }
RibbonRequest繼承了ClientRequest實(shí)現(xiàn)了Cloneable接口,它提供了toHttpRequest方法來(lái)將feign的Request轉(zhuǎn)換為spring的HttpRequest
spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java
protected static class RibbonResponse implements IResponse { private final URI uri; private final Response response; protected RibbonResponse(URI uri, Response response) { this.uri = uri; this.response = response; } @Override public Object getPayload() throws ClientException { return this.response.body(); } @Override public boolean hasPayload() { return this.response.body() != null; } @Override public boolean isSuccess() { return this.response.status() == 200; } @Override public URI getRequestedURI() { return this.uri; } @Override public Map> getHeaders() { return this.response.headers(); } Response toResponse() { return this.response; } @Override public void close() throws IOException { if (this.response != null && this.response.body() != null) { this.response.body().close(); } } }
RibbonResponse實(shí)現(xiàn)了IResponse接口,將feign的Response適配為netflix的IResponse
FeignLoadBalancer繼承了AbstractLoadBalancerAwareClient,它的構(gòu)造器接收ILoadBalancer、IClientConfig、ServerIntrospector,設(shè)置的retryHandler為RetryHandler.DEFAULT
其execute方法首先構(gòu)造Request.Options,然后通過(guò)request.client().execute來(lái)獲取Response,最后返回RibbonResponse
FeignLoadBalancer還覆蓋了getRequestSpecificRetryHandler方法,針對(duì)ribbon.isOkToRetryOnAllOperations()來(lái)構(gòu)建不同的RequestSpecificRetryHandler;還覆蓋了reconstructURIWithServer方法,它使用RibbonUtils的updateToSecureConnectionIfNeeded來(lái)構(gòu)建URI
到此,相信大家對(duì)“spring cloud的FeignLoadBalancer怎么用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!