どのようにRestit Templateの基礎の上でカスタムの負荷の均衡のアルゴリズムを実現しますか?
2916 ワード
私たちはすべてのRertTemplateがHTTP呼出しができることを知っていますが、彼は負荷均衡アルゴリズムを備えていません.次に、nacos+restit Templateを使って、独自の負荷均衡アルゴリズムを実現します.
Restit Templateにロードバランスアルゴリズムを追加するには、まずRertTemplateのソースコードを知る必要があります.
上から見たRets Templateは多くの方法が含まれていますが、各方法は最終的にdoExecut方法を呼び出します.
私たちはURLでドキュメントを作ることができます.呼出する前にまずnacosからサービスを呼び出すリストを取得して、負荷均衡アルゴリズムでサービスを選択します.
(1)nacosからサービスリストを取得し、サービスを選択して呼び出します.
Restit Templateにロードバランスアルゴリズムを追加するには、まずRertTemplateのソースコードを知る必要があります.
上から見たRets Templateは多くの方法が含まれていますが、各方法は最終的にdoExecut方法を呼び出します.
protected T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor responseExtractor) throws RestClientException {
Assert.notNull(url, "URI is required");
Assert.notNull(method, "HttpMethod is required");
ClientHttpResponse response = null;
try {
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
catch (IOException ex) {
String resource = url.toString();
String query = url.getRawQuery();
resource = (query != null ? resource.substring(0, resource.indexOf('?')) : resource);
throw new ResourceAccessException("I/O error on " + method.name() +
" request for \"" + resource + "\": " + ex.getMessage(), ex);
}
finally {
if (response != null) {
response.close();
}
}
}
私たちはどうやって修正しますか?私たちはURLでドキュメントを作ることができます.呼出する前にまずnacosからサービスを呼び出すリストを取得して、負荷均衡アルゴリズムでサービスを選択します.
(1)nacosからサービスリストを取得し、サービスを選択して呼び出します.
private URI replaceUrl(URI url){
//1: URI serviceName=product-center
String serviceName = url.getHost();
log.info(" :{}",serviceName);
//2: reqPath= /selectProductInfoById/1
String reqPath = url.getPath();
log.info(" path:{}",reqPath);
// nacos
List serviceInstanceList = discoveryClient.getInstances(serviceName);
if(serviceInstanceList.isEmpty()) {
throw new RuntimeException(" :"+serviceName);
}
String serviceIp = chooseTargetIp(serviceInstanceList);
String source = serviceIp+reqPath;
try {
return new URI(source);
} catch (URISyntaxException e) {
log.error(" source:{} URI ",source);
}
return url;
}
choseTarget Ipで自己負荷均衡アルゴリズムを実現できます. private String chooseTargetIp(List serviceInstanceList) {
//
Random random = new Random();
Integer randomIndex = random.nextInt(serviceInstanceList.size());
String serviceIp = serviceInstanceList.get(randomIndex).getUri().toString();
log.info(" IP:{}",serviceIp);
return serviceIp;
}