Eureka 服务注册中心 一.用来干什么?
1.通过集群实现系统的高可用,多个注册中心相互注册相互监控,充当替换,互为备用
2.注册到eureka的服务实例可以通过服务发现来获取实例信息,如:端口号,地址,服务名称等
在上一章中我们创建了两个服务(80,8001),通过80远程调用8001
文章图片
Eureka 是springcloud的核心组件之一,提供了三大功能
1.服务注册
对于eureka来说,上面的80和8001都是客户端( eureka client) 而eureka本身作为服务端( eureka server) 通过服务注册由80直接调用8001变成80通过eureka调用8001
文章图片
2.注册列表
eureka有视图界面,所有注册到eureka的服务都会在eureka服务列表中显示出来
文章图片
3.监控和实时保护
eureka会通过接收已注册的服务发送的心跳对服务进行监控,默认30秒收到心跳,90秒内接收不到心跳eureka会认为服务宕机了,会把宕机的服务干掉(踢出注册中心),但是eureka默认开启自我保护机,就是说即使注册到eureka中的服务宕机了,eureka也不会将其踢出,因为还些是可能服务本身是好的,只是因为网络暂时不好而已。要想实现eureka踢出宕机服务,需在yaml文件中进行相应配置,即:关闭eureka的自我保护机制(下面会讲到)
文章图片
上代码:
还是熟悉的一套: 建工程 --> 写pom -->写yaml -->主启动
建工程:
文章图片
写pom:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.example
cloud-api-commons
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
test
junit
junit
写yaml:
server:
#端口号
port: 7001eureka:
#实例
instance:
hostname: eureka7001#eureka服务端的名字
client:
#表示不向注册中心注册自己,因为自己就是就作为注册中心
register-with-eureka: false
#表示自己就是注册中心,职责是维护服务实例,不需要检索服务
fetch-registry: false
service-url:
#设置eureka-server交互地址,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#defaultZone: http://eureka7002:7002/eureka/
#server:
#enable-self-preservation: false#关闭自我保护机制
#eviction-interval-timer-in-ms: 10000#设置eureka驱逐宕机服务时间间隔 这里为十秒
主启动:
文章图片
修改80和8001的yaml文件:
8001加上:
eureka:
instance:
#实例id
instance-id: payment8001
prefer-ip-address: true #当鼠标移动到注册中心实例上时,会在左下角显示ip#lease-renewal-interval-in-seconds: 2 #设置向eureka服务端发送心跳的时间间隔
#lease-expiration-duration-in-seconds: 10 #设置最后一次收到心跳后持续多少秒将client剔除client:
#表示将自己注册到eureka(服务注册中心)
register-with-eureka: true
#表示是否从eureka上面抓取自己的注册信息,默认为true,
fetch-registry: true
service-url:
#要注册的eureka(服务注册中心)地址
defaultZone: http://eureka7001:7001/eureka/ # 单机版
#defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/#集群版
80加上:
eureka:
instance:
instance-id: order80
prefer-ip-address: true #当鼠标移动到注册中心实例上时,会在左下角显示ip
client:
register-with-eureka: true #将自己注册到eureka中
fetch-registry: true #从注册中心查询自己的注册信息
service-url: # 注意: 层次缩进和http前面的空格不能少
defaultZone: http://eureka7001:7001/eureka/
#defaultZone: http://eureka7001:7001/eureka/ #,http://eureka7002:7002/eureka/
先启动eureka 7001 再启动 8001 再启动80
浏览器访问 eureka7001:7001
这里的eureka7001是本地主机地址,默认是localhost,可以在下面的配置文件里改(改了后记得Ctrl+s保存),这样可以更好地区分注册中心与其他服务
文章图片
会看到8001和80两个服务会在eureka服务列表中显示
文章图片
自测8001通过后,再通过80远程调用8001
自测通过
文章图片
通过80远程调用8001,成功拿到数据(这里的80端口号被隐藏了)
文章图片
虽然成功拿到了数据,但并不是通过eureka拿到的,因为远程调用的路径没有变,我们只是将两个服务注册到了eureka
文章图片
文章图片
我们改变路径,使得80通过eureka远程调用拿到8001的数据
文章图片
CLOUD-PAYMENT-SERVICE是注册到eureka的服务名称
文章图片
在配置类中加上这个注解
@LoadBalanced不加会报错
文章图片
这里是springcloud五大组件中的ribbon起了作用,eureka整合了该组件,加上@loadbalanced注解后,可以实现ribbon的功能负载均衡
文章图片
ribbon从eureka中根据服务名称获取到服务实例,通过负载均衡算法实现从不同的服务提供者上获取到数据(8001就是一个服务提供者)
我们这里还不能实现负载均衡,因为我们只有一个服务提供者8001,但是可以实现通过eureka远程调用拿到8001里的数据
成功再次拿到数据
文章图片
你以为完了吗?要是世界如此简单就好了!!!
新问题: 要是eureka,和8001服务都宕机了呢!
答:那就芭比Q了
二.集群
一组独立的计算机系统构建出来的松耦合的多处理器系统,它们之间通过网络来进行进程通信。
简单的说就是多台机器一起工作,可以是并行,可以是备用(集群在硬件和软件中都有存在,springcloud中的微服务为了高可用大多需要进行集群)
作用:
1.高可用性:试想一下,上面的服务是80通过eureka(注册中心)来远程调用8001,如果eureka自己本身出问题了呢? 那么整个程序也就完了,这时如果有两个eureka,三个eureka呢,那么问题就得到了解决,一个eureka出错,其余的eureka顶上,保证程序的正常运行
2.负载均衡:集中式负载均衡(ribbon就是集中式负载均衡)通过服务消费方(80)从eureka中调用不同的服务提供者(目前只有8001)提供服务
我们仿造8001服务创建8002服务,除了端口号不一样外其余的服务业务都一样
文章图片
启动8002后可以在eureka中看到,同一个服务名称下有两个服务实例8001,8002
文章图片
为了更好地看到负载均衡的效果,我们可以在8001,8002服务中将端口号显示出来
文章图片
文章图片
在eureka已经启动的前提下重启8001,8002,80服务(注意顺序:eureka第一,8001和8002是同级的谁先谁后不影响,80最后启动),打开浏览器通过80远程调用不断点击刷新,就会看到8001,8002,8001,8002.....不断轮询从而实现了负载均衡
文章图片
文章图片
上面两次查询得到的数据不一样是因为我在数据库中用了不同的表存储了不同的数据,8001和8002分别对应一张表
到此我们除了实现负载均衡外还实现了服务提供者的集群,接下来,我们实现注册中心的集群
为了更好地呈现不同的注册中心效果,可以改一下本地主机地址
文章图片
停掉所有服务后,仿造7001创建7002,
文章图片
修改7001和7002的yaml文件
文章图片
将7001注册到7002,7002注册到7001,相互注册相互监控
分别访问eureka7001:7001和eureka7002:7002 可以看到
文章图片
文章图片
更改8001,8002,80的yaml文件,将defaultZone:改成:http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/即:将这三个服务同时注册到eureka7001和eureka7002上
文章图片
启动8001,8002,80服务分别访问eureka7001:7001和eureka7002:7002
文章图片
文章图片
eureka7002的加入实现了注册中心的高可用,如果eureka7001宕机了,eureka7002顶上,解决了之前提出的问题
3.关闭自我保护机制
在上面的8001,8002,80几个服务中,如果其中之一或全部宕机了(服务关闭),注册中心并不会在列表中剔除他们,因为eureka默认开启了自我保护机制,需要在注册中心的配置文件(eureka7001和eureka7002的yaml文件)中关闭自我保护机制
这里只关闭7001的自我保护机制作为演示
文章图片
重启7001后,关闭8001服务,过一会8001会在eureka7001上消失,但eureka7002上还在
文章图片
文章图片
因为eureka7002的自我保护机制没有关闭
eureka就说到这里,如有错误还请指正
下一章springcloud五大核心组件之ribbon
【springcloud|springcloud-02-eureka(服务注册与发现)】
推荐阅读
- 分布式|SpringCloud Netflix-Eureka使用
- docker|docker和k8s面试题总结(未完待续)
- 前端面试题|【牛客网-公司真题-前端入门篇】——2021牛客模考-卷1
- Spring的解耦语法糖Event你还不知道吗()
- 后端|GitHub 又爆新作!2 份 PDF+1 个插件算法刷题三件套!面试进阶双飞
- 龙蜥社区首推“分层分类”顶设 发展以云为终态的开源产业创新生态
- 招行架构师徐佳航(金融云原生与开源标准的共同生长)
- 阿里云 ACK One 多集群管理全面升级(多集群服务、多集群监控、两地三中心应用容灾)
- servlet|vue3验证码倒计时60秒(自用)