精华内容
下载资源
问答
  • 我告诉你们为啥我要先从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的配置 已经改过来了.

     

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

     

     

    展开全文
  • 原因是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: 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 ...
    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
      instance:
        instance-id: pay321
        prefer-ip-address: true
    

    配置最后的instance-id 以及prefer-ip-address
    rueka显示服务名,鼠标移动左下角ip
    只需要这样一个配置即可

    获取注册信息 先注入DiscoverCliennt 是springcloud的 在8001的controler中写这样一个方法 即可获取服务的名称,主机,访问路径。等
    在 主启动类上加这样一个注解就ok了。步加注解也是能获取到的。

    @EnableDiscoveryClient
    public class Pay8001 {
    
        @Autowired
        DiscoveryClient discoveryClient;
    @GetMapping(value = "pay/info")
        public Object getInfo(){
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            System.out.println("service = " + service);
            List<ServiceInstance> instances = discoveryClient.getInstances(service);
            for (ServiceInstance instance : instances) {
                System.out.println(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri()+"\t");
            }
    
        }
        return discoveryClient;
    
        }
    

    8001服务中的yml配置

    server:
      port: 8001
    spring:
      application:
        name: pay-service
    
    #    datasource.type=com.alibaba.druid.pool.DruidDataSource
    #    spring.datasource.url = jdbc:mysql://127.0.0.1:3306/demo
    #    spring.datasource.username = root
    #    spring.datasource.password = 123456
    #    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    #  datasource:
    #    type:
    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
      instance:
        instance-id: pay321
        prefer-ip-address: true
    #    这个是为了和服务端沟通的频率
        lease-renewal-interval-in-seconds: 1
    #    这个是服务端的耐心
        lease-expiration-duration-in-seconds: 2
    #eureka.instance.lease-renewal-interval-in-seconds	# 续约更新时间间隔(默认30秒)
    #eureka.instance.lease-expiration-duration-in-seconds # 续约到期时间(默认90秒)
    

    添加了最后的两行
    7001 eureka服务的配置

    server:
      port: 7001
    spring:
      application:
        name: eureka01
    eureka:
      instance:
        hostname: eureka.com
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
    #    单机模式
          defaultZone: http://eureka.com:7001/eureka
    #      关闭自我保护
      server:
        enable-self-preservation: false
    #     清理间隔(单位毫秒,默认是60*1000)
        eviction-interval-timer-in-ms: 2000
    #      集群模式
    #      defaultZone: http://eureka2.com:7002/eureka
    #debug: true
    
    
    #    datasource.type=com.alibaba.druid.pool.DruidDataSource
    #    spring.datasource.url = jdbc:mysql://127.0.0.1:3306/demo
    #    spring.datasource.username = root
    #    spring.datasource.password = 123456
    #    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    #  datasource:
    #    type:
    
    

    也是最后两行,一个是关闭自我保护机制,一个是清理,跟gc很像。定时清理。

    eureka2.0 官网已经宣布停更了。以前的项目可能用的还是,新项目建议使用别的,后期介绍

    展开全文
  • appname:服务名称,消费者通过此名称注册中心获取服务访问地址 hostname:服务所在主机名 ipAddress:服务所在ip地址 instanceId:服务唯一id 在spring中相关的配置为:“spring.application.

    SpringBoot提供了Eureka服务自动注册机制,只需要引入 spring-cloud-starter-netflix-eureka-client 依赖并进行简单的配置即可。

    本文旨在揭示spring配置和服务注册信息的关联性。

    服务注册信息的关键项:

    • appname:服务名称,消费者通过此名称从注册中心获取服务访问地址
    • hostname:服务所在主机名
    • ipAddress:服务所在ip地址
    • instanceId:服务唯一id

    在spring中相关的配置为:“spring.application.name”、“eureka.instance.appname”、“eureka.instance.hostname” 、“eureka.instance.prefer-ip-address”。

    服务注册信息生成策略

    • hostname 默认为主机名;若配置了 eureka.instance.hostname 属性,则为该属性值;若配置了 eureka.instance.prefer-ip-address=true 属性,则为 ipAddress 的值。
      优先级:eureka.instance.hostname > 主机名
    • appname 默认是unknown;若配置了 spring.application.name 属性,则为该属性值; 若配置了 eureka.instance.appname 属性,则为该属性值。
      优先级:eureka.instance.appname > spring.application.name > unknown
    • instanceId 默认为主机名:server.port;若配置了 spring.application.name 属性,则为 主机名:spring.application.name:server.port

    如下示例配置,并展示eureka可视化页面上的对应信息。

    server:
      port: 8080
    spring:
      application:
        name: api-gateway
    
    eureka:
      instance:
        hostname: my-hostname
        appname: my-appname
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    Eureka的信息:
    http://localhost:8761
    http://localhost:8761/eureka/apps
    在这里插入图片描述
    appname对应页面上Application
    instanceId对应页面上的Status

    另:

    Spring Cloud Gateway 的路由机制:通过服务名去eureka上查找匹配的Application,获取其hostname信息,通过hostname去访问实际服务。

    eureka服务信息配置Bean:
    org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration#eurekaInstanceConfigBean

    展开全文
  • 而“消费者”可以通过服务名称来从服务者那里获取数据服务。 当服务者的ip地址发生了变化,对于消费者来说是无感的。消费者不必重新修改服务者的ip地址,继续使用原来的服务名,依然能够与服务者保持联系。 当然了...
  • java spring获取请求ip地址

    千次阅读 2019-08-16 10:49:41
    洒家的需求是 想根据客户端的请求获取ip地址,然后对ip请求加次数限制,客户端请求首先负载均衡(F5)转发到网关(Zuul),网关接收到请求后,注册中心(Eureka获取可用服务,在服务端获取请求的ip。 直接上方法...
  • Eureka 客户端

    2020-12-06 10:14:38
    Eureka Server 就是服务注册中心,里面有客户端列表信息 ...2)Eureka Client(服务消费者) 从Eureka Server获取注册信息 3)服务消费者从注册中心获取服务提供者的IP和端口之后,远程调用它 3. ...
  • Eureka和Zookeeper

    2021-01-20 18:02:46
    客户端每30秒从eureka获取一张服务列表,如果不同则更新 4)取消 当客户端关机则会发送一个取消的消息给eureka,eureka会把该客户端从服务列表上删除 zookeeper的ZAB协议 1、消息广播模式(数据同步) 1)leade
  • SpringCloud中Ribbon负载均衡客户端,会从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地。让后在本地实现轮训负载均衡策略, 既在客户端实现负载均衡。 如下示例开启 Ribbon: @LoadBalanced 注解等于...
  • SpringCloud Eureka

    2020-09-22 14:15:27
    EurekaEureka工作原理入门实例Eureka集群原理搭建...服务发现:注册中心上获取服务信息 实质:存key服务命名,取value调用地址 入门实例 先启动eureka注册中心 启动服务提供者payment支付服务 支付服务
  • eureka原理

    2020-02-08 09:31:44
    一.eureka注册中心原理 1.服务注册: ...eureka客户端每30秒发送一次心跳来续约,告知客户端正常,如果eureka服务端90秒没收到心跳,则将其注册表删除 3.获取注册表信息: 客户端通过rest请求服...
  • 服务治理是微服务架构中的核心模块,...服务注册中心:提供服务注册和发现的功能服务提供者:服务提供者向服务注册中心注册自己的信息,如服务名、IP地址、端口号等信息服务消费者:服务消费者从服务注册中心获取...
  • 而是通过服务名称,然后向服务注册中心获取服务ip地址,然后再进行调用,达到动态化增加服务和自动化发现服务的目的. 传统方式调用: 服务A -&amp;amp;amp;amp;gt; http请求(服务B的ip地址192.168.0.100:80...
  • 客户端注册中心获取到服务清单后,使用轮询,随机,或者哈希等机制(其实就是负载均衡的机制)清单中获取服务B的地址 然后在通过ip访问B。是由A发起。 优点:简单直接且知道所有可用的服务的地址 缺点:需要自己写...
  • Eureka(1)--->使用eureka

    2020-12-15 16:18:08
    eureka是一个组件,用来实现服务的注册与发现,我们在微服务的体系中,会有一个服务中心,这个服务中心储存着所有微服务的信息,例如某台服务ip、端口等信息,当我们进行远程调用的时候可以从服务中心去获取到...
  • Eureka 原理圖

    2019-09-25 13:00:07
    Register(服务注册):把自己的IP和端口注册给Eureka。 Renew(服务续约):发送心跳包,每30秒发送一次。告诉Eureka自己还活着。 Cancel(服务下线):当...Get Registry(获取服务注册列表):获取其他服务列表。 ...
  • 05Eureka学习

    2021-02-06 19:08:17
    Eureka的一些概念 ... 当Eureka Client向Eureka Server注册的时候,client会向server提供自身的元数据信息,如:IP地址、端口、运行状况 Renew-服务续约 ...Fetch Registries-获取服务注册列表信息 client向serve
  • 现来说一些Eureka的概念: ... 就是Client向Server注册的时候提供自身元数据,比如IP和Port等信息。 2、服务续约 Renew Client默认每隔30s发送一次心跳来服务...3、获取服务注册信息 Fetch Register Eureka Clien...
  • springCloud eureka

    2020-10-28 21:40:56
    客户端发现:eureka就是,就是客户端通过注册中心按照负载均衡机制(轮询、hash等)注册中心获取ip,然后访问。 服务端发现:典型的nginx、zookeeper、kuberneters,客户端通过主机的ip和端口向代理发送请求,...
  • Register:服务注册当Eureka客户端向EurekaServer注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。Renew:服务续约Eureka客户会每隔30秒发送一次心跳来续约。通过续约来告知EurekaServer...
  • Eureka 学习 02

    2019-10-12 21:12:07
    基于图书 重新定义 Spring Cloud实战 ... 服务提供方A服务,自己维护ip实例,暴露统一的内网... 服务注册中心作为一个标配的分布式服务组件,网关等都从服务注册中心获取相关服务的实例信息,实现动态路由 2....
  • Eureka学习 基础概念 ... 当Client向Server注册时,提供自身的元数据,比如IP地址,端口,运行状态等等 Renew (服务续约) ...client默认(每隔30秒发送心跳)...ClientServer中获取服务注册表信息,并将缓存本...
  • Eureka作为注册中心想必大家都不陌生了,注册中心简单来说,其实就是各个服务将自己的IP和端口号这些信息存放到注册中心里,形成一个注册表,当服务间调用的时候,调用方就能注册中心的注册表里面获取到要调用服务...
  • Spring Cloud原生的配置中心Config Server是注册到注册中心eureka server,客户端启动时,注册中心获取配置中心的IP地址,然后再去配置中心获取配置中心中的配置。这种方式有几个优点: 可以动态获取配置中心地址...
  • 微服务-服务注册

    2021-01-27 18:24:00
    服务提供者将自己的信息注册到注册中心,服务调用者注册中心取到微服务的信息(如通过服务获取ip+端口),通过取到的信息对服务进行调用。 通过这种方式,微服务ip、端口变化时,注册中心将提供最新的服务信息...
  • 上文介绍了服务如何通过Eureka实现注册,以及如何从Eureka获取已经注册的服务列表。那么拿到注册服务列表后, 如何进行服务调用?一个简单的实现是可以从被调用服务的实例列表中选择一个服务实例,通过其hostname...
  • feign 伪装 服务的请求

    2019-02-26 11:53:25
    1、在消费方引入依赖包。 2、 在启动类添加注解。...) ,根据服务名称从eureka服务器获取对应的服务,通过ribbon 负载均衡来获取一个具体的服务ID ,提供ip+port;  3.2、传递给Controller 请...
  • 一句话解释负载均衡是什么? 使用 Spring Cloud ...在启动后以自动任务的方式从Eureka获取服务(列表)信息 如何从服务实例列表中选取具体的服务实例? 基于IRule接口以某种策略从服务实例列表中选取某个具...
  • spring-cloud-houge-provider(称之为客户端)直接spring-cloud-houge-config(称之为服务端)读取配置,客户端和服务端的耦合性太高,服务端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

从eureka获取服务ip