学习微服务注册解决方案和Eureka的实现
微服务注册解决方案和Eureka
微服务架构会遇到的问题
- 调用地址硬编码到了微服务的java代码中。
- 正式应用的时候微服务会有一大堆,调用方端需要记录维护每一个其他微服务的地址。增加了开发难度
- 微服务调用做负载均衡会有问题。
- 调用关系链路复杂,导致追踪困难
服务注册Eureka (AP型注册中心)
微服务注册中心
注册中心可以说是微服务架构中的“通讯录”, 它记录了服务和服务地址的映射关系。在分布式系统架构中,服务会注册到这里,当服务需要调用其他服务时,就这里找到服务的地址,进行调用
注册中心是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的作用,功能如下:
-
服务发现:
- 服务注册/反注册: 保存服务提供者和服务调用者信息。
- 服务订阅/取消订阅: 服务调用者订阅服务提供者的信息,最好有实时推送功能。
- 服务路由(可选): 具有筛选整合服务提供者的能力
-
服务配置:
- 配置订阅: 服务提供者和服务调用者订阅微服务相关的配置。
- 配置下发: 主动将配置推送给服务提供者和服务调用者。
-
服务健康检查
- 检测服务提供者的健康状况。
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
负载均衡策略 | 权重/ metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Eureka概述
Eureka是Netfilx开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netfilx中,
实现SpringCloud的服务发现功能
上图简要的描述了Eureka的基本架构,由3个角色组成
-
Eureka Server
提供服务注册和发现
-
Service provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
-
Service Consumer
- 服务消费者
- 从Eureka获取注册服务列表,从而能够消费服务
-
Eureka Server需要单独搭建,就是我们的注册中心。
-
集群搭建时新增加的server会复制最近server的服务注册列表。
-
每个微服务(提供者和消费者)需要集成Eureka Client
-
Eureka Server提供了服务发现功能,当服务提供者启动会通过client自动注册本身相关服务。
-
Eureka Server会将注册信息保存到内存中。
-
Eureka Client每30秒会向Eureka Server发送心跳表示自己仍然存活。
- 当配置时间之内Eureka Server没有收到Client发送的心跳,Server认定该服务宕机或下线,就会删除内从中的注册信息
- 消费者通过Eureka Client向注册中心发送请求,拉取所有的注册信息。并存储到内存
- 从内存中找到需要request的地址并发起请求。
注意: 当注册中心删除了下线的服务,可能有些client还并没有更新注册信息,依然保留有过期的注册信息。这个就是不能完全保证C (一致性),只能保证A (可用性)P (分区容错性)