web-dev-qa-db-ja.com

ロードバランサーにクライアント用の使用可能なサーバーがありません:会議

Zuulゲートウェイ経由でサービスmeetingに到達しようとしている間、Zuulはリクエストをそれぞれのサービスに転送できません。次のエラーは私が直面しているものです:

  1. nettflix.zuul.exception.ZuulException:転送エラー
  2. 原因: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

どんな助けでも非常に理解できるでしょう

11
bibliophilsagar

短い答え

_ribbon:
  eureka:
    enabled: false
_

Spring Cloud Netflix ZuulNetflixのRibbonを使用してクライアント側の負荷分散を実行し、デフォルトではRibbonは、service discoveryNetflix Eurekaを使用します。 service discoveryをスキップしているため、_ribbon.eureka.enabled_をfalseに設定しました。 RibbonEurekaを使用してサービスを検索できないため、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とルーティング用のリボンを含む)の周りに集まった多くのコンポーネントを構成しています:

enter image description here

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プロパティを設定するか、DefaultClientChannelManagergetLoadBalancerClass()メソッドをオーバーライドできます。クラスはDynamicServerListLoadBalancerを拡張する必要があることに注意してください。

Zuulはルーティングと負荷分散の作業をリボンコンポーネントに委任し、gatekeeperプロジェクトで実際にリボンを使用していることを証明します。

別のロードバランサーを選択しない限り、元の回答を参照してください。
お役に立てば幸いです。

11
Andrew Tobilko