繁体   English   中英

通过启用功能区的客户端调用微服务时失败(没有eureka服务发现)

[英]Failure while calling a microservice via ribbon enabled client(Without eureka service discovery)

我试图通过功能区启用客户端(功能区客户端)来调用“微服务”(微服务生产者),但这给我一个错误。

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

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

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

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

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

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

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

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

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

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

Ribbon Client的配置不正确,我在Ribbon Client中进行了以下更改,已成功执行了代码,在Client调用时,由于没有成功设置Ribbon Client的几个参数,因此抛出Null Pointer Exception,我可以看到缺少@Configuration在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;
        }

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM