相关文章推荐
犯傻的芹菜  ·  放弃 ...·  1 年前    · 
爱笑的脸盆  ·  MySQL ...·  2 年前    · 

当Eureka客户端向Eureka服务注册器注册时,它提供自身的元数据,比如IP地址、端口等信息。

  • 服务续约(Renew)

在服务续约中,Eureka客户端会每隔30秒发送一次心跳来进行服务续约。通过续约来告知Eureka服务器该客户端仍然存在,希望服务器不要剔除自己。

  • 服务下线(Cancel)

Eureka客户端在程序关闭时想Eureka服务器发送取消请求。发送请求后,该客户端实例信息将从服务器的实例注册列表中删除。

  • 服务剔除(Eviction)

在默认的情况下,当Eureka客户端连续90秒没有像Eureka服务器发送服务续约的心跳(Heartbeat),Eureka服务器就会将该服务实例从服务注册列表中删除,即剔除该服务。

  • 获取服务注册列表信息(Fetch Registries)

Eureka客户端从Eureka服务器获取服务注册列表信息,并将其缓存到本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每隔30秒)更新一次。每次返回的注册列表信息可能与Eureka客户端的缓存信息有所不同,Eureka客户端会自动处理两者之间的差异。

获取Eureka中的注册信息

通过URL的方式获取服务的注册信息

这种方式比较简单,比如说我们现在有一个本地的Eureka服务器,其端口号为 8761 ,当我们想获取其中所注册的服务信息时,我们只需要访问下面的地址:

http://localhost:8761/eureka/apps

  其展示的结果为:

  当我们想访问其中的product-service服务时,此时我们应该访问下面的地址:

http://localhost:8761/eureka/apps/product-service

  其展示的结果为:

使用DiscoveryClient获取服务的注册信息

  尽管说通过Eureka提供的管理界面和HTTP端点可以获取服务的详细信息,但是这还远远不够。在现实应用中,很多时候我们希望通过代码在运行时能够实时获取注册中心的服务列表。

  在Eureka的客户端,我们通过Eureka提供的DiscoveryClient工具类就可以获取Eureka中注册的服务信息。

  EurekaController

package com.lyc.goodsProduct.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
 * @author: zhangzhenyi
 * @date: 2019/3/15 20:39
 * @description: Eureka Controller
@RestController
@RequestMapping("/eurekaCentre")
public class EurekaController {
    @Autowired
    private DiscoveryClient discoveryClient;
     * 获取注册在Eureka中的服务名称
     * @return
    @GetMapping("/getEurekaServices")
    public List<String> getEurekaServices(){
        List<String> services = new ArrayList<>();
        List<String> serviceNames = discoveryClient.getServices();
        for(String serviceName : serviceNames){
            List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);
            for(ServiceInstance serviceInstance : serviceInstances){
                services.add(String.format("%s:%s",serviceName,serviceInstance.getUri()));
        return services;

  application.yml

# 服务名称
spring:
  application:
    name: product-service
  # spring连接数据库驱动
  datasource:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/spring_data?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: root
      password: zhangzhenyi
  # jpa自动创建不存在的数据表
    show-sql: true
    hibernate:
      ddl-auto: update
      use-new-id-generator-mappings: true
  jackson:
    serialization:
      indent_output: false
# 服务端口号
server:
  port: 8081
eureka:
  instance:
    # 指明使用IP而不是服务名称来注册自身服务。因为Eureka默认是使用域名进行服务注册和解析
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/

  在浏览器中输入下列地址:

http://127.0.0.1:8081/eurekaCentre/getEurekaServices

  其返回的服务列表如下:

"eureka-server:http://peer1:8761", "eureka-server:http://peer2:8762", "product-service:http://192.168.23.1:8081", "product-service:http://192.168.23.1:8082", "account-service:http://192.168.23.1:8084", "order-service:http://192.168.23.1:8083"

  从上面的代码中我们可以看到,在客户端想要获取Eureka中注册的服务信息时,其方法一共有两种,其一是通过HTTP直接调用Eureka注册中心,从中获取注册的服务信息;其二是通过DiscoveryClient,以Java代码的方式在客户端获取Eureka中注册的服务信息。