Ribbon負荷分散メカニズムおよびカスタムルール
2691 ワード
Spring Cloud RibbonはHTTPとTCPに基づくクライアント負荷等化ツールであり、NetflixRibbonに基づいて実現されている.SpringCloudのパッケージ化により、サービス向けRestテンプレート要求をクライアント負荷等化サービスコールに自動的に変換することが容易になります.負荷均衡はシステムの高可用性、ネットワーク圧力の一環と処理能力の拡張に対する重要な手段の一つである.負荷等化とは、ハードウェア負荷等化とソフトウェア負荷等化に分けられるサービス側負荷等化を指すことが多い.ハードウェア負荷バランシングは、主に、複雑なバランシングに特化したデバイス、例えばF 5をサーバノード間にインストールすることによって行われる.ソフトウェア負荷分散は、サーバに負荷分散機能またはテンプレートを備えたソフトウェアをインストールすることによって、Nginxなどの要求配布作業を完了します.サービスプロバイダは、複数のサービスインスタンスを起動し、1つの登録センターまたは複数の関連するサービス登録センターに登録するだけです.サービス消費者は,@LoadBalanced注釈で修飾されたRestTemplateを呼び出すことによって,サービス向けインタフェース呼び出しを直接実現する.
1つの負荷イコライザは、少なくとも以下の機能を提供する:各サーバのIPなどの情報を維持するために特定の論理に基づいてサーバを選択し、基本的な負荷イコライザ機能を実現するために、Ribbonの負荷イコライザは3つのサブモジュールRule Ping Server Listからなる
カスタムルールクラス:
テストクラス:
前の記事でクライアントのクラスを変更し、カスタムルールクラスを使用するようにします.
1つの負荷イコライザは、少なくとも以下の機能を提供する:各サーバのIPなどの情報を維持するために特定の論理に基づいてサーバを選択し、基本的な負荷イコライザ機能を実現するために、Ribbonの負荷イコライザは3つのサブモジュールRule Ping Server Listからなる
カスタムルールクラス:
public class MyRule implements IRule{
private ILoadBalancer lb;
public Server choose(Object key) {
Random r = new Random();
int rNum = r.nextInt(10);
List servers = lb.getAllServers();
if(rNum > 7) {
return getServerByPort(servers, 8085);
}
return getServerByPort(servers, 8080);
}
private Server getServerByPort(List servers, int port) {
for(Server s : servers) {
if(s.getPort() == port) {
return s;
}
}
return null;
}
public void setLoadBalancer(ILoadBalancer lb) {
this.lb = lb;
}
public ILoadBalancer getLoadBalancer() {
return this.lb;
}
}
テストクラス:
public class LBMain {
public static void main(String[] args) {
BaseLoadBalancer lb=new BaseLoadBalancer();
MyRule rule=new MyRule();
rule.setLoadBalancer(lb);
lb.setRule(rule);
Listservers=new ArrayList();
servers.add(new Server("localhost",8080));
servers.add(new Server("localhost",8085));
lb.addServers(servers);
for(int i=0;i<10;i++){
Server s=lb.chooseServer(null);
System.out.println(s);
}
}
}
前の記事でクライアントのクラスを変更し、カスタムルールクラスを使用するようにします.
public class TestRibbon {
public static void main(String[] args) throws Exception{
ConfigurationManager.getConfigInstance().setProperty("my-client.ribbon.listOfServers", "localhost:8080,localhost:8085");
ConfigurationManager.getConfigInstance().setProperty(
"my-client.ribbon.NFLoadBalancerRuleClassName", MyRule.class.getName());
RestClient client=(RestClient) ClientFactory.getNamedClient("my-client");
HttpRequest request=HttpRequest.newBuilder().uri("/person").build();
for(int i=0;i<10;i++){
HttpResponse response=client.executeWithLoadBalancer(request);
String json=response.getEntity(String.class);
System.out.println(json);
}
}
}