エンタープライズ アプリケーションの複雑さが増すにつれ、アプリケーションを複数のマイクロサービスに分割し、マイクロサービス間の連携を通じてビジネス プロセス全体を完了する企業が増えています。このアーキテクチャ アプローチにより、アプリケーションの安定性と拡張性が向上しますが、負荷分散やサービス検出などの新たな問題も生じます。この記事では、Spring Cloud を使用してマイクロサービス アーキテクチャの下での負荷分散の問題を解決する方法を紹介します。
ロード バランシングとは、複数のサーバー、ネットワーク デバイス、またはアプリケーション間で負荷を割り当て、最適なリソース使用率、最大容量、最速の応答速度、最高の信頼性と最大寿命を達成し、効率的で信頼性の高いサービスを実現することを指します。
たとえば、アプリケーション システムのアクセス数が多く、単一のサーバーではすべてのユーザー リクエストを満たすことができない場合、負荷を複数のサーバーに分散して、システムの安定性とスループットを向上させることができます。時間などマイクロサービス アーキテクチャでは、複数のマイクロサービスと複数のサービス インスタンスが存在するため、負荷分散も重要です。
負荷分散アルゴリズムには通常、次のものが含まれます。
ポーリング アルゴリズムは、負荷分散アルゴリズムの中で最も単純なアルゴリズムの 1 つです。サービスインスタンスのリスト順に各サービスインスタンスにリクエストを振り分け、すべてのサービスインスタンスにリクエストを割り当てた後、最初からリクエストを再振り分けます。ポーリング アルゴリズムの利点は、シンプルでさまざまな負荷シナリオに適していることですが、一部のサービス インスタンスの負荷が高くなりすぎる可能性があるという欠点も明らかです。
ランダム アルゴリズムはリクエストをサービス インスタンスにランダムに割り当てます。これにより、ほとんどの場合、サービス インスタンスの負荷の不均衡を効果的に防ぐことができますが、各サービス インスタンスが割り当てられることを保証することはできません。リクエストはすべて同じ。
加重ポーリング アルゴリズムは、ポーリング アルゴリズムに基づく改良です。つまり、さまざまなサービス インスタンスにさまざまな重み (または比率) を与えることで、それぞれのリクエストの数がサービス インスタンスに割り当てられる値は、その重みに比例します。このアルゴリズムにより、システムがより柔軟になり、サービス インスタンスの実際の機能レベルに応じてリクエストを割り当てることができます。
最小接続アルゴリズムは、現在のサービス インスタンスの実際の負荷に基づいて、最も負荷の軽いサービス インスタンスにリクエストを分散します。このアルゴリズムにより、各サービス インスタンスの負荷が保証されます。バランスは取れていますが、いくつかの欠点もあります。たとえば、特定のリクエストが異なるサービス インスタンスで繰り返し実行される可能性があります。
Spring Cloud は負荷分散のための完全なソリューションを提供します。その中で、中核となるコンポーネントの 1 つがリボンです。リボンは、さまざまな HTTP および TCP サービス クライアントで使用できるクライアント側のロード バランサーで、より安定したバランスの取れた負荷機能をクライアントに提供します。
リボンの使用は非常に簡単で、Spring Boot アプリケーションに次の依存関係を追加するだけです:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
負荷分散が必要な場合は、 pass @ LoadBalanced アノテーションを使用して変更するだけです:
@Autowired @LoadBalanced private RestTemplate restTemplate;
Rest サービスにアクセスする必要がある場合、RestTemplate のリクエスト パスの URI の一部としてサービス名を使用するだけです:
String result = restTemplate.getForObject("http://SERVICE-NAME/path", String.class);
ここで、 SERVICE-NAME はサービス名、 path はサービス パスです。このとき、リボンは、構成された負荷分散アルゴリズムに基づいて利用可能なサービス インスタンスを自動的に選択し、リクエストをサービス インスタンスに分散します。サービス インスタンスが利用できない場合、リボンは次に利用可能なサービス インスタンスを自動的に選択します。
デフォルトでは、Ribbon はポーリング アルゴリズムを使用して負荷分散を実現します。これは構成ファイルを通じて指定することもできます。一般的な負荷分散戦略は次のとおりです。
ribbon: LoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 随机负载均衡 # LoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 轮询负载均衡 # LoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule # 带权重的随机负载均衡 # LoadBalancerRuleClassName: com.netflix.loadbalancer.RepeatableRandomRule # 重试随机负载均衡 # LoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule # 豁免机房、实例挂掉等异常情况负载均衡
この記事では、Spring Cloud のリボンを使用してマイクロサービス アーキテクチャの下で負荷分散を実装する方法を紹介します。リボンの使用は非常に簡単で、負荷分散が必要な場合に @LoadBalanced アノテーションを使用してリボンを変更するだけです。複数のサービス インスタンスが利用可能な場合、リボンは、構成された負荷分散ポリシーに基づいて利用可能なサービス インスタンスを自動的に選択し、負荷分散を実現するために要求をサービス インスタンスに分散します。
以上がSpring Cloud を賢く使用して、マイクロサービス アーキテクチャの下で負荷分散の問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。