【问题标题】:Load balancer does not have available server for client: meeting负载均衡器没有可供客户端使用的服务器:会议
【发布时间】:2019-02-09 05:17:35
【问题描述】:

当我尝试通过 Zuul 网关访问服务 meeting 时,Zuul 无法将请求转发到相应的服务。我面临以下错误:

  1. nettflix.zuul.exception.ZuulException:转发错误
  2. 原因:com.netflix.client.ClientException:负载均衡器没有可用于客户端的服务器:会议

让我分享一下服务、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 gatewaymy service(meeting) 都是可见的。

为了更好的查看,你可以访问我的 git repo。 https://github.com/sagar-patro/demo-microservices

任何帮助都会非常明显

【问题讨论】:

    标签: java spring-boot microservices netflix-zuul netflix-eureka


    【解决方案1】:

    简答

    ribbon:
      eureka:
        enabled: false
    

    Spring Cloud Netflix Zuul 使用 Netflix 的 Ribbon 来执行客户端负载平衡,默认情况下,Ribbon 将使用 Netflix Eureka 进行服务发现。您正在跳过服务发现,因此您已将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 和用于路由的 Ribbon):

    当您启动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

    默认情况下,Zuul 使用来自 Ribbon 的 ZoneAwareLoadBalancer 进行负载平衡。该算法是发现中可用实例的循环,并具有可用性区域成功跟踪以实现弹性。负载均衡器将保留每个区域的统计信息,如果故障率高于可配置的阈值,则会删除一个区域。

    如果您想使用自己的自定义负载均衡器,您可以为该 Ribbon 客户端命名空间设置 NFLoadBalancerClassName 属性或覆盖 DefaultClientChannelManager 中的 getLoadBalancerClass() 方法。请注意,您的课程应该扩展 DynamicServerListLoadBalancer

    它解释了 Zuul 将路由和负载平衡工作委托给 Ribbon 组件,并证明您实际上在 gatekeeper 项目中使用了 Ribbon。

    除非您选择不同的负载平衡器,否则您应该选择我原来的答案。
    我希望它会有所帮助。

    【讨论】:

    • 我把它弄错了,因为我没有使用功能区。即使没有ribbon Zuul 也应该能够保持平衡。
    • @bibliophilsagar,您能否详细说明您在寻找什么?因为我提供的解决方案应该可以正常工作。
    • 我根本不使用功能区。我相信 Zuul 应该能够负载均衡。如果我使用ribbon,您的解决方案就足够了。
    猜你喜欢
    • 2017-05-15
    • 2018-06-07
    • 2017-12-25
    • 2019-04-09
    • 2019-03-23
    • 2016-04-02
    • 2017-06-05
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多