与RibbonClient和领事发现没有Spring云佯装

问题描述 投票:4回答:1

我试图建立与假死RibbonClient,像MyService api = Feign.builder().client(RibbonClient.create()).target(MyService.class, "https://myAppProd");,其中myAppProd是,我可以在领事看到一个应用程序的工作。现在,如果我使用Spring注解的假死客户端(@FeignClient("myAppProd")@RequestMapping),一切都按春云模块会照顾一切。

如果我想使用Feign.builder()@RequestLine,我得到的错误:com.netflix.client.ClientException: Load balancer does not have available server for client: myAppProd

我的第一个最初的想法是假死建与尤里卡工作,只有春云使得与领事整合,但我不确定这一点。

那么,有没有一种方法,使与领事假死工作,而春季云?

提前致谢。

spring consul netflix-feign spring-cloud-feign netflix-ribbon
1个回答
0
投票

>丝带 - - >领事在我看来,这不是与领事,其假死假装工作。

RibbonClient需要找到其serverList myAppProd的LoadBalancer。如果没有服务器列表,错误:“没有客户端可用的服务器”。

这项工作已被SpringCloudConsul和SpringCloudRibbon项目完成后,你当然可以写另一个适配器,它只是一些胶水代码。恕我直言,你可以导入这个春天的依赖到你的项目,但在无弹簧的方式来使用它。演示代码:

只写一个新的feign.ribbon.LBClientFactory,产生与ConsulServerList LBClient(Spring的类)。

public class ConsulLBFactory implements LBClientFactory {

    private ConsulClient client;
    private ConsulDiscoveryProperties properties;

    public ConsulLBFactory(ConsulClient client, ConsulDiscoveryProperties consulDiscoveryProperties) {
        this.client = client;
        this.properties = consulDiscoveryProperties;
    }

    @Override
    public LBClient create(String clientName) {
        IClientConfig config =
            ClientFactory.getNamedConfig(clientName, DisableAutoRetriesByDefaultClientConfig.class);

        ConsulServerList consulServerList = new ConsulServerList(this.client, properties);
        consulServerList.initWithNiwsConfig(config);

        ZoneAwareLoadBalancer<ConsulServer> lb = new ZoneAwareLoadBalancer<>(config);

        lb.setServersList(consulServerList.getInitialListOfServers());
        lb.setServerListImpl(consulServerList);
        return LBClient.create(lb, config);
    }
}

然后假死使用它:

public class Demo {
    public static void main(String[] args) {
        ConsulLBFactory consulLBFactory = new ConsulLBFactory(
            new ConsulClient(),
            new ConsulDiscoveryProperties(new InetUtils(new InetUtilsProperties()))
        );

        RibbonClient ribbonClient = RibbonClient.builder()
            .lbClientFactory(consulLBFactory)
            .build();

        GitHub github = Feign.builder()
            .client(ribbonClient)
            .decoder(new GsonDecoder())
            .target(GitHub.class, "https://api.github.com");

        List<Contributor> contributors = github.contributors("OpenFeign", "feign");
        for (Contributor contributor : contributors) {
            System.out.println(contributor.login + " (" + contributor.contributions + ")");
        }
    }

    interface GitHub {
        @RequestLine("GET /repos/{owner}/{repo}/contributors")
        List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
    }

    public static class Contributor {
        String login;
        int contributions;
    }
}

你可以找到这个demo code here,运行该演示之前添加api.github.com到当地的领事。

© www.soinside.com 2019 - 2024. All rights reserved.