SpringCloudプロジェクトのビルド方法を教えます (5)プロデューサークラスター版のビルド

マイクロサービスとは何ですか? シリーズが一目でわかる!

1. SpringCloudプロジェクトのビルド方法を教えます (1) 写真とテキストで詳しく説明、アホのような操作

2. SpringCloud プロジェクトの構築方法を教える (2) プロデューサーとコンシューマー

3. SpringCloudプロジェクトの構築方法を教えます (3) Eurekaサービス登録センターの統合

4. SpringCloudプロジェクトの構築方法を教えます (4) Eurekaクラスタのバージョン構築

5. SpringCloudプロジェクトのビルド方法を教えます (5) プロデューサークラスターバージョンをビルドします

6. SpringCloudプロジェクトの構築方法を教えます (6) Eurekaはサービスディスカバリを実現します

7. SpringCloudプロジェクトの構築方法を教える (7) Consulサービス登録センターを統合する

8. SpringCloudプロジェクトの構築方法を教えます (8) 統合リボンロードバランサ

9. SpringCloud プロジェクトの構築方法を説明します (9) OpenFeign サービス インターフェイス呼び出しの統合

10. SpringCloud プロジェクトの構築方法を教えます (10) Hystrix サービスのダウングレードの統合

11. SpringCloud プロジェクトの構築を教える (11) Hystrix のサービス ヒューズの統合

12. SpringCloud プロジェクトの構築方法を教える (12) Hystrix のグラフィカル ダッシュボードのリアルタイム モニタリングを統合する

13. SpringCloud プロジェクトの構築方法を教える (13) 新世代のゲートウェイを統合する

14. SpringCloudプロジェクトの構築方法を教えます (14) Integrated Config Distributed Configuration Center

15. SpringCloudプロジェクトの構築方法を教えます (15) Integrated Busメッセージバス

16. SpringCloud プロジェクトの構築方法を説明します (16) 統合された Stream メッセージ ドライバー

17. SpringCloud プロジェクトの構築方法を説明します (17) Sleuth 分散リンク追跡の統合

これからも更新していきますので、いいねやフォロー大歓迎です!
この記事では主に、プロデューサー クラスター (つまり、支払うサービス) の構築について説明します负载均衡。以前にポート 8001 で構築したサービス、cloud-provide-payment を参照します。今度は、ポート 7002 で、cloud-provide-payment02 サービスを構築します。

前の作成および構成の手順は省略されており、具体的な手順については前の記事を参照してください。ここでの主な作業は、yml ファイル内のポート番号を変更することです。以下に示すように:

server:
  port: 8002 #服务端口
#spring相关配置
spring:
  application:
    name: mcroservice-payment  #服务名
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver  #数据库驱动包
    url: jdbc:mysql://localhost:3306/db01?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
    username: root
    password: root
#mybatis:配置
mybatis:
  mapperLocations: classpath:dao/*.xml
  type-aliases-package: com.buba.springcloud.pojo    # 所有pojo别名类所在包
#eureka配置
eureka:
  client:
    #表示是否将自己注册进eureka  默认为true
    register-with-eureka: true
    #是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #集群配置
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8002
    prefer-ip-address: true

7001、7002 を開始し、次に 8001、8002、80 プロジェクトを開始して効果を確認します。セルフテストのために localhost:8001/payment/get/1 にアクセスします。成功したインターフェイスは次のとおりです。

ここに画像の説明を挿入

セルフテストのために localhost:8002/payment/get/1 にアクセスします。成功したインターフェイスは次のとおりです。

ここに画像の説明を挿入

http://localhost/consumer/payment/get/1 にアクセスし、常にポート 8001 を使用するプロデューサー サービスにアクセスします。ポート 8002 のプロデューサー サービスは呼び出されません。
ここに画像の説明を挿入

その理由は、次の図に示すように、コンシューマー サービスのコントローラー層でリクエスト パスをハードコーディングしたためです。

ここに画像の説明を挿入

以下の図に示すように、プロデューサーのサービス名に変更するだけです。

ここに画像の説明を挿入

ただし、localhost/consumer/payment/get/1 にアクセスすると、次のエラー メッセージが表示されます。
ここに画像の説明を挿入

その理由は、サービス名によるアクセスを構成しましたが、それがどのサービスであるかを判断できないためです。したがって、restTemplate の負荷分散を有効にする必要があります。デフォルトはラウンドロビンです。@LoadBalanced アノテーションをrestTemplate 構成クラスに追加するだけで、負荷分散が有効になります。以下に示すように:

package com.buba.springclould.order.config;
 
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
 
@Configuration
public class ApplicationContextConfig {
    
    
    @Bean
    //RestTemplate 的负载均衡能力
    @LoadBalanced
    public RestTemplate getRestTemplate(){
    
    
        return new RestTemplate();
    }
}

次に、コンシューマー サービスを再起動し、localhost/consumer/payment/get/1 に再度アクセスします。ロード バランシングがオンになり、次の図に示すように、プロデューサーの 2 つのサービスが交互に回転します。
ここに画像の説明を挿入

以下に示す @LoadBalanced アノテーションのソース コードを見てみましょう。

/**
 * Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient
 * @author Spencer Gibb
 */
@Target({
    
     ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
    
    
}

@LoadBalanced は、LoadBalancerClient を使用するように設定される RestTemplate Bean をマークするために使用されるアノテーションであることがわかります。次に、以下に示すように、LoadBalancerClient を見てみましょう。

public interface ServiceInstanceChooser {
    
    
    ServiceInstance choose(String serviceId);
}
public interface LoadBalancerClient extends ServiceInstanceChooser {
    
    <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;<T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
​
    URI reconstructURI(ServiceInstance instance, URI original);
}

LoadBalancerClient は 4 つのメソッドを持つインターフェイスです。これらのメソッドの機能を見てみましょう。

  1. ServiceInstance Choice(String serviceId) は、受信サービス名 serviceId に従って、クライアント ロード バランサーから対応するサービスのインスタンスを選択します。

  2. Texecute() 、ロードバランサーから選択されたサービスインスタンスを使用してリクエストを実行します。

  3. URI再構築URI(ServiceInstanceインスタンス,URIオリジナル)は、システムに適したURIを構築することを意味します。
    記事「サービスの検出と消費」でリクエストを送信するときに、サービスの論理名(http://HELLO-SERVICE/hello)を使用しました。 Spring Cloud 特定のサービス アドレスの代わりに、reconstructURI メソッドでは、最初のパラメーター ServiceInstance インスタンスはホストとポートを持つ特定のサービス インスタンスであり、2 番目のパラメーター URI は論理サービス名を使用してホストとポートとして定義された URI であり、返されるURI は、ServiceInstance のサービス インスタンスの詳細から連結されたホスト:ポートの形式の特定のリクエスト アドレスです。つまり、 http://HELLO-SERVICE/hello のようなアドレスを http://195.124.207.128/hello のようなアドレスに変換することです (IP アドレスはドメイン名の場合もあります)。

これで、プロデューサー クラスター バージョンの構築とロード バランシングの実現が完了しました。そんなに簡単ですか?

ここに画像の説明を挿入

次の記事では、エウレカのサービスディスカバリーDiscoveryを学び、引き続き注目して気に入ってください。引き続き更新していきます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_39570655/article/details/131775500