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

 更新时间:2022年03月09日 11:07:14   作者:长河  
这篇文章主要介绍了如何从eureka获取服务的ip和端口号进行Http的调用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

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

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

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 配置有个问题, 就是一个服务挂了之后, 需要很长的时间才能去掉. 然后请求到达网关之后还是去了已经关闭的服务, 就很蛋疼了. 需要配置一个参数.

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+端口

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 中获取
@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);
}

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

相关文章

  • Java中不定参数用法小结

    Java中不定参数用法小结

    在Java中,不定参数是指方法的参数数量可以变化的情况,本文主要介绍了Java中不定参数用法,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • springboot中shiro使用自定义注解屏蔽接口鉴权实现

    springboot中shiro使用自定义注解屏蔽接口鉴权实现

    本文主要介绍了springboot中shiro使用自定义注解屏蔽接口鉴权实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆

    二叉堆是一种特殊的堆,其实质是完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆是指父节点键值总是大于或等于任何一个子节点的键值。而最小堆恰恰相反,指的是父节点键值总是小于任何一个子节点的键值
    2022-02-02
  • Layui 后台加载菜单栏名称以及url的例子

    Layui 后台加载菜单栏名称以及url的例子

    今天小编就为大家分享一篇Layui 后台加载菜单栏名称以及url的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 记一次springboot服务凌晨无故宕机问题的解决

    记一次springboot服务凌晨无故宕机问题的解决

    这篇文章主要介绍了记一次springboot服务凌晨无故宕机问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot2.1.3修改tomcat参数支持请求特殊符号问题

    SpringBoot2.1.3修改tomcat参数支持请求特殊符号问题

    最近遇到一个问题,比如GET请求中,key,value中带有特殊符号,请求会报错。接下来通过本文给大家分享解决SpringBoot2.1.3修改tomcat参数支持请求特殊符号 ,需要的朋友可以参考下
    2019-05-05
  • Java弹簧布局管理器使用方法详解

    Java弹簧布局管理器使用方法详解

    这篇文章主要介绍了Java弹簧布局管理器使用方法详解,需要的朋友可以参考下
    2017-09-09
  • 详谈@Cacheable不起作用的原因:bean未序列化问题

    详谈@Cacheable不起作用的原因:bean未序列化问题

    这篇文章主要介绍了@Cacheable不起作用的原因:bean未序列化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现excel表格转成json的方法

    Java实现excel表格转成json的方法

    本篇文章主要介绍了Java实现excel表格转成json的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 全面解释java中StringBuilder、StringBuffer、String类之间的关系

    全面解释java中StringBuilder、StringBuffer、String类之间的关系

    String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,StringBuffer和StringBuilder类功能基本相似
    2013-01-01

最新评论