Spring Cloud Other

2/25/2021 SpringCloud

准备整理一些微服务遇到的一些概念,工具的选型区别,对比。例如注册中心:ZooKeeperEurekaConsulNacos对比,例如网关:ZuulGateway区别等。

# 服务注册于发现对比

微服务:注册中心ZooKeeperEurekaConsulNacos对比

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。

# CAP理论

CAP理论是分布式架构中的重要理论,CAP 不可能都取,只能取其中2个

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

理解:

一致性(Consistency),各节点保证数据统一,需要进行数据同步,就会影响可用性(Availability),

可用性(Availability),只要有一个节点健康,就能提供服务,但不保证结果正确性

分隔容忍(Partition tolerance) ,某些节点宕机了,不影响整体系统的运行

# 主流注册中心产品

Feature Eureka Zookeeper Nacos Consul
一致性协议(CAP) AP CP CP+AP CP
集群结构 平级 主从 支持平级和主从 主从
集群角色 主人 Leader、follower observer leader、follower、candidate server-leader、server以及client
健康检查 Client Beat Keep Alive TCP/HTTP/MYSQL/Client Beat TCP/HTTP/gRPC/Cmd
负载均衡策略 Ribbon 权重/ metadata/Selector Fabio
雪崩保护
自动注销实例 支持 支持 支持 支持
访问协议 HTTP TCP HTTP/DNS HTTP/DNS
监听支持 支持 支持 支持 支持
多数据中心 支持 不支持 支持 支持
跨注册中心同步 不支持 不支持 支持 支持
SpringCloud集成 支持 支持 支持 支持
Dubbo集成 不支持 支持 支持 支持
K8S集成 不支持 不支持 支持 支持

ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。

Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。

所以理论上Eureka是更适合做注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。

consul 和新晋的 nacos 的社区活跃度比较高, nacos 可以同时支持 AP 和 CP ;consul 则结合了 zookeeper 和 nacos 的诸多优点,还天然支持 多数据中心 ;而 zookeeper 则又可以唯一感知到服务状态的实时变化; Eureka 的自我保护机制使得它即使只剩下一台服务,也不影响正常运行,具有高可用性。

需要结合业务场景来进行选择。比如说,对于金融类的业务场景,对于 一致性 要求更高,那么就会排除掉 Eureka ,然后根据易用性、性价比等其他方面再进行后续的选择;对于 高可用 比较注重的项目,如电商类项目,则可以选择 Eurek 或者 Nacos ,但再比较其他方面,Nacos不仅可以做注册中心,还可以作为架构中的配置中心,并且社区活跃度比较高,功能也日渐在完善,使用的人越来越多,因此综合来讲,就选择了 Nacos

# API网关对比

API 网关是介于客户端和服务器端之间的中间层,可以分为硬件网关软件网关, 硬件网关包括LVSF5, 软件网关包括NginxZuulGateway等, PI 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全。

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  • 存在跨域请求,在一定场景下处理相对复杂。
  • 认证复杂,每个服务都需要独立认证。
  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

Gateway在Zuul的基础上进行了修改,主要是底层使用了高性能的通信框架Netty,区分了Route和Filter,提供了很多开箱即用的功能,

Ngnix:轻量级,免费,开源,社区活跃,暂用资源少,反向代理,高性能,抗并发,异步非阻塞,处理静态资源优秀

Apache:稳定,模块多,rewrite 强大,处理动态资源优秀

Gateway:主要用于替代zuul