自我加戏,在自闭的边缘尝试高可用的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
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- React native和原生之间的通信
- 移动云存储服务平台Parse下的iOS安全分析
- 经典算法学习之回溯法
- 渗透测试系统BackBox Linux 4.1发布
- CMS漏洞检测工具 - CMSmap
- 基因组分析中多物种同源基因的鉴定和筛选
- SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
- Intellij IDEA 插件开发之自建插件仓库
- 空Word文档附件:绕过垃圾邮件过滤的新方法
- SpringMVC基本使用关于DisptacherServlet关于ServletContainerInitializer最简单配置接收参数路径变量表单变量
- 测序数据可视化 (一)
- Android log日志
- 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 数组属性和方法
- PHP 观察者模式深入理解与应用分析
- php依赖注入知识点详解
- php策略模式简单示例分析【区别于工厂模式】
- php连接sftp的作用以及实例代码
- redis+php实现微博(一)注册与登录功能详解
- PHP序列化的四种实现办法与横向对比
- php设计模式之观察者模式定义与用法经典示例
- Laravel获取所有的数据库表及结构的方法
- redis+php实现微博(二)发布与关注功能详解
- PHP实现小程序批量通知推送
- Thinkphp5.0 框架Model模型简单用法分析
- php设计模式之单例模式用法经典示例分析
- PHP实现统计代码行数小工具
- redis+php实现微博(三)微博列表功能详解
- php设计模式之工厂模式用法经典实例分析