Балансировщик нагрузки не имеет доступного сервера для клиента: встреча - PullRequest
0 голосов
/ 04 сентября 2018

Пока я пытаюсь связаться с услугой meeting через шлюз Zuul, Zuul не может переслать запрос в соответствующую службу. Я сталкиваюсь со следующими ошибками:

  1. nettflix.zuul.exception.ZuulException: ошибка пересылки
  2. Причина: com.netflix.client.ClientException: у балансировщика нагрузки нет доступного сервера для клиента: встреча

Позвольте мне поделиться application.yml для службы, eureka и zuul gateway.

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

Любая помощь будет очень заметной

1 Ответ

0 голосов
/ 19 сентября 2018

Краткий ответ

ribbon:
  eureka:
    enabled: false

Spring Cloud Netflix Zuul использует Лента Netflix для выполнения балансировки нагрузки на стороне клиента , и по умолчанию Лента будет использовать Netflix Eureka для обнаружение службы . Вы пропускаете обнаружение службы , поэтому вы установили ribbon.eureka.enabled на false. Поскольку Ribbon теперь не может использовать Eureka для поиска служб, необходимо указать URL для службы meeting:

meeting:
  ribbon:
    listOfServers: localhost:8080

Расширенный ответ

Я сделаю это более понятным для вас.

Зависимость org.springframework.cloud:spring-cloud-starter-netflix-zuul, которую вы сейчас используете в проекте gatekeeper, имеет несколько зависимостей компиляции:

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 для обнаружения экземпляров и Ribbon для маршрутизации):

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 по умолчанию использует ZoneAwareLoadBalancer из пакета com.netflix.ribbon:ribbon-loadbalancer:

По умолчанию балансировки нагрузки Zuul с использованием ZoneAwareLoadBalancer от ленты. Алгоритм представляет собой циклический перебор экземпляров, доступных в обнаружении, с отслеживанием успешности зоны доступности для обеспечения устойчивости. Балансировщик нагрузки будет хранить статистику для каждой зоны и удалит зону, если частота отказов превышает настраиваемый порог.

Если вы хотите использовать свой собственный балансировщик нагрузки, вы можете установить свойство NFLoadBalancerClassName для этого пространства имен клиента ленты или переопределить метод getLoadBalancerClass() в DefaultClientChannelManager. Обратите внимание, что ваш класс должен расширяться DynamicServerListLoadBalancer.

Это объясняет, что Zuul делегирует работу по маршрутизации и балансировке нагрузки компонентам ленты и доказывает, что вы фактически используете ленту в проекте gatekeeper.

Если вы не выберете другой балансировщик нагрузки, вам следует обратиться к моему первоначальному ответу.
Я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...