服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 如何从eureka获取服务的ip和端口号进行Http的调用

如何从eureka获取服务的ip和端口号进行Http的调用

2022-09-05 13:52长河 Java教程

这篇文章主要介绍了如何从eureka获取服务的ip和端口号进行Http的调用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

eureka获取服务ip和端口号进行Http调用

我告诉你们为啥我要先从eureka首先获取 goods的服务ip, 在用ip的方式使用http调用goods的服务. 

因为公司的规定, 不让我们用Feigin. 我TMD的都震惊了, 我都不知道为啥. 我也不想写同事的ip地址, 做配置, 因为都去eureka里面注册了, 所以就这样调用了, 真是蛋疼.  这种微服务, 这种奇葩的方式.. 

?
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.util; 
import com.alibaba.fastjson.JSON;
import com.curefun.attendance.appclient.vo.ApplyListVO;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.lang3.StringUtils;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * eureka的工具类
 *
 * @author zhangke
 * @time 2019年12月5日18:11:12
 */
@Slf4j
public class EurekaUtil {
 
    /**
     * 解析eureka的返回数据
     */
    private static Pattern PATTERN_URL = Pattern.compile("<homePageUrl>(.+?)</homePageUrl>");
 
    /**
     * IP的缓存
     */
    private static ConcurrentHashMap<String, List<String>> IP_CACHE = new ConcurrentHashMap<>();
 
    /**
     * 缓存的名字
     */
    private final static String IP_NAME = "goodsIp"
 
    /**
     * 获取服务的所有地址(注册在 eureka server 上的服务)
     *
     * @param eurekaIp
     * @return
     */
    public static List<String> getAllServiceAddr(String eurekaIp) {
        //先查询缓存
        List<String> list = IP_CACHE.get(IP_NAME);
        if (list != null && list.size() > 0) {
            return list;
        }
        String serviceName = "GOODS";
        String url = eurekaIp + "apps/" + serviceName;
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(2, TimeUnit.SECONDS).build();
        Request request = new Request.Builder()
                //请求接口 如果需要传参拼接到接口后面
                .url(url)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/xml")
                .get()
                .build();
        Response response = null;
        List<String> result = new ArrayList<>();
        try {
            response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                String responseContent = response.body().string();
                Matcher matcher = PATTERN_URL.matcher(responseContent);
                while (matcher.find()) {
                    String homepage = matcher.group(1).trim();
                    result.add(homepage);
                }
            }
        } catch (IOException e) {
            log.error("从eureka中查询GOODS的服务实例出错了.原因是 {}", e.getMessage());
            return result;
        }
        IP_CACHE.put(IP_NAME, result);
        return result;
   
 
    /**
     * GET请求获取列表数据, 同步请求
     *
     * @param ip
     * @param userId
     * @param state
     * @param pageNo
     * @param pageSize
     * @param key
     * @return
     */
    public static List<ApplyListVO> getProductList(String ip, String userId, Integer state, Integer pageNo, Integer pageSize, String key) {
        if (StringUtils.isBlank(ip)) {
            return Collections.emptyList();
        }
        StringBuilder sb = new StringBuilder(ip);
        sb.append("goods/apply/getStuGoodsApplyList?user_id=").append(userId);
        sb.append("&state=").append(state).append("&pageNo=").append(pageNo);
        sb.append("&pageSize=").append(pageSize);
        if (StringUtils.isNotBlank(key)) {
            sb.append("&key=").append(key);
        }
        long millis = System.currentTimeMillis();
        Request request = new Request.Builder().url(sb.toString()).get().build();
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(2, TimeUnit.SECONDS).build();
        try {
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                String string = response.body().string();
                //json的转换.换成我需要的实体对象,为空的不返回null, 一个小技巧
                List<ApplyListVO> applyListVOS = JSON.parseArray(string, ApplyListVO.class);
                if (applyListVOS == null) {
                    applyListVOS = Collections.emptyList();
                }
                long millis2 = System.currentTimeMillis();
                log.info("从周X那里查询到物资的列表,请求的url是:{},返回结果是:{}", sb.toString(), applyListVOS);
                log.info("查询的耗时是(微秒):{}", (millis2 - millis));
                return applyListVOS;
            } else {
                return Collections.emptyList();
            }
        } catch (Exception e) {
            log.error("从周X的接口中查询List信息出错了.原因是 {}", e.getMessage());
            return Collections.emptyList();
        }
   
}

这样就可以很方便的调用了,

做微服务的一定要协调好各个组件的关系, 不然很容易两个人要对不同的接口, 很麻烦.

对了, 现在我们的eureka 配置有个问题, 就是一个服务挂了之后, 需要很长的时间才能去掉. 然后请求到达网关之后还是去了已经关闭的服务, 就很蛋疼了. 需要配置一个参数.

?
1
2
3
4
5
6
eureka:
  server:    #配置属性,但由于 Eureka 自我保护模式以及心跳周期长的原因,
             #经常会遇到 Eureka Server 不剔除已关停的节点的问题
    enable-self-preservation: false # 设为false,关闭自我保护
    eviction-interval-timer-in-ms: 5000 # 清理间隔(单位毫秒,默认是60*1000)启用主动失效,
                                        #并且每次主动失效检测间隔为3s

先要关闭自我保护 enable-self-preservation: false

eviction-interval-timer-in-ms 启用主动失效,并且每次主动失效检测间隔为5s

Eureka Server会定时(间隔值是eureka.server.eviction-interval-timer-in-ms,默认值为0,默认情况不删除实例)进行检查,如果发现实例在在一定时间(此值由客户端设置的eureka.instance.lease-expiration-duration-in-seconds定义,默认值为90s)内没有收到心跳,则会注销此实例。

现在的eureka的配置 已经改过来了。 

eureka页面中显示ip+端口

?
1
2
3
4
5
6
eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
# spring.cloud.client.ip-address 为 2.x 版本,1.x 版本为 spring.cloud.client.ipAddress
# ${spring.cloud.client.ip-address} 这个值从 org.springframework.cloud.client.HostInfoEnvironmentPostProcessor 中获取
?
1
2
3
4
5
6
7
8
9
10
11
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
        SpringApplication application) {
    InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
    LinkedHashMap<String, Object> map = new LinkedHashMap<>();
    map.put("spring.cloud.client.hostname", hostInfo.getHostname());
    map.put("spring.cloud.client.ip-address", hostInfo.getIpAddress());
    MapPropertySource propertySource = new MapPropertySource(
            "springCloudClientHostInfo", map);
    environment.getPropertySources().addLast(propertySource);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。 

原文链接:https://changhe.blog.csdn.net/article/details/103432215

延伸 · 阅读

精彩推荐
  • Java教程Java实现简单的表达式计算器功能示例

    Java实现简单的表达式计算器功能示例

    这篇文章主要介绍了Java实现简单的表达式计算器功能,结合实例形式分析了Java针对输入表达式的符号分解与数值运算相关操作技巧,需要的朋友可以参考下...

    HiBoyljw7172021-05-12
  • Java教程String实例化及static final修饰符实现方法解析

    String实例化及static final修饰符实现方法解析

    这篇文章主要介绍了String实例化及static final修饰符实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    贾树丙3332020-09-30
  • Java教程浅谈java获取UUID与UUID的校验

    浅谈java获取UUID与UUID的校验

    这篇文章主要介绍了java获取UUID与UUID的校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    kangyucheng3972019-06-21
  • Java教程Java Properties简介_动力节点Java学院整理

    Java Properties简介_动力节点Java学院整理

    Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变...

    动力节点4092020-10-31
  • Java教程java编程常用技术(推荐)

    java编程常用技术(推荐)

    下面小编就为大家带来一篇java编程常用技术(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian2672020-05-13
  • Java教程java实现按层遍历二叉树

    java实现按层遍历二叉树

    这篇文章主要为大家详细介绍了java实现按层遍历二叉树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    pengzhisen1238512021-06-28
  • Java教程实现分布式WebSocket集群的方法

    实现分布式WebSocket集群的方法

    本文总结出了几个实现分布式WebSocket集群的办法,从zuul到spring cloud gateway的不同尝试,总结出了这篇文章,希望能帮助到某些人,并且能一起分享这方面的...

    Q.E.D6792022-09-05
  • Java教程Java实现邮箱发送功能实例(阿里云邮箱推送)

    Java实现邮箱发送功能实例(阿里云邮箱推送)

    这篇文章主要给大家介绍了关于Java实现邮箱发送功能的相关资料,利用阿里云邮箱推送,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

    bitQian3132020-09-21