記事ディレクトリ
阿 Q コミュニティへようこそ
https://bbs.csdn.net/topics/617897123
ロードバランシングとは何ですか
平たく言えば、負荷分散とは、負荷 (作業タスク、アクセス要求) を複数のオペレーティング ユニット (サーバー、コンポーネント) に割り当てて実行することです。
負荷分散が行われる場所に応じて、通常、サーバー側の負荷分散とクライアント側の負荷分散に分けられます。
- 一般的な nginx 負荷分散など、サーバー側の負荷分散はサービス プロバイダー側で行われます。
- クライアント側の負荷分散はサービス リクエスト側で行われます。つまり、リクエストを送信する前に、リクエストを処理するインスタンスが選択されます。
通常、マイクロサービスの呼び出し関係ではクライアントの負荷分散を選択します。つまり、サービスを呼び出す側がサービスを実行するプロバイダーを決定します。
負荷分散のカスタマイズされた実装
ショップ製品マイクロサービスを開始する
shop-product
マイクロサービスの開始に基づいて、shop-product
アイデアを通じて別のマイクロサービスを開始し、そのポートを 8082 に設定します。
コマンドは-Dserver.port=8082
nacos経由でマイクロサービスの起動状況を確認する
負荷分散のカスタマイズされた実装
製造オーダーのコードを変更する
public ShopOrder order(@PathVariable("pid") Long pid) {
log.info("客户下单,这时候要调用商品微服务查询商品信息。。。");
//从nacos中获取服务地址
List<ServiceInstance> instances = discoveryClient.getInstances("shop-product");
//自定义规则实现随机挑选服务
int index = new Random().nextInt(instances.size());
ServiceInstance serviceInstance = instances.get(index);
String url = serviceInstance.getHost()+":"+serviceInstance.getPort();
log.info(">>从nacos中获取到的微服务地址为:"+ url);
//通过restTemplate调用商品微服务
ShopProduct shopProduct = restTemplate.getForObject("http://"+url+"/product/"+pid, ShopProduct.class);
log.info("当前用户信息为自己,假设我们设置为1");
ShopOrder shopOrder = new ShopOrder();
shopOrder.setUid(1L);
shopOrder.setUsername("公众号:阿Q说代码");
shopOrder.setPid(shopProduct.getId());
shopOrder.setPname(shopProduct.getPname());
orderService.save(shopOrder);
//商品扣减库存的逻辑
ProductReduceDTO productReduceDTO = new ProductReduceDTO();
productReduceDTO.setProductId(pid);
productReduceDTO.setReductCount(1);
Integer count = restTemplate.postForObject("http://"+url+"/product/reduceStock", productReduceDTO, Integer.class);
return shopOrder;
}
2 つのサービス プロバイダーと 1 つのサービス コンシューマーを開始し、コンシューマーを数回訪問して、その効果をテストします。
リボンに基づいた負荷分散の実装
リボンは Spring Cloud のコンポーネントであり、アノテーションを使用して負荷分散を簡単に処理できるようになります。
注釈を追加する
RestTemplate 生成メソッドに@LoadBalanced
アノテーションを追加する
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
サービスコールのメソッドを変更する
前の手順のコードをコメント アウトし、マイクロサービス名を直接使用して、nacos からサービス アドレスを取得します。
//从nacos中获取服务地址
//自定义规则实现随机挑选服务
//List<ServiceInstance> instances = discoveryClient.getInstances("shop-product");
//int index = new Random().nextInt(instances.size());
//ServiceInstance serviceInstance = instances.get(index);
//String url = serviceInstance.getHost()+":"+serviceInstance.getPort();
//直接使用微服务名字,从nacos中获取服务地址
String url="shop-product";
テストのためにサービスを再起動すると、マイクロサービス呼び出しが成功します。
リボンによってサポートされる負荷分散戦略
リボンには、さまざまな組み込みの負荷分散戦略があります。内部負荷分散の最上位インターフェイスは ですcom.netflix.loadbalancer.IRule
。特定の負荷分散戦略を次の図に示します。
構成を変更してリボンの負荷分散戦略を調整する
# 负载均衡规则
shop-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Bean を注入してリボンの負荷分散戦略を調整する
@Bean
public IRule randomRule(){
return new RandomRule();
}
飢えがいっぱい
なぜハングリー ロードを有効にする必要があるのでしょうか?初めてロードするときの応答時間が比較的遅いためです。その理由は、初めてサービスを追加するときに、サービス登録リストからサービス インスタンスを取得して初期化する必要があるためです。関連コンポーネントを Spring に組み込みます。
ハングリー ロードの関連構成をオンにすると、サービスの開始時にこれらの操作が完了します。
ribbon:
eager-load:
clients:
- shop-product
要約する
この時点で、マイクロサービス呼び出しの負荷分散の実装は終了です。次回は、feign に基づいたマイクロサービス呼び出しの実装についての記事をお届けしますので、お楽しみに!
今後の記事では、引き続きマイクロサービス システムを改善し、より多くの Alibaba コンポーネントを統合していきます。JAVA バックエンドの知識についてもっと知りたい場合は、記事の最後にある名刺をクリックして私にご連絡ください。ワンクリックのトリプルリンクを残して、この冷たいものの中でお互いを温めましょう!