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 つのメソッドを持つインターフェイスです。これらのメソッドの機能を見てみましょう。
ServiceInstance Choice(String serviceId) は、受信サービス名 serviceId に従って、クライアント ロード バランサーから対応するサービスのインスタンスを選択します。
Texecute() 、ロードバランサーから選択されたサービスインスタンスを使用してリクエストを実行します。
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を学び、引き続き注目して気に入ってください。引き続き更新していきます。