一、前言

微服务之注册中心Eureka(一)
这篇为Eureka单机节点实战演练,从零搭建了一个Eureka注册中心,并且开启了http basic 认证保证注册中心的安全性。
单节点的注册中心如果因为该注册中心宕掉,会导致依赖该注册中心的所有的微服务不可通过注册中心使用,后果十分严重,所以需要对注册中心进行集群。
通过改造上面的单节点的注册中心,通过配置配置文件,在启动的时候激活不同的配置即可将一个服务扩展开来。

二、双Eureka注册中心

1、先添加不同环境的文件,将Eureka配置放到不同环境中,添加一个application-dev.yml文件。注册中心启动的可以直接通过profiles:active: dev方式指定或者在启动的时候通过命令–spring.profiles.active=dev等方式激活不同环境的配置。
2、修改后的application.yml文件内容如下:

server:
  servlet:
    session:
      timeout: 600 # session 超时时间配置,默认30m
  address: 127.0.0.1

spring:  # spring 配置相关
  application:
    name: eureka-service  # 服务名
  security: # 权限控制
    user:
      name: yourusername  #用户名
      password: pw123456  # 密码
  profiles:  # 默认激活dev环境和eureka peer1 节点
    active: dev,eureka-peer1

logging: # 日志配置
  level:
    org:
      springframework:
        cloud:
          loadbalancer:
            config:
              BlockingLoadBalancerClientAutoConfiguration: error

3、application-dev.yml文件如下

# 多注册中心配置,peer1为第一个注册中心节点,向peer2...等注册自己,peer2需要向peer1...等注册自己
# 每个注册中心的地位都是对等的
eureka: # 注册中心一配置
  instance: # 实例(微服务)
    # 唯一标识(唯一指定实例,可以通过服务名+端口或者ip+端口的方式指定,集群方式可以通过如下配置)
    # 如果没有显示配置,采用eureka.instance.metadataMap.instanceId 来代替,直接使用缺省值(client.hostname:application.name:port)
    # instance 之间通过eureka.instance.appName 来彼此访问,在spring cloud中默认值是 spring.application.name ,如果没有设置则为 UNKNOWN。
    # 在实际使用中 spring.application.name 不可或缺,因为相同名字的应用会被Eureka合并成一个群集(Eureka Server会以双层Map进行存储信息,第一层Map的key 就是服务名, 第二层 Map的 key 就是 instanceId)。
    #,同一个appName下InstanceId不能相同。属性eureka.instance.virtualHostName目前在spring cloud中目前没有用,默认值是appName或者UNKNOWN。
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    preferIpAddress: true  #配置eureka.instance.preferIpAddress = true  可以防止注册中心互相注册注册不上问题
    # 服务续约:在注册完服务后,服务提供者会维持一个心跳用来持续告诉Eureka Server我还活着,以防止Eureka Server的“剔除任务”将服务实例从服务列表中排除出去,我们将该操作称为服务续约(Renew)。
    lease-expiration-duration-in-seconds: 30  # 服务续约任务的调用间隔时间,默认30秒。
    lease-renewal-interval-in-seconds: 10     # 服务失效的时间,默认90秒。10s发送一次心跳
    #如果在90秒之内没有收到服务提供者的心跳包,则会将认为该服务无法正常提供服务
    # 服务续约任务每30秒执行一次,为服务进行新的续约存活时间
    hostname: 127.0.0.1  #  本地可以是localhost,测试环境以及生产环境需要修改,或者使用${server.address}
  server: # eureka 服务配置
    eviction-interval-timer-in-ms: 120000 #(单位毫秒,默认是60*1000)eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
    enable-self-preservation: true   #是否开启保护模式,默认为true ,保护模式就是确保不被无缘无故移除(网络故障但服务正常等情况)
    # Eureka 出现如下警告: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    # 触发了Eureka的自我保护机制,引入保护机制是为了当出现网络故障时,服务与注册中心之间无法进行正常通信(接收不到服务的心跳包)一定时间后会剔除该服务,但该服务本身是正常的,其实不应该剔除该服务。
    # 自我保护机制:如果在15分钟内超过百分之八十五的客户端节点都有正常心跳,Eureka就认为客户端与注册中心出现了网络故障,进入自我保护机制
    # 1、Eureka server 不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
    # 2、Eureka 仍能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,只保证当前节点可用
    # 3、当退出自我保护机制后,同步当前Eureka server注册信息到其它节点中
  client:  # 注册中心客户端连接配置,如果注册中心需要相互注册,则该注册中心相对于其他注册中心来说也是一个客户端
    register-with-eureka: true  #  是否向注册中心注册自己,默认为true
    fetch-registry: true # 是否检索服务
    serviceUrl:  # 注册中心服务地址配置
      # 多节点配置eureka-peer1  向eureka-peer1 和eureka-peer2 注册自己
      # 我是在本地启动,所以指定了不同的端口
      # 如果在服务器集群中,指定好对应启动的服务地址即可
      # 如果添加了spring security,需要使用 username:password@ip:port/eureka/ 的方式
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/
#  使用profiles区分不同注册中心的配置,只需要一份配置文件,启动的时候 ,通过激活不同的配置文件即可
spring:
  profiles: eureka-peer1 #指定此配置文件为eureka-peer1 节点配置
server:
  port: 8010  # 注册中心1启动端口为8010
---
# 使用--- 可以在同一个yml文件中配置相同属性
eureka: # # 注册中心二配置
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    preferIpAddress: true
    lease-expiration-duration-in-seconds: 30
    lease-renewal-interval-in-seconds: 10
    hostname: ${server.address}
  server:
    eviction-interval-timer-in-ms: 120000
    enable-self-preservation: true
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/
spring:
  profiles: eureka-peer2
server:
  port: 8011  # 注册中心2启动端口为8011

4、双节点Eureka配置完成,启动看一下效果

先启动一个eureka看一下

一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka


一个微服务注册多个nacos 微服务注册到多个eureka_一个微服务注册多个nacos_02


一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_03


(1)激活了dev,eureka-peer1配置文件

(2)注册中心有两个节点地址eureka peer1,eureka peer2 两个

(3)eureka peer2 节点连接超时(因为还没有启动)

先访问一下Eureka peer1 注册中心,http://localhost:8010/

一个微服务注册多个nacos 微服务注册到多个eureka_一个微服务注册多个nacos_04


(4)eureka peer1 已经成功注册到注册中心了

5、启动eureka peer 2注册中心

(1)激活dev,peer2 节点

因为启动eureka peer1 使用了application.yml文件中的默认配置,所以在本地启动第二个相同服务时需要配置一些启动参数,以便激活peer2

一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka_05


一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka_06

我是直接指定了jvm启动参数

-Dspring.profiles.active=dev,eureka-peer2

一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka_07


一个微服务注册多个nacos 微服务注册到多个eureka_注册中心_08


(2)激活了dev,peer2配置文件

(3)注册中心有两个服务地址

看一下Eureka peer1节点的信息

一个微服务注册多个nacos 微服务注册到多个eureka_注册中心_09


(4)看一下eureka peer2

一个微服务注册多个nacos 微服务注册到多个eureka_Eureka实战_10


至此双注册中心能够互联,配置完成。看一下上篇写的eureka-client(代表了一个微服务)能否注册成功

6、微服务连接注册中心集群

(1)按照上篇的默认配置,我们不对配置做修改先看一下eureka peer1

一个微服务注册多个nacos 微服务注册到多个eureka_注册中心_11


(2) 查看一下eureka peer2

一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_12


通过上述(1)、(2)我们可以看到虽然eureka client 只向eureka pee1注册了,但是我们也能在eureka peer 2中查看到eureka client 的注册信息。

(3)停掉eureka peer1节点后查看eureka peer2 还能够查询到eureka client信息吗

一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_13


一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka_14


刚停掉Eureka peer1的时候,我们查看http://localhost:8011/ 还是能看到都在,需要等到注册中心清理无效节点刷新页面查看,如下:

一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_15


可以看到Eureka peer1 节点以及只向eureka peer1几点注册的 eureka client 都没有了,但实际上只有eureka peer1 下线了,eureka client 仍在正常启动,也就是eureka client 扔能够正常提供服务,所以我们需要将eureka 向两个注册中心都进行注册,防止只向一个注册中心注册的时候,因为该注册中心下线而导致自己的假死。

(4)修改eureka client 的application,yml连接注册中心配置(就不添加环境配置文件了)

server:
  port: 8020

spring:
  application:
    name: eureka-client-service
  security:
    user:
      name: yourusername
      password: pw123456
    #profiles:
    #active: dev,eureka-client1
logging:
  level:
    org:
      springframework:
        cloud:
          loadbalancer:
            config:
              BlockingLoadBalancerClientAutoConfiguration: error

# 注册中心配置  :${random.long(1,100)
eureka:
  instance:
    preferIpAddress: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}:${spring.application.name}
    lease-expiration-duration-in-seconds: 30
    lease-renewal-interval-in-seconds: 10
    hostname: 127.0.0.1
  client:
    register-with-eureka: true
    fetch-registry: false
    serviceUrl:
      #defaultZone: http://127.0.0.1:8010/eureka/  # 单节点无权限
      #defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/ #单节点有权限
      # 双节点有权限注册中心配置
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/

当eureka client 向两个注册中心都注册的时候,这个时候当其中的任何一个注册中心挂掉的时候,服务依旧可用。

一个微服务注册多个nacos 微服务注册到多个eureka_双Eureka_16

三、三节点Eureka注册中心

三节点注册中心的扩展方法就很简单了,将配置文件在进行扩容即可,在三节点Eureka 中将关闭Eureka peer x向自己的注册中心注册。
1、添加eureka peer3 节点配置,application-devyml文件内容:

# 多注册中心配置,peer1为第一个注册中心节点,向peer2...等注册自己,peer2需要向peer1...等注册自己
# 每个注册中心的地位都是对等的
eureka: # 注册中心一配置
  instance: # 实例(微服务)
    # 唯一标识(唯一指定实例,可以通过服务名+端口或者ip+端口的方式指定,集群方式可以通过如下配置)
    # 如果没有显示配置,采用eureka.instance.metadataMap.instanceId 来代替,直接使用缺省值(client.hostname:application.name:port)
    # instance 之间通过eureka.instance.appName 来彼此访问,在spring cloud中默认值是 spring.application.name ,如果没有设置则为 UNKNOWN。
    # 在实际使用中 spring.application.name 不可或缺,因为相同名字的应用会被Eureka合并成一个群集(Eureka Server会以双层Map进行存储信息,第一层Map的key 就是服务名, 第二层 Map的 key 就是 instanceId)。
    #,同一个appName下InstanceId不能相同。属性eureka.instance.virtualHostName目前在spring cloud中目前没有用,默认值是appName或者UNKNOWN。
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    preferIpAddress: true  #配置eureka.instance.preferIpAddress = true  可以防止注册中心互相注册注册不上问题
    # 服务续约:在注册完服务后,服务提供者会维持一个心跳用来持续告诉Eureka Server我还活着,以防止Eureka Server的“剔除任务”将服务实例从服务列表中排除出去,我们将该操作称为服务续约(Renew)。
    lease-expiration-duration-in-seconds: 30  # 服务续约任务的调用间隔时间,默认30秒。
    lease-renewal-interval-in-seconds: 10     # 服务失效的时间,默认90秒。10s发送一次心跳
    #如果在90秒之内没有收到服务提供者的心跳包,则会将认为该服务无法正常提供服务
    # 服务续约任务每30秒执行一次,为服务进行新的续约存活时间
    hostname: 127.0.0.1  #  本地可以是localhost,测试环境以及生产环境需要修改,或者使用${server.address}
  server: # eureka 服务配置
    eviction-interval-timer-in-ms: 120000 #(单位毫秒,默认是60*1000)eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
    enable-self-preservation: true   #是否开启保护模式,默认为true ,保护模式就是确保不被无缘无故移除(网络故障但服务正常等情况)
    # Eureka 出现如下警告: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    # 触发了Eureka的自我保护机制,引入保护机制是为了当出现网络故障时,服务与注册中心之间无法进行正常通信(接收不到服务的心跳包)一定时间后会剔除该服务,但该服务本身是正常的,其实不应该剔除该服务。
    # 自我保护机制:如果在15分钟内超过百分之八十五的客户端节点都有正常心跳,Eureka就认为客户端与注册中心出现了网络故障,进入自我保护机制
    # 1、Eureka server 不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
    # 2、Eureka 仍能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,只保证当前节点可用
    # 3、当退出自我保护机制后,同步当前Eureka server注册信息到其它节点中
  client:  # 注册中心客户端连接配置,如果注册中心需要相互注册,则该注册中心相对于其他注册中心来说也是一个客户端
    register-with-eureka: true  #  是否向注册中心注册自己,默认为true
    fetch-registry: true # 是否检索服务
    serviceUrl:  # 注册中心服务地址配置
      # 多节点配置eureka-peer1  向eureka-peer1 和eureka-peer2 注册自己
      # 我是在本地启动,所以指定了不同的端口
      # 如果在服务器集群中,指定好对应启动的服务地址即可
      # 如果添加了spring security,需要使用 username:password@ip:port/eureka/ 的方式
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8012/eureka/

#  使用profiles区分不同注册中心的配置,只需要一份配置文件,启动的时候 ,通过激活不同的配置文件即可
spring:
  profiles: eureka-peer1 #指定此配置文件为eureka-peer1 节点配置
server:
  port: 8010  # 注册中心1启动端口为8010
---
# 使用--- 可以在同一个yml文件中配置相同属性
eureka: # # 注册中心二配置
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    preferIpAddress: true
    lease-expiration-duration-in-seconds: 30
    lease-renewal-interval-in-seconds: 10
    hostname: ${server.address}
  server:
    eviction-interval-timer-in-ms: 120000
    enable-self-preservation: true
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8012/eureka/

spring:
  profiles: eureka-peer2
server:
  port: 8011  # 注册中心2启动端口为8011

---
eureka: # 注册中心三配置
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    preferIpAddress: true
    lease-expiration-duration-in-seconds: 30
    lease-renewal-interval-in-seconds: 10
    hostname: ${server.address}
  server:
    eviction-interval-timer-in-ms: 120000
    enable-self-preservation: true
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8010/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8011/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8012/eureka/
spring:
  profiles: eureka-peer3
server:
  port: 8012  # 注册中心3启动端口为8011

一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_17


2、关闭所有程序,关闭Eureka peer1 注册中心服务向自己注册,启动Eureka peer1 和eureka client

client:  # 注册中心客户端连接配置,如果注册中心需要相互注册,则该注册中心相对于其他注册中心来说也是一个客户端
    register-with-eureka: false  #  是否向注册中心注册自己,默认为true

一个微服务注册多个nacos 微服务注册到多个eureka_一个微服务注册多个nacos_18


3、关闭eureka peer 2 以及eureka peer3节点的注册中心服务向自我的注册中心注册,分别启动Eureka peer 2、 Eureka peer3 查看注册中心信息。

一个微服务注册多个nacos 微服务注册到多个eureka_注册中心_19


一个微服务注册多个nacos 微服务注册到多个eureka_一个微服务注册多个nacos_20


一个微服务注册多个nacos 微服务注册到多个eureka_多Eureka实战_21


三节点实战完成,更多节点可同理设置。

结束语

后面再来一篇Eureka 高级应用,按照物理地域划分注册中心,同时为Eureka 开启https