问题: 最近在改造公司java项目,将服务拆分成微服务,用openfegin去进行调用.前面已经改造过一波http的调用方式.已经完成上线了.目前这个版本有个需要注意的点是cloud这边放弃使用Ribbon,改使用LoadBalancer去做负载均衡,如果使用http的方式,可以无缝切入(使用nacos作为注册中心).最近,服务改为https的方式调用了,这时候就会出现访问不通的问题.

1.使用服务名的方式无法调用成功 ⬇️

2.使用指定url的方式是能个调用成过的

根据以上我们可以了解,提供方应该是正常注册到nacos上面去了,那可以确定是调用方这边一定是有问题的.

经过排查,询问ai,大致问题都是定位到LoadBalancer出现问题,无法解析成https的形式调用,始终是http的方式.ai给出答案是,如果https指定的端口不是443,那么LB不会解析成https的格式.然后进行了第一次修改⬇️

这种形式是可以把访问接口改掉但是接口访问还是不通的情况.

后面继续深入学习,发现需要重新覆盖默认的client.不然还是不能走LB的形式的.

以下修改基于测试环境放行https的模式,需要重新生成LB的Client的对象:

@Configuration
public class FeignConfig {
    @Bean
    public Client feignClient(LoadBalancerClientFactory loadBalancerClientFactory, LoadBalancerClient loadBalancerClient) throws Exception {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, new TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());

        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
        HostnameVerifier hostnameVerifier = (hostname, session) -> true;
        Client.Default client = new Client.Default(sslSocketFactory, hostnameVerifier);
        return new FeignBlockingLoadBalancerClient(client, loadBalancerClient, loadBalancerClientFactory);
    }
}

这时候改造就完成了,可以通过https的方式,以负载均衡的形式调用了,不需要指定单个url访问了.

好记性不如烂笔头,独乐乐不如众乐乐

更多推荐