如何解决负载均衡器没有可供客户端使用的服务器

时间:2021-04-04 12:09:40

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

我知道有很多人问过这个问题,但即使我尝试了我找到的所有解决方案,我仍然无法解决问题。 基本上,我有一个名为 emms-core 的微服务: 这里是 bootstrap.yml

spring:
    application:
        name: emms-core
    cloud:
        config:
            fail-fast: true
            password: s3cr3t
            uri: http://localhost:8888
            username: root
    profiles:
        active: dev
eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka

spring cloud 依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>`

这是java代码:

@SpringBootApplication(exclude = R2dbcAutoConfiguration.class)
@EnableEurekaClient
@RestController
@RequestMapping("/")
@Log4j2
public class EmmsCore {

    public static void main(String[] args) {
        SpringApplication.run(EmmsCore.class, args);
        log.info("[Emms] Server started at " + LocalDateTime.now());
    }

    @GetMapping(path = "ping")
    public Mono<String> ping() {
        return Mono.just("pong");
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

接下来,我设置了一个 eureka 服务器:

yml 配置:

eureka:
    client:
        fetch-registry: false
        register-with-eureka: false
server:
    port: 8761
spring:
    application:
        name: eureka-server

spring cloud 依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>${spring-boot-starter.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        <version>${spring-cloud-version}</version>
    </dependency>

java代码:

@SpringBootApplication
@EnableEurekaServer
public class ServiceRegistry {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRegistry.class, args);
    }

}

我可以在尤里卡页面看到我的微服务: enter image description here

最后,我设置了一个 Zuul 代理:

配置:

server.port=8762
spring.application.name=zuul-server
eureka.client.fetch-registry=true
ribbon.eureka.enabled=true
eureka.client.service-url.default-zone=http://localhost:8761/eureka/

zuul.ignored-services=*

zuul.routes.gallery-service.path=/emms-core/**
zuul.routes.gallery-service.service-id=emms-core

zuul.routes.auth-service.sensitive-headers=Cookie,Set-Cookie 

依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>${spring-boot-starter.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        <version>2.2.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>${spring-cloud-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>${spring-cloud-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>3.0.0</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2020.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

java代码:

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class Proxy {

    public static void main(String[] args) {
        SpringApplication.run(Proxy.class, args);
    }

}

我可以在尤里卡页面看到我的 Zuul 代理: enter image description here

当我尝试调用 localhost:8762/emms-core/api/ping 时出现异常:

2021-04-04 19:02:30.571  INFO 29424 --- [nio-8762-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: emms-core instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=emms-core,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2021-04-04 19:02:30.578  INFO 29424 --- [nio-8762-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2021-04-04 19:02:30.580  INFO 29424 --- [nio-8762-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client emms-core initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=emms-core,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:com.netflix.loadbalancer.ConfigurationBasedServerList@43fc9527
2021-04-04 19:02:30.727  WARN 29424 --- [nio-8762-exec-1] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

com.netflix.zuul.exception.ZuulException: Forwarding error
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    ...
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: emms-core
    at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]

正如我所说,我已经尝试了很多我找到的解决方案,但目前没有运气。你们能帮我解决这个问题吗?我用的是 spring cloud 依赖 2020.0.0

0 个答案:

没有答案