【Spring Cloud】マイクロサービス呼び出しの負荷分散を実装する

阿 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 バックエンドの知識についてもっと知りたい場合は、記事の最後にある名刺をクリックして私にご連絡ください。ワンクリックのトリプルリンクを残して、この冷たいものの中でお互いを温めましょう!

おすすめ

転載: blog.csdn.net/Qingai521/article/details/135912210