负载平衡器没有可供客户端使用的服务器:会议

时间:2018-09-04 08:16:08

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

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

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

让我共享用于服务,尤里卡和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

任何帮助都是非常有益的

1 个答案:

答案 0 :(得分:8)

简短答案

ribbon:
  eureka:
    enabled: false

Spring Cloud Netflix Zuul 使用 Netflix的Ribbon 执行客户端负载平衡,默认情况下,执行 Ribbon >将 Netflix Eureka 用于服务发现。您正在跳过服务发现,因此已将ribbon.eureka.enabled设置为false。由于丝带现在无法使用 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):

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

  

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

     

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

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

除非您选择其他负载均衡器,否则应选择我的原始答案。
希望对您有所帮助。