微服务之注册中心Eureka(二)

本文详细介绍了如何从零开始搭建Eureka注册中心,从单节点配置到双节点乃至三节点集群的实践。通过配置不同环境文件,启用httpbasic认证增强安全性,并通过配置多个serviceUrl实现注册中心之间的相互注册。在注册中心集群中,即使某个节点下线,服务仍然可以正常使用,确保了高可用性。最后提到了按物理地域划分注册中心和启用HTTPS的高级应用场景。

一、前言

微服务之注册中心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就认为客户端与注册中心出现了网络故障,进入自我保护机制
    # 1Eureka server 不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
    # 2Eureka 仍能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,只保证当前节点可用
    # 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就认为客户端与注册中心出现了网络故障,进入自我保护机制
    # 1Eureka server 不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
    # 2Eureka 仍能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,只保证当前节点可用
    # 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。
欢迎大家关注我的个人微信公众号(文章积攒中…)
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值