Ribbon負荷分散メカニズムおよびカスタムルール


Spring Cloud RibbonはHTTPとTCPに基づくクライアント負荷等化ツールであり、NetflixRibbonに基づいて実現されている.SpringCloudのパッケージ化により、サービス向けRestテンプレート要求をクライアント負荷等化サービスコールに自動的に変換することが容易になります.負荷均衡はシステムの高可用性、ネットワーク圧力の一環と処理能力の拡張に対する重要な手段の一つである.負荷等化とは、ハードウェア負荷等化とソフトウェア負荷等化に分けられるサービス側負荷等化を指すことが多い.ハードウェア負荷バランシングは、主に、複雑なバランシングに特化したデバイス、例えばF 5をサーバノード間にインストールすることによって行われる.ソフトウェア負荷分散は、サーバに負荷分散機能またはテンプレートを備えたソフトウェアをインストールすることによって、Nginxなどの要求配布作業を完了します.サービスプロバイダは、複数のサービスインスタンスを起動し、1つの登録センターまたは複数の関連するサービス登録センターに登録するだけです.サービス消費者は,@LoadBalanced注釈で修飾されたRestTemplateを呼び出すことによって,サービス向けインタフェース呼び出しを直接実現する.
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);
		}
	}

}