自我加戏,在自闭的边缘尝试高可用的Eureka
微服务架构这样的分布式环境中,必须充分考虑故障的发生,所以生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务注册中心也是如此。
在Eureka的服务治理设计中,节点即是服务提供方,也是服务消费方,服务注册中心也不例外。
Eureka的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
看到这里,我们知道了服务注册中心是可以共享资源的。但是我们不信,正所谓纸上得来终觉浅,我们要自己尝试。
首先,用到上次做初始Eureka的Server端和Client端(如果删掉了出门左转start.spring.io)
我们copy出两个差不多的properties文件。
分别命名为application-peer1.properties
server.port=1111
spring.application.name=eureka-server
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
application-peer2.properties
server.port=1112
spring.application.name=eureka-server
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
两边的spring.application.name必须保持一致,否则也不能互相注册。
看起来很简单,我们就测试高可用这一个功能,不需要太多花里胡哨的代码。
进入C:WindowsSystem32driversetc,用管理员身份打开hosts,增加如下:(不加直接用localhost的话,会导致两边都无法互相注册,这个问题的原因就留给以后看源码的我)
127.0.0.1 peer1
127.0.0.1 peer2
然后用maven install 打包,找到包所在路径。
在地址栏打开cmd(两次)
以下两行指令分别在不同的cmd输入。
java -jar eureka-server-0.0.1-SNAPSHOT.jar -- spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar -- spring.profiles.active=peer2
启动的两个Erueka服务浏览地址分别是:
http://peer1:1111/
http://peer2:1112/
这里启动之前的客户端,客户端只放properties文件:
server.port=8080
spring.application.name = eureka-client
eureka.instance.hostname=eureka-client
spring.application.name=eureka-client
#下面是之前注册的Eureka服务端地址
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
#,http://peer2:1112/eureka/
我们做个测试,将客户端注册到peer1服务器,然后启动服务端peer2和客户端,查看服务端2结果如下
可以明显看到既没有peer1,也没有客户端的注册信息。
这个时候我们启动服务端peer1和peer2,关闭客户端。
可以看到只能观察出互相注册的信息。与上图不同的是peer从unavailable-replicas到了available-replicas。
接下来我们启动客户端,刷新peer2页面
可以看到我们的HelloController所在的服务器Eureka-Client已经跃然于名单。
总结,Eureka可以通过互相注册的方式,共享彼此的服务。
在搭建过程中,因为书上用的是比较老的版本,而我在spring官网生成的springboot比较新,所以就用了maven仓库里最新的erueka版本:
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client/2.2.2.RELEASE
过程中遇到一些坑,是新版和老版的差异或者书上没有道尽的东西,其中一个问题参考了下面这个链接:
https://www.jianshu.com/p/59c54ccc6ba6
- 零基础学编程015:画些有趣的图案
- Spring boot with Thymeleaf
- 零基础学编程014:小海龟做画
- Springboot @RequestBody 传递 List
- 零基础学编程013:import让你飞起来
- 【教程】利用Tensorflow目标检测API确定图像中目标的位置
- 零基础学编程012:画出复利曲线图
- OpenAI发布高度优化的GPU计算内核—块稀疏GPU内核
- SQL SERVER 原来还可以这样玩 FOR XML PATH
- 零基础学编程011:复利数据表问题(总结)
- 一个小程序引发的思考
- 深入内核:DUMP Block的数据读取与脏数据写入影响
- 零基础学编程010:最终可以输出完整的复利数据表了
- 在C#使用文件监控对象FileSystemWatcher 实现数据同步
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法