1. 简介

默认端口号8761

Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。下图显示了Eureka Server与Eureka Client的关系: Eureka.jpg

  1. Eureka Server是服务端,负责管理各个微服务结点的信息和状态。
  2. 在微服务上部署Eureka Client程序,远程访问Eureka Server将自己注册在Eureka Server。
  3. 微服务需要调用另一个微服务时从Eureka Server中获取服务调用地址,进行远程调用。

2. 服务端———单机环境

2.1 application.yml

  1. server:
  2. port: 50101 #服务端口
  3. spring:
  4. application:
  5. name: xcgoverncenter #指定服务名
  6. eureka:
  7. client:
  8. registerWithEureka: false #服务注册,是否将自己注册到Eureka服务中
  9. fetchRegistry: false #服务发现,是否从Eureka中获取注册信息
  10. serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
  11. defaultZone: http://localhost:50101/eureka/
  12. server:
  13. enableselfpreservation: false #是否开启自我保护模式,保证服务不可用时不会踢除
  14. evictionintervaltimerinms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
  • registerWithEureka :被其它服务调用时需向Eureka注册
  • fetchRegistry :需要从Eureka中查找要调用的目标服务时需要设置为true
  • serviceUrl.defaultZone :配置上报Eureka服务地址,高可用状态配置对方的地址,单机状态配置自己
  • enable-self-preservation :自我保护设置,参考:2.1 自我保护模式
  • eviction-interval-timer-in-ms :清理失效结点的间隔,在这个时间段内如果没有收到该结点的上报则将结点从服务列表中剔除。

2.1 自我保护模式

Eureka Server有一种自我保护模式,属于CAP里面的AP分支 关闭 ———当微服务不再向Eureka Server上报状态,默认是90秒如果没有回应,则Eureka Server会从服务列表将此服务删除。 开启 ———如果出现网络异常情况(微服务正常),当EurekaServer节点在短时间内丢失过多客户端时(可能发生网络分区故障:延时、卡顿、拥挤),此时Eureka server进入自保护模式,不再将微服务从服务列表删除。主要用于一组客户端和EurekaServer之间存在网络分区场景下的保护。 默认开启,在开发阶段建议关闭自保护模式。

2.1.1 服务端配置

eureka: 
    server: 
      # 关闭自我保护模式,保证不可用服务被及时删除
      enable-self-preservation: false 
    # 默认检测时间
    eviction-interval-timer-in-ms: 2000

2.1.2 客户端配置

eureka:
    instance: 
        # 向服务端发送心跳间隔,默认30s
    lease-renewal-interval-in-seconds: 1
    # Eureka服务端在收到最后一次心跳后等待时间上限 ,单位为秒(默认是90秒),超时剔除服务
    lease-expiration-duration-in-seconds: 2

3. 服务端———集群环境(高可用)

Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册。如果在本机启动两个Eureka需要注意两个Eureka Server的端口要设置不一样,这里我们部署一个Eureka Server工程,将端口可配置,制作两个Eureka Server启动脚本,启动不同的端口,如下图: Eureka高可用环境原理.png

  1. 在实际使用时Eureka Server至少部署两台服务器,实现高可用。
  2. 两台Eureka Server互相注册。
  3. 微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。
  4. 微服务会定时向Eureka server发送心跳,报告自己的状态,默认是30s一次,90秒如果没有回应,则Eureka会将微服务移除(关闭eureka自我保护模式情况)。
  5. 微服务从注册中心获取服务地址以RESTful方式发起远程调用。

3.1 环境变量

# 实例eureka01
-DPORT=50101 -DEUREKA_SERVER=http://eureka02:50102/eureka/ -DEUREKA_DOMAIN=eureka01
# 实例eureka02
-DPORT=50102 -DEUREKA_SERVER=http://eureka01:50101/eureka/ -DEUREKA_DOMAIN=eureka02

3.2 高可用环境appliciton.yml

server:
  port: ${PORT:50101} #服务端口,先从环境变量、配置中找参数PORT,没有就是用默认值50101
spring:
  application:
    name: xc-govern-center #指定服务名
eureka:
  client:
    registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中,单机环境false,高可用true
    fetchRegistry: true #服务发现,是否从Eureka中获取注册信息,单机环境false,高可用true
    serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
      defaultZone:  ${EUREKA_SERVER:http://eureka02:50102/eureka/}
  server:
    enable-self-preservation: false #是否开启自我保护模式
    eviction-interval-timer-in-ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
  instance: #Eureka 组成高可用,两个Eureka互相向对方注册,这里需要通过域名或主机名访问,这里我们设置两个Eureka服务的主机名分别为 eureka01、eureka02。
    hostname: ${EUREKA_DOMAIN:eureka01}

3.3 在yml中配置instance的hostname(上面代码)

4. 客户端———appliction.yml

eureka:
  client:
    registerWithEureka: true #服务注册开关
    fetchRegistry: true #服务发现开关
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
      defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/,http://localhost:50102/eureka/} #高可用环境可以只配一个服务端01,但是当配置的服务端01出现问题,就会找不到服务端02,为了安全起见可以都配上
  instance:
    prefer‐ip‐address: true #将自己的ip地址注册到Eureka服务中
    ip‐address: ${IP_ADDRESS:127.0.0.1}
    instance‐id: ${spring.application.name}:${server.port} #指定实例id

5. 服务发现Discovery

对于在注册中心里面注册的微服务,可以通过服务发现来获得该服务的信息

@Resource
private DiscoveryClient discoveryClient;

@GetMapping("/payment/discovery")
public Object dicovery() {

    // 获取所有的微服务
    List<String> services = discoveryClient.getServices();
    for (String service : services) {
        log.info("======》" + service);
    }

    // 获取每个微服务下的所有实例信息
    List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
    for (ServiceInstance instance : instances) {
        log.info(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
    }

    return discoveryClient;
}

5.2 启动类

添加注解@EnableDiscoveryClient

如果注册中心使用Zookeeper和Consul,也相当于@EnableEurekaServer

5.1 测试类

5.3 效果

image.png
image.png