解决消费者从eureka注册中心获取的不是外网ip的问题

因为生产者注册到注册中的不是ip,没有指定生产者所在服务的外网ip地址

在配置文件中进行如下配置

1
2
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=127.0.0.1

  

 

 问题到此解决,下面列出问题排除的过程

我是在使用feign远程调用的时候,发现远程调用老是出现调用超时的问题,但是本地环境调用没有问题,这里我重写了feign的一些方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.java.config;
 
import feign.Client;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/13 11:45
 */
@Component
public class RestConfig {
 
    public CachingSpringLoadBalancerFactory cachingLBClientFactory(
            SpringClientFactory factory) {
        return new CachingSpringLoadBalancerFactory(factory);
    }
 
    @Bean
    public Client feignClient(SpringClientFactory clientFactory) {
        CachingSpringLoadBalancerFactory bean = cachingLBClientFactory(clientFactory);
        return new LoadBalancerFeignClient(new InFeignClient(null, null), bean, clientFactory);
    }
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.java.config;
 
import com.netflix.client.config.IClientConfig;
import feign.Client;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer;
 
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.URI;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/13 11:44
 */
@Slf4j
public class InFeignClient extends Client.Default {
    public InFeignClient(SSLSocketFactory sslContextFactory, HostnameVerifier hostnameVerifier) {
        super(sslContextFactory, hostnameVerifier);
    }
 
    @Override
    public Response execute(Request request, Request.Options options) throws IOException {
        try {
 
            return super.execute(request, options);
        } catch (IOException e) {
            log.warn(" 请求 {} 异常 ======> {}", request.url(), e.getMessage());
            throw e;
        }
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.java.service.impl;
 
 
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
/**
 * 原来:http://lagou-service-resume/resume/openstate/ + userId;
 * @FeignClient表明当前类是一个Feign客户端,value指定该客户端要请求的服务名称(登记到注册中心上的服务提供者的服务名称)
 */
@FeignClient(value = "ip-service",fallback = ResumeFallback.class,path = "/queryIp")
public interface ResumeServiceFeignClient {
 
 
    /**
     * Feign要做的事情就是,拼装url发起请求,我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求
     * @param ip
     * @return
     */
    @RequestMapping("/queryIpCity/{ip}")
    @ResponseBody
    public String queryIpCity(@PathVariable("ip") String ip);
 
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.java.controller;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.java.service.impl.ResumeServiceFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
 
 
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class AutodeliverControllerTest {
 
    @Autowired
    private ResumeServiceFeignClient queryIpClient;
 
    @Test
    public void test() {
        String ip="43.254.105.235";
        log.info("【Feign方式调用】【查询ip地址详细信息】入参:{}", ip);
        String forObject = null;
        try {
            forObject = queryIpClient.queryIpCity(ip);
            log.info("【Feign方式调用】【查询ip地址详细信息】返回参数:{}", forObject);
            JSONObject jsonObject = JSON.parseObject(forObject);
            String city = jsonObject.getString("address");
            log.info("【Feign方式调用】【查询ip地址详细信息】返回参数:{}", city);
        } catch (Exception e) {
            log.error("【Feign方式调用】【调用获取ip信息接口异常】:{}",e);
        }
 
    }
 
}

  日志中打印的是内网ip地址,通过网上找资料,了解到了eureka.instance.ip-address这个key值

pom文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.java</groupId>
    <artifactId>feign-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--spring boot 父启动器依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
 
 
    <dependencyManagement>
        <dependencies>
            <!--spring cloud依赖管理,引入了Spring Cloud的版本-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 
    <dependencies>
        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--日志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <!--eureka client 客户端依赖引入-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--Feign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--添加fastjson依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>
 
 
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>qiuxie</finalName>
    </build>
 
 
</project>

  熔断类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.java.service.impl;
 
 
import org.springframework.stereotype.Component;
 
/**
 * 降级回退逻辑需要定义一个类,实现FeignClient接口,实现接口中的方法
 *
 *
 */
@Component  // 别忘了这个注解,还应该被扫描到
public class ResumeFallback implements ResumeServiceFeignClient {
 
    @Override
    public String queryIpCity(String ip) {
        return "去火星了....";
    }
}

  启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.java;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
 
/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/13 10:07
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients  // 开启Feign 客户端功能
public class FeignApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class,args);
    }
 
}

  

 

 

 

 

 

 

 

 

 一般自动设置的是内网ip地址,如果你的多台服务器之间设置了对等连接,同时可以相互访问,使用内网ip地址没有问题,如果没有设置,需要手动设置你的服务所在服务器的外网ip地址

posted @   不忘初心2021  阅读(309)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示