一、前言
微服务之注册中心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看一下
(1)激活了dev,eureka-peer1配置文件
(2)注册中心有两个节点地址eureka peer1,eureka peer2 两个
(3)eureka peer2 节点连接超时(因为还没有启动)
先访问一下Eureka peer1 注册中心,http://localhost:8010/
(4)eureka peer1 已经成功注册到注册中心了
5、启动eureka peer 2注册中心
(1)激活dev,peer2 节点
因为启动eureka peer1 使用了application.yml文件中的默认配置,所以在本地启动第二个相同服务时需要配置一些启动参数,以便激活peer2
我是直接指定了jvm启动参数
-Dspring.profiles.active=dev,eureka-peer2
(2)激活了dev,peer2配置文件
(3)注册中心有两个服务地址
看一下Eureka peer1节点的信息
(4)看一下eureka peer2
至此双注册中心能够互联,配置完成。看一下上篇写的eureka-client(代表了一个微服务)能否注册成功
6、微服务连接注册中心集群
(1)按照上篇的默认配置,我们不对配置做修改先看一下eureka peer1
(2) 查看一下eureka peer2
通过上述(1)、(2)我们可以看到虽然eureka client 只向eureka pee1注册了,但是我们也能在eureka peer 2中查看到eureka client 的注册信息。
(3)停掉eureka peer1节点后查看eureka peer2 还能够查询到eureka client信息吗
刚停掉Eureka peer1的时候,我们查看http://localhost:8011/ 还是能看到都在,需要等到注册中心清理无效节点刷新页面查看,如下:
可以看到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 向两个注册中心都注册的时候,这个时候当其中的任何一个注册中心挂掉的时候,服务依旧可用。
三、三节点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
2、关闭所有程序,关闭Eureka peer1 注册中心服务向自己注册,启动Eureka peer1 和eureka client
client: # 注册中心客户端连接配置,如果注册中心需要相互注册,则该注册中心相对于其他注册中心来说也是一个客户端
register-with-eureka: false # 是否向注册中心注册自己,默认为true
3、关闭eureka peer 2 以及eureka peer3节点的注册中心服务向自我的注册中心注册,分别启动Eureka peer 2、 Eureka peer3 查看注册中心信息。
三节点实战完成,更多节点可同理设置。
结束语
后面再来一篇Eureka 高级应用,按照物理地域划分注册中心,同时为Eureka 开启https