代码之家  ›  专栏  ›  技术社区  ›  bibliophilsagar

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

  •  9
  • bibliophilsagar  · 技术社区  · 8 年前

    当我试着去服务的时候 meeting 通过zuul网关,zuul无法将请求转发到各自的服务。以下是我面临的错误:

    1. nettflix.zuul.exception.zuul exception:转发错误
    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);
        }
    }
    

    我的服务类(会议): 应用程序

    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
    

    我的服务类(会议): Springboot应用程序

    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 回复  |  直到 8 年前
        1
  •  7
  •   Andrew    8 年前

    简短的回答

    功能区:
    尤里卡:
    启用:假
    < /代码> 
    
    

    Spring Cloud Netflix zuuluse sNetflix_S Ribbonto performclient-side load balancing,and by default,Ribbonwould useNetflix eurekaforservice discovery。您将跳过“服务发现”,因此您已经设置了“功能区”。eureka.enabledtofalse。由于功能区=>strong>现在可以使用eureka=>strong>查找服务,您必须为会议指定一个URL=>code>服务:

    会议: 丝带: 服务器列表:本地主机:8080 < /代码>

    扩展的答案

    我会让你更清楚一点。

    依赖项org.springframework.cloud:spring cloud starter netflix zuul>,which you are currently using in thegatekeeperproject,has some compile dependencies:。

    com.netflix.zuul:zuul-core
    org.springframework.boot:spring boot starter web
    org.springframework.boot:弹簧启动执行器
    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功能区
    org.springframework.cloud:SpringCloudStarterNetflixArchaius
    < /代码> 
    
    

    如您所见,它构成了围绕com.netflix.zuul:zuul core>a>module(including eureka for instance discovery and bribbon for routing):收集的许多组件。

    当您启动gategeeperapplication时,将应用默认的zuulproxyautoconfigurationconfiguration。它导入功能区配置类:

    配置 @导入(RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.Class, ribbonCommandFactoryConfiguration.okhttpribbonConfiguration.class, RibbonCommandFactoryConfiguration.httpClientRibbonConfiguration.class, httpclientconfiguration.class) @Conditionalonbean(zuulproxymarkerconfiguration.marker.class) 公共类zuulproxyautoconfiguration扩展zuulserverautoconfiguration…} < /代码>

    httpClientRibbonConfiguration,依次初始化RibbonLoadBalancinghttpClientwhich is responsible for the error messages you saw.

    ribbonloadbalancinghttpclientby default useszoneawareloadbalancerwhich comes from acom.netflix.bribbon:ribbon loadbalancerpackage:。

    < Buff行情>

    默认情况下,zuul负载平衡使用zoneawareloadbalancerFrom Ribbon.算法是Discovery中可用实例的循环,具有可用性Zone Success Tracking for Resilibility。负载均衡器将保留每个区域的统计信息,如果故障率高于可配置的阈值,则会删除一个区域。

    如果您想使用自己的自定义负载均衡器,可以为该功能区客户端命名空间设置nfloadbalancerclassnameproperty,或者覆盖getloadbalancerclass()中的DefaultClientChannelManager。注意,您的类应该扩展dynamicServerlistLoadBalancer。

    < /块引用>

    它解释了zuul将路由和负载平衡工作委托给功能区组件,并证明您实际上在gategeeperproject中使用了功能区。

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

    S带表演客户端负载平衡,默认情况下,色带将使用纳菲利克斯尤里卡对于服务发现. 你正在跳过服务发现所以你已经设定了ribbon.eureka.enabled到false. 自从色带现在可以用了尤里卡若要查找服务,必须为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,例如Discovery和Ribbon):

    enter image description here

    当你启动看门人应用程序,默认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(RibbonLoadBalancingHTTPClient)默认使用ZoneAwareLoadBalancer它来自com.netflix.ribbon:ribbon-loadbalancer包裹:

    默认情况下,zuul负载平衡使用带式平衡机从缎带。该算法是发现中可用实例的循环,并对可用性区域的恢复性进行成功跟踪。负载均衡器将保留每个区域的统计信息,如果故障率高于可配置的阈值,则会删除一个区域。

    如果要使用自己的自定义负载平衡器,可以设置NFLoadBalancerClassName属性,或重写getLoadBalancerClass()方法在DefaultClientChannelManager. 注意你的课程应该扩展DynamicServerListLoadBalancer.

    它解释了zuul将路由和负载平衡工作委托给功能区组件,并证明您实际上在看门人项目。

    除非您选择不同的负载均衡器,否则您应该使用我的原始答案。
    希望能有所帮助。