Zuulゲートウェイ経由でサービスmeeting
に到達しようとしている間、Zuulはリクエストをそれぞれのサービスに転送できません。次のエラーは私が直面しているものです:
- nettflix.zuul.exception.ZuulException:転送エラー
- 原因:com.netflix.client.ClientException:ロードバランサーにクライアント用の利用可能なサーバーがありません:meeting
サービス、eureka、およびzuulゲートウェイのapplication.ymlを共有させてください。
EurekaClient:_Application.yml
_
_server:
port: 8761
eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 300
client:
register-with-eureka: false
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
_
ZuulGateWay:_application.yml
_
_server:
port: 8085
spring:
application:
name: gatekeeper
zuul:
routes:
meeting: /meeting/**
serviceId: meeting
ribbon:
eureka:
enabled: false
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
_
ZuulGateWay:SpringBootApplication
_package com.sagarp.gatekeeper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class MeetingApplication {
public static void main(String[] args) {
SpringApplication.run(MeetingApplication.class, args);
}
}
_
私のサービスクラス(会議):_Application.yml
_
_server:
port: 0
spring:
application:
name: meeting
datasource:
url: jdbc:mysql://localhost:3306/sagarp?useSSL=false
username: myUserName
password: myPassWord
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
lease-renewal-interval-in-seconds: 5
_
私のサービスクラス(会議):SpringBootApplication
_package com.sagarp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MeetingApplication {
public static void main(String[] args) {
SpringApplication.run(MeetingApplication.class, args);
}
}
_
ご覧のとおり、この構成により、すべてのサービスがeurekaクライアントによって検出されます。
Eurekaコンソールで、同じことを確認しました。_zuul gateway
_とmy service(meeting)
の両方が表示されています。
見やすくするために、私のgitリポジトリにアクセスできます。 https://github.com/sagar-patro/demo-microservices
どんな助けでも非常に理解できるでしょう
_ribbon:
eureka:
enabled: false
_
Spring Cloud Netflix ZuulはNetflixのRibbonを使用してクライアント側の負荷分散を実行し、デフォルトではRibbonは、service discoveryにNetflix Eurekaを使用します。 service discoveryをスキップしているため、_ribbon.eureka.enabled
_をfalse
に設定しました。 RibbonはEurekaを使用してサービスを検索できないため、meeting
サービスのURLを指定する必要があります。
_meeting:
ribbon:
listOfServers: localhost:8080
_
わかりやすくします。
現在gatekeeper
プロジェクトで使用している依存関係 _org.springframework.cloud:spring-cloud-starter-netflix-zuul
_ には、いくつかのコンパイル依存関係があります。
_com.netflix.zuul:zuul-core
org.springframework.boot:spring-boot-starter-web
org.springframework.boot:spring-boot-starter-actuator
org.springframework.cloud:spring-cloud-netflix-zuul
org.springframework.cloud:spring-cloud-starter
org.springframework.cloud:pring-cloud-starter-netflix-hystrix
org.springframework.cloud:spring-cloud-starter-netflix-ribbon
org.springframework.cloud:spring-cloud-starter-netflix-archaius
_
ご覧のとおり、これは _com.netflix.zuul:zuul-core
_ モジュール(インスタンス検出用のEurekaとルーティング用のリボンを含む)の周りに集まった多くのコンポーネントを構成しています:
gatekeeper
アプリケーションを起動すると、デフォルトのZuulProxyAutoConfiguration
設定が適用されます。リボン構成クラスをインポートします。
_@Configuration
@Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class,
RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class,
RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class,
HttpClientConfiguration.class })
@ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class)
public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { ... }
_
HttpClientRibbonConfiguration
は、次に、RibbonLoadBalancingHttpClient
を初期化します。これは、表示されたエラーメッセージを処理します。
RibbonLoadBalancingHttpClient
はデフォルトで_com.netflix.ribbon:ribbon-loadbalancer
_パッケージからのZoneAwareLoadBalancer
を利用します:
デフォルトでは、リボンの
ZoneAwareLoadBalancer
を使用してZuulが負荷を分散します。アルゴリズムは、ディスカバリーで利用可能なインスタンスのラウンドロビンであり、可用性ゾーンは復元力の成功を追跡します。ロードバランサーは、各ゾーンの統計を保持し、障害率が構成可能なしきい値を超えるとゾーンをドロップします。独自のカスタムロードバランサーを使用する場合は、そのリボンクライアント名前空間に
NFLoadBalancerClassName
プロパティを設定するか、DefaultClientChannelManager
のgetLoadBalancerClass()
メソッドをオーバーライドできます。クラスはDynamicServerListLoadBalancer
を拡張する必要があることに注意してください。
Zuulはルーティングと負荷分散の作業をリボンコンポーネントに委任し、gatekeeper
プロジェクトで実際にリボンを使用していることを証明します。
別のロードバランサーを選択しない限り、元の回答を参照してください。
お役に立てば幸いです。