【问题标题】:Failure while calling a microservice via ribbon enabled client(Without eureka service discovery)通过启用功能区的客户端调用微服务时失败(没有 eureka 服务发现)
【发布时间】:2018-02-20 22:57:07
【问题描述】:

我正在尝试通过启用功能区的客户端(功能区客户端)调用“微服务”(微服务生产者),但它给了我一个错误。

java.lang.IllegalStateException:没有可用于员工微服务的实例

我正在关注客户端负载平衡的官方 spring.io 链接(https://spring.io/guides/gs/client-side-load-balancing/),并且我还遵循此链接中给出的所有规范。 你可以在我的 GitHub 地址看到代码: (https://github.com/vickygupta0017/microservice-ribbon)。

我不确定我错过了什么或做错了什么,有人可以帮我吗?

【问题讨论】:

  • @ootero,你能在这里提出一些建议吗?
  • microservice-producer 没有注册到 Eureka 的配置。

标签: java microservices netflix-ribbon


【解决方案1】:

如果不使用 eureka 服务器来识别服务器是否可达,功能区客户端使用“RibbonConfiguration” - pingUrl 参数。 默认情况下,它是空字符串,这意味着它将在没有任何上下文的情况下 ping 服务器列表以获取服务器是否可访问的答案。 所以在这里你可以做两件事。

  1. 创建一个绑定到服务器“/”的根上下文的服务并发送一个肯定的响应。

    @RequestMapping(value = "/")
    public String status(HttpServletRequest request) {
        return "";
    }
    
  2. 或者更新 Ribbon 客户端配置 (EmployeeConfiguration) 并返回带有相关“服务名称”的 PingUrl。

    @Bean
    public IPing ribbonPing(IClientConfig config) {
       return new PingUrl(false,"/employees");
    }
    

选择第一个,因为它将解决查看服务器是否可访问的基本目的。

参考:https://spring.io/guides/gs/client-side-load-balancing/

我们的 IPing 是一个 PingUrl,它将 ping 一个 URL 以检查每个服务器的状态。回想一下,Say Hello 有一个映射到 / 路径的方法;这意味着 Ribbon 在 ping 正在运行的 Say Hello 服务器时将获得 HTTP 200 响应。我们设置的 IRule,AvailabilityFilteringRule,将使用 Ribbon 的内置断路器功能来过滤掉任何处于“开路”状态的服务器:如果 ping 无法连接到给定的服务器,或者读取失败对于服务器,Ribbon 会认为该服务器“已死”,直到它开始正常响应。

【讨论】:

  • 非常感谢您提供详细解释的答案。你应该得到更多,但我只能给 +1。
  • 我们也可以从配置中删除方法ribbonPing,这样做不会通过映射到/路径的方法检查服务器的可用性。
【解决方案2】:

功能区客户端的配置不正确,我在功能区客户端中通过以下更改成功执行了代码,在客户端调用它抛出空指针异常,因为功能区客户端的几个参数没有成功设置,我可以看到 @ EmployeeConfiguration 类中缺少配置,因此它将如何初始化 Ribbon 客户端。

还检查了以下位置的完整可行代码:

https://github.com/abhayjohri87/RibbonClientLBWithMicroServices.git

package com.ribbon.client;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.client.config.DefaultClientConfigImpl;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ConfigurationBasedServerList;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
//import com.ribbon.Employee.configuration.EmployeeConfiguration;
import com.ribbon.client.RibbonClientApplication.UserConfig;


@SpringBootApplication
@RestController
@RibbonClient(name = "employee-microservice", configuration = UserConfig.class)
public class RibbonClientApplication {

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

      @Autowired
      RestTemplate restTemplate;

      @RequestMapping("/listEmployee")
      public List getEmployeeList() {
        List empList = this.restTemplate.getForObject("http://employee-microservice/employees", ArrayList.class);
        return empList;
      }

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


    @Configuration
    static class UserConfig {

        private String name = "employee-microservice";

        @Bean
        @ConditionalOnMissingBean
        public IClientConfig ribbonClientConfig() {
            DefaultClientConfigImpl config = new DefaultClientConfigImpl();
            config.loadProperties(this.name);
            return config;
        }

        @Bean
        ServerList<Server> ribbonServerList(IClientConfig config) {
            ConfigurationBasedServerList serverList = new ConfigurationBasedServerList();
            serverList.initWithNiwsConfig(config);
            return serverList;
        }

    }
}

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2020-11-12
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2019-05-19
    • 2020-07-26
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多