前言:
使用的是IDEA开发工具,在 eureka简介及demo的基础之上进行构建
1 直接上步骤
1.1 eureka的高可用架构图
- 图中有两个角色,即eureka server 和 eureka client 。
- 而eureka client 又分为application service(服务提供者) 和 application client(服务消费者)。
- 每个区域有一个eureka集群,并且每个区域至少有一个eureka server可以处理区域故障,以防服务器瘫痪
- eureka client向eureka server注册,将自己的客户端信息提交给eureka server。然后,eureka client通过向eureka server发送心跳(每30秒一次)来续约服务,如果某个客户端不能持续续约,那么eureka server断定该客户端不可用,该不可用的客户端将在大约90秒后从eureka server服务注册列表中删除。服务注册列表信息和服务续约信息会被复制到起群众的每个eureka server节点。来自任何区域的eureka client 都可以获取整个系统的服务注册列表信息。根据这些注册列表信息,application client 可以远程调用application service来消费服务。
- 说明
1、不同节点的Eureka Server通过Replicate(复制)进行数据同步
2、Application Service为服务提供者
3、Application Client为服务消费者
4、Get Registry 获取注册列表
5、Make Remote Call完成一次服务调用
1.2 hosts配置
- 找到 C:\Windows\System32\drivers\etc\hosts文件,添加如下配置
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
1.3 eureka-server的application.yml
在eureka简介及demo的基础之上,将原来的eureka-server的application.yml配置删除或注释掉,添加 spring.profiles.active = peer1 或 = peer2 或 = peer3
指定运行的配置文件,每次打包注释掉其他两个
1.3.1 application-peer1.yml
- 指定端口
- 指定eureka实例名称
- 配置Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
- 配置应用名称
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/ # Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
server:
enable-self-preservation: false # 关闭自我保护机制,正常情况不推荐使用,用于测试查看关闭其他服务时在注册列表中剔除
spring:
application:
name: eureka-server
1.3.2 application-peer2.yml
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
server:
enable-self-preservation: false # 关闭自我保护机制,正常情况不推荐使用,用于测试查看关闭其他服务时在注册列表中剔除
spring:
application:
name: eureka-server
1.3.3 application-peer3.yml
server:
port: 8763
eureka:
instance:
hostname: peer3
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
server:
enable-self-preservation: false # 关闭自我保护机制,正常情况不推荐使用,用于测试查看关闭其他服务时在注册列表中剔除
spring:
application:
name: eureka-server
1.3.4 打包server以及访问
使用 mvn package进行依次打包,在工程目录下的target文件夹,找到对应的eureka-server-0.0.1-SNAPSHOT.jar文件,新建一个文件夹eureka-test,将jar包拷贝到eureka-test文件夹中,并依次修改jar包为:
eureka-server-0.0.1-SNAPSHOT-1.jar
eureka-server-0.0.1-SNAPSHOT-2.jar
eureka-server-0.0.1-SNAPSHOT-3.jar
双击jar包启动工程或者进入dos,使用java -jar eureka-server-0.0.1-SNAPSHOT-1.jar 来启动工程
访问 http://peer1:8761/
访问 http://peer2:8762/
访问 http://peer3:8763/
由以上三张图可以正确理解,eureka server进行了相互注册,相互复制
1.4 eureka-client 配置
注意: 客户端只向peer1 server端注册
server:
port: 8764 #eureka-client的程序端口
eureka:
client:
service-url:
DEFAULT_ZONE: http://peer1:8761/eureka/ # 服务注册地址
spring:
application:
name: eureka-client-4 # 程序名称
1.4.1 启动eureka-client 并重新刷新peer1,peer2,peer3
eureka-client 只向peer1 server进行注册,peer2和peer3对peer1的数据进行了同步,可以看到以下三张效果,server的注册列表中都包含 EUREKA-CLIENT-4
peer1
peer2
peer3
2 疑问
- 2.1 在停用 peer1 server之后,eureka-client在peer2和peer3 server的注册列表进行了移除,重新刷新 peer2和peer3效果如下
- 2.2 eureka-client配置多个注册地址也是一样的效果(在停用peer1之后和2.1一样),下图配置了http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/
访问 http://peer2:8762/
在peer1宕机之后,peer2显示http://peer1:8761/eureka/,不可用,并且eureka-client也在peer2注册列表中移除了
访问 http://peer3:8763/
在peer1宕机之后,peer3显示http://peer1:8761/eureka/,不可用,并且eureka-client也在peer3注册列表中移除了
测试结果讨论
-
看了这篇 https://blog.youkuaiyun.com/xcbeyond/article/details/81503484 xcbeyond 这位博主的文章,评论中有一位提到如下图
-
我在停掉 eureka-server1 服务之后,eureka-server2和eureka-server3注册列表中吧eureka-client给剔除掉了【eureka-client只配置了eureka.client.service-url.DEFAULT_ZONE=http://peer1:8761/eureka/ # 服务注册地址】,难道是我把eureka-server自我保护模式关闭的原因,配置了eureka.server.enable-self-preservation=false
-
xcbeyond 提到client端配置多个server,我在想,本身各个server之间是相互注册和同步了的,停掉一个server,本身是HA(high available),其他的server中的注册列表是不变的,顶多是宕机的server不可用而已