Spring Cloud
为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理
、服务发现
、断路器
、智能路由
、微代理
、控制总线
)。分布式系统的协调导致了样板式的模式,使用Spring Cloud
开发人员可以快速地支持实现这些模式的服务和应用程序。
[TOC]
Eureka
服务发现
是基于微服务的体系结构的关键原则之一。Eureka
是 Netflix 服务发现
的服务器 Eureka Server
和客户端 Eureka Client
。它支持通过 Eureka Server
的配置和部署实现高可用
,每个 Server
都将注册服务的状态复制到其他 Server
。
Eureka Server
没有后端存储,所以注册表中的服务实例都必须
以发送心跳的方式使其注册信息保持最新(这样的功能可以在内存中完成);默认情况下,Eureka
通过Client 心跳
来确定 Client
是否启动的。Client
的内存也有一部分是用来存放 Eureka 注册表
的缓存(因此他们不必每个对服务的请求都去注册中心)。
Eureka Server
Eureka Server
提供服务注册与发现,各个 client
启动后,会向 Eureka Server
注册自己的信息,Eureka Server
注册表中将会存储所有可用服务节点的信息。
Eureka Client
Eureka Client
分为 服务供应商 和 服务消费者
Eureka High Availability
Eureka Server
通过运行多个相互注册的实例,可以变得更具弹性
和可用性
的。
你可以向系统添加多个 peer(对等点)
,而且,只要他们通过至少一个边彼此连接,它们就可以在彼此之间同步注册信息。如果peer(对等点)
在物理上是分开的,那么,在原则上,这个系统可以在“宕(dàng)机”类型的故障中存活下来。您可以向一个系统中添加多个对等点,只要它们都直接连接在一起,它们就可以在彼此之间同步注册,从而实现高可用
。
环境/版本一览:
- 开发工具:Intellij IDEA 2018.3.2
- springboot: 2.1.5.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
- springcloud:Greenwich.SR1
1. eureka-server(Standalone Mode)
创建一个子工程作为注册中心
,需要选择的依赖如下:
Spring Cloud Discovery -> Eureka Server
pom.xml
创建完的 pom.xml
文件如下:
1 |
|
application.yml
单机版测试下很多东西只需要选择默认即可。
1 | server: |
注:生产环境建议 Eureka Server 开启自我保护
EurekaServerApplication.java
在启动类上添加@EnableEurekaServer
开启 Eureka 服务器相关配置
1 | package com.fatal; |
2. eureka-client
创建一个子工程作为服务提供者
,需要 引入的依赖如下:
Web -> Spring Web Start
Spring Cloud Discovery -> Eureka Discovery Client
pom.xml
创建完的 pom.xml
文件如下:
1 |
|
application.yml
1 | spring: |
注:defaultZone
指定注册的 Eureka 服务器 URL
EurekaClientApplication.java
在启动类上添加@EnableEurekaClient
开启 Eureka 服务器相关配置。
1 | package com.fatal; |
注:注册中心是eureka
,那么就推荐@EnableEurekaClient
;如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient
。
3. eureka-high-availability-server
创建一个子工程作为 Eureka Server 来测试 高可用
pom.xml
和 EurekaHighAvailabilityServerApplication.java
参考上面的 eureka-server(Standalone Mode)
。唯一有区别的就是 application.yml
pom.xml
和上面 eureka-server 一样的
application.yml
1 | ######################## Eureka Server 高可用 ######################## |
注:在 Eureka 高可用配置
中,如果本地测试的话,defaultZone
上的 URL 不允许出现 ip
,只能使用域名
,否则都会出现在 unavailable-replicas
(不可用的副本)上。这里 defaultZone
的值中出现的 peer1、peer2、peer3
指的是域名
(当然,本地测试需要你自己去 hosts 文件中设置映射)。
EurekaHighAvailabilityServerApplication.java
1 | package com.fatal; |
4. 测试
4.1. Eureka 服务注册与发现
4.1.1. step
首先启动 eureka-server
然后启动 eureka-client
浏览器上访问 http://localhost:8761/ ,可以看到结果如下:
4.1.2. 测试 prefer-ip-address
应用程序使用eureka注册,它使用的是其
IP
地址,而不是其主机名。所以 Eureka Client 的 prefer-ip-address 建议为 true
点击访问Instances currently registered with Eureka
上的 EUREKA-CLIENT 服务
true
使用
IP
向注册中心注册(推荐)
你可以看到访问该服务的 URL
上显示的是 IP 地址
false
使用
主机名
向注册中心注册
你可以看到访问该服务的 URL
上显示的是主机名
4.2. Eureka 高可用
4.2.1. Eureka 本地测试(defaultZone
使用域名
)
4.2.1.1. step
打开
application.yml
中Eureka 本地测试
的注释,同时关闭Eureka 模拟生产测试
的注释在操作栏上选择
Edit Configurations
选中左侧框中的
EurekaHighAvailabilityServerApplication
,点击两次上方的复制图标将三个
EurekaHighAvailabilityServerApplication
分别修改为EurekaHighAvailabilityServerApplication 1
,EurekaHighAvailabilityServerApplication 2
,EurekaHighAvailabilityServerApplication 3
,点击OK
选中操作栏
EurekaHighAvailabilityServerApplication 1
,对应设置application.yml
文件上的spring.profiles.active
的值为peer1
,然后启动;再以这种方式启动 2 和 3 的即可。1
2
3// EurekaHighAvailabilityServerApplication 1 -> peer1
// EurekaHighAvailabilityServerApplication 2 -> peer2
// EurekaHighAvailabilityServerApplication 3 -> peer3配置 hosts 。路径:
C:\Windows\System32\drivers\etc
1
2
3127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
4.2.1.2. show
4.2.1.3. 测试同步
eureka-client
配置如下:
1 | spring: |
启动 eureka-client
,只向 http://localhost:8761/eureka 注册服务
在 8761,8762,8763
端口上的注册中心
我们都可以看到 Instances currently registered with Eureka
多了个 Application: EUREKA-CLIENT
。三个注册中心可以在彼此之间同步注册信息,所以 Eureka 高可用
实现了~~
结果如下:
4.2.2. Eureka 模拟生产测试(defaultZone
使用 IP
)
4.2.2.1. step
- 打开
application.yml
中Eureka 模拟生产测试
的注释,同时关闭Eureka本地测试
的注释 - 启动了三台虚拟机,地址分别是
192.168.0.107
,192.168.0.108
,192.168.0.109
。将虚拟机的的8761端口
对外开放(/sbin/iptables -I INPUT -p tcp --dport 8761 -j ACCEPT
)。 - 在
IDEA
中,选择下方菜单栏的Terminal
,进入eureka-high-availability-server
根目录下,输入mvn package
打包,分别部署即可到三台虚拟机即可。
4.2.2.2. show
4.2.2.3. 测试同步
eureka-client
配置如下:
1 | spring: |
启动 eureka-client
在192.168.0.107
,192.168.0.108
,192.168.0.109
上的注册中心
我们都可以看到 Instances currently registered with Eureka
多了个 Application: EUREKA-CLIENT
。三个注册中心可以在彼此之间同步注册信息,所以 Eureka 高可用
实现了~~
结果如下:
笔记
eureka.instance.prefer-ip-address: true
在 Client 端使用时,表示使用IP
向注册中心注册;在 Server 端使用(一般用于生产环境高可用场景),表示 注册中心 作为客户端时,使用IP
向其它
注册中心注册
如果你的
Instances currently registered with Eureka
上 Status 中,服务实例名前缀如果是localhost
,而不是主机名(也叫实例名, instance-id,没设置的话自动生成的),像下图那么你可以选择
Reimport All Maven Projects
,反正我重新引入之后就正常了
参考资料
- 12.5 Peer Awareness
一起来学Spring Cloud(F版) | 第一篇:认识Eureka
总结
SpringCloud
的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo
,都是基于 SpringCloud(Greenwich.SR1)
版本。
源码地址: https://github.com/ynfatal/springcloud-learning/tree/master/chapter1