精华内容
下载资源
问答
  • 我告诉你们为啥我要先从eureka首先获取 goods的服务ip, 在用ip的方式使用http调用goods的服务. 因为公司的规定, 不让我们用Feigin. 我TMD的都震惊了, 我都不知道为啥. 我也不想写同事的ip地址, 做配置, 因为都 去...

    我告诉你们为啥我要先从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的配置 已经改过来了.

     

    如果您觉得写得不多, 可以请作者喝一杯咖啡

     

     

    展开全文
  • 首先参考注册服务到注册中心 新建消费端服务 1.创建springboot项目,引入以下依赖 <...spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.1.2.RELEASE</versio

    首先参考注册服务到注册中心

    新建消费端服务
    1.创建springboot项目,引入以下依赖

    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         <version>2.1.2.RELEASE</version>
     </dependency>
    
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
    

    2.启动类增加注释

    @EnableEurekaClient
    

    3.使用org.springframework.cloud.client.discovery.DiscoveryClient获取注册中心服务信息;

    List<ServiceInstance> riskcheck = discoveryClient.getInstances("riskcheck");
     ServiceInstance serviceInstance = riskcheck.get(0);
     String homePageUrl = serviceInstance.getUri().toString();
     System.out.println(homePageUrl)
    

    *需要注意在像注册中心注册服务的时候要配置用ip注册,不然注册中心只会显示个机器名;像这样
    在这里插入图片描述
    需要配置如下即可

    eureka:
      instance:
        #使用IP注册
        prefer-ip-address: true
        instance-id: ${spring.cloud.client.ip-address}:${server.port}
        hostname: ${spring.cloud.client.ip-address}
    
    展开全文
  • 为什么不能获取呢? 请大神指教,谢谢 &&&&&&&&&&&&&&&&&&&&&& 更新: 测试查看了 instances 的长度,结果发现是0。。。 ![图片说明](https://img-ask.csdn.net/upload/201912/23/1577108695_610979.png)...
  • Eureka服务注册与获取

    2020-03-23 21:51:10
    文章目录一、Eureka服务注册1、pom.xml2、application.yml3、引导类 4、重启项目,访问Eureka监控页面查看二、Eureka服务获取1、修改UserController代码 一、Eureka服务注册 注册服务,就是在服务上添加Eureka的...

    一、Eureka服务注册

    注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。

    修改itcast-service-provider工程

    1. 在pom.xml中,添加springcloud的相关依赖。
    2. 在application.yml中,添加springcloud的相关依赖。
    3. 在引导类上添加注解,把服务注入到eureka注册中心。

    具体操作

    1、pom.xml

    参照itcast-eureka,先添加SpringCloud依赖:

    <!-- SpringCloud的依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    然后是Eureka客户端:

    <!-- Eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    2、application.yml

    server:
      port: 8081
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/heima
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
      application:
        name: service-provider # 应用名称,注册到eureka后的服务名称
    mybatis:
      type-aliases-package: cn.itcast.service.pojo
    eureka:
      client:
        service-url: # EurekaServer地址
          defaultZone: http://127.0.0.1:10086/eureka
    

    注意:

    • 这里我们添加了spring.application.name属性来指定应用名称,将来会作为应用的id使用。

    3、引导类

    在引导类上开启Eureka客户端功能

    通过添加@EnableDiscoveryClient来开启Eureka客户端功能

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ItcastServiceProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ItcastServiceApplication.class, args);
        }
    }
    

    4、重启项目,访问Eureka监控页面查看

    在这里插入图片描述

    二、Eureka服务获取

    接下来我们修改itcast-service-consumer,尝试从EurekaServer获取服务。

    方法与消费者类似,只需要在项目中添加EurekaClient依赖,就可以通过服务名称来获取信息了!

    1、修改UserController代码

    用DiscoveryClient类的方法,根据服务名称,获取服务实例:

    @Controller
    @RequestMapping("consumer/user")
    public class UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Autowired
        private DiscoveryClient discoveryClient; // eureka客户端,可以获取到eureka中服务的信息
    
        @GetMapping
        @ResponseBody
        public User queryUserById(@RequestParam("id") Long id){
            // 根据服务名称,获取服务实例。有可能是集群,所以是service实例集合
            List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
            // 因为只有一个Service-provider。所以获取第一个实例
            ServiceInstance instance = instances.get(0);
            // 获取ip和端口信息,拼接成服务地址
            String baseUrl = "http://" + instance.getHost() + ":" + instance.getPort() + "/user/" + id;
            User user = this.restTemplate.getForObject(baseUrl, User.class);
            return user;
        }
    
    }
    
    展开全文
  • eureka获取注册服务的外网地址

    千次阅读 2020-07-30 16:47:21
    原因是zuul网关访问某个部署在不同服务器上的服务时,从eureka获取服务所在地址ip是内网地址,那么问题主要集中在对象服务住的信息的上了, eureka.client.service-url.defaultZone = eurka服务所在服务器地址 ...

    最近在练习spring-cloud-zuul和spring-boot-admin的demo时,发现如果不同服务注册到不同服务器时,发现不同服务之间的访问时连接超时.

    继续往下看

    原因是zuul网关访问某个部署在不同服务器上的服务时,从eureka获取的服务所在地址ip是内网地址,那么问题主要集中在对象服务住的信息的上了,

    eureka.client.service-url.defaultZone = eurka服务所在服务器地址
    eureka.instance.instance-id: ${spring.cloud.client.ip-address}:${server.port} # 应用名称:ip:端口
    

    spring.cloud.client.ip-address 是spring-cloud-commons 中的配置信息.主要用于获取启动环境的ip地址

    所以要解决这个问题,首先要是hostInfo.ipAddress为外网ip

    在yml文件中配置

    eureka.instance.ip-address: 服务所在服务器的外网地址

    但这样就会出现一个问题,如果是同一个服务部署在不同服务器上,需要多个配置问题么?

    暂时没有解决,如果谁有什么解决方案,麻烦留言告知.

    展开全文
  • Eureka注册服务列表显示ip+端口

    万次阅读 2017-05-01 10:10:01
    Eureka服务注册列表默认是显示主机名+端口,要想更方便地知道是哪台主机就需要查看ip+端口。client端配置:eureka: instance: preferIpAddress: true instance-id: ${spring.cloud.client.ipAddress}:${server....
  • 解决微服务注册到Eureka Server后,服务IP为127.0.0.1
  • eureka: client: register-with-eureka: true fetch-registry: true service-url: # defaultZone: http://localhost:7001/eureka defaultZone: http://eureka2.com:7002/eureka,http://eureka.com:7001/eureka ...
  • SpringCloud获取Eureka服务的注册信息

    万次阅读 2019-03-18 18:56:12
    文章目录Eureka获取Eureka中的注册信息通过URL的方式获取服务的注册信息使用DiscoveryClient获取服务的注册信息源码运行总结 Eureka   在Eureka中,其核心的概念主要有如下几个: 服务注册(Register)  ...
  • 服务注册到eureka上面默认是主机名+ip地址,这时候再另外一台服务器上调用这个服务是调用不到的,注册上的服务名称如下: 鼠标移到这服务名称上去左下角如下: 这样不同服务器之间是访问不到的。 具体解决方法: 一...
  • 最近项目在Eureka注册时,发现一个问题:注册的IP地址不是 192.168.0.XXX 的网络IP,而是另外一个网段的地址,如图 通过 ipconfig 命令查看本机的IP地址发现,该IP是本机虚拟网卡VMnet8的地址。 X:\Users\Keats...
  • Eureka

    千次阅读 2019-02-16 22:23:26
    同时,服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。 这就实现了服务的自动注册、发现、状态监控。 基本架构 Eureka:就是服务注册中心(可以...
  • 版本: version=2.1.2.RELEASE ...Eureka Server的内网IP是172.20.0.234。 Eureka Client的内网IP是172.20.0.135。 Eureka Client没有收到请求。 解决方案: 修改Eureka Client的配置: eur...
  • 【微服务】eureka获取实例地址

    千次阅读 2019-02-20 15:40:06
    最近在做的项目,需要刷新路由,因为增删改路由都是在redis操作的,所以如果eureka上一个项目有多台机器,刷新路由就需要遍历机器ip。 一开始是在配置文件做的配置,后来发现这种方式太麻烦,哪次如果换了服务器,...
  • eureka中使用ip注册服务

    万次阅读 2018-03-27 22:29:15
    在将微服务放入docker部署在多个云服务器...在网上查得eureka.instance.prefer-ip-address=true,使用这条配置eureka里显示的就是ip地址了,但是依然不够的,在监控平台里面还是连接不上。 还需要配置instance-和h...
  • 服务器上分别配置了eth0和eth1两块网卡,只有eth1的地址可供其它机器访问,在这种情况下,服务注册时Eureka Client会自动选择eth0作为服务ip, 导致其它服务无法调用。 二、问题原因 由于官方并没有写明Eureka Client...
  • 阅读本文你将了解 微服务注册到Eureka Server上的... 深度理解eureka.instance.ip-address和eureka.instance.prefer-ip-address = true。 杂谈 注:本篇较长、烧脑,并且涉及的范围相对广,建议选择一个舒服的姿势...
  • Eureka Client向Eureka Server注册时,Eureka Client提供自身的元数据,比如IP地址、端口、运行状况指标的Url、主页地址等信息。 Renew——服务续约 Eureka Client 在默认的情况下会每隔30秒发送一次心跳来进 行...
  • –net=bridge— 默认选项,用网桥的方式来连接docker容器。 –net=host— docker跳过配置容器的独立网络栈。 –net=container:NAME_or_ID— 告诉docker让这个新建的容器使用已有容器的网络配置。 ... ...
  • 问题 解决的办法 在注册服务的项目配置中加入: eureka: instance: hostname: ${spring.cloud.client.ipAddress} # springcloud2.x的话 eureka: instance: hostname: ${spring.cloud.client.ip-address}
  • 2018/3/11 7:11:59 新增注册到Eureka从Eureka注销、新增Feign,更新配置文件,更新代码 部门项目的技术框架 ZooKeeper+Dubbo 转型为Spring Cloud 微服务,转型顺利、开发方便、使用良好,于是完全废弃了...
  • spring cloud 版本: Finchley.SR2 ... instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} prefer-ip-address: true Dalston.SR5 eureka:...
  • 我们Ribbon说起:EurekaClient也存在缓存,应用服务实例列表信息在每个EurekaClient服务消费端都有缓存。一般的,Ribbon的LoadBalancer会读取这个缓存,来知道当前有哪些实例可以调用,从而进行负载均衡。这个load...
  • Eureka注册中心ip-Address参数详解

    千次阅读 2019-09-22 22:19:20
    默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示,那如果我们使用 IP 地址的方式,该如何配置呢? 答案就是eureka.instance.prefer-ip-address=true。配置eureka.instance.prefer-ip-address =...
  • 获取EurekaServer的节点信息

    千次阅读 2019-07-31 18:21:31
    例如我这的EurekaServer的IP端口是192.168.2.109:1001,那么就可以通过调用 http://192.168.2.109:1001/eureka/apps 获得注册到EurekaServer的所有其他节点的信息,下面对部分节点信息进行解释: <instanceId&...
  • 因为 InetUtils 获取ip的方法 findFirstNonLoopbackHostInfo() 会被调用多次,最先的调用是在 HostInfoEnvironmentPostProcessor, 而这个类执行的时候还没加载 application.yml, 因此配置并不生效。而 bootstrap....
  • 添加红色部分配置 eureka: instance: prefer-ip-address: true ip-address: 192.168.198.2 instance-id: ${spring.application.name}:${eureka.instance.ip-address}:${server.port} ...
  • 对于一些系统不能接入 eureka server,又需要访问接入eureka server 的服务。 方法一:直接调用服务的地址是一种实现方式,弊端就是...在此主要说明一下如何获取注册在 eureka server 上的服务信息。 可以通过 htt...
  • 帮同事注册服务eureka,并添加动态路由信息进行访问。 爆ip访问异常 经排查是ip地址不对 使用的是虚拟机ip vmvare net1 首先简单的将虚拟机网络禁用 然后仍然通过网关访问不到 报以下异常 [网关异常处理]请求路径:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,355
精华内容 6,942
关键字:

从eureka获取服务ip