本文作者:夏日。
1 概念
1.1 你对微服务是怎么理解的
微服务是一种软件架构风格,将应用程序拆分为一组小型、自治的服务。每个服务都专注于一个特定的业务功能,并通过轻量级通信机制(如 HTTP RESTful API)进行通信。微服务架构的核心理念是将大型单体应用拆解为更小、更可管理的组件,每个组件都可以独立开发、部署和扩展。
微服务与单体服务的区别在于规模和部署方式。微服务将应用程序拆分为更小的、自治的服务单元,每个服务都有自己的数据库和代码库,可以独立开发、测试、部署和扩展,带来了更大的灵活性、可维护性、可扩展性和容错性。
1.2 微服务带来了哪些挑战?
- 系统复杂性增加:一个服务拆成了多个服务,整体系统的复杂性增加,需要处理服务之间的通信、部署、监控和维护等方面的复杂性。
- 服务间通信开销:微服务之间通过网络进行通信,传递数据需要额外的网络开销和序列化开销,可能导致性能瓶颈和增加系统延迟。
- 数据一致性和事务管理:每个微服务都有自己的数据存储,数据一致性和跨服务的事务管理变得更加复杂,需要额外解决分布式事务和数据同步的问题。
- 部署和运维复杂性:微服务架构涉及多个独立部署的服务,对于部署、监控和容错机制的要求更高,需要建立适当的部署管道和自动化工具,以简化部署和运维过程。
- 团队沟通和协作成本:每个微服务都由专门的团队负责,可能增加团队之间的沟通和协作成本。需要有效的沟通渠道和协作机制,确保服务之间的协调和一致性。
- 服务治理和版本管理:随着微服务数量的增加,服务的治理和版本管理变得更加复杂。需要考虑服务的注册发现、负载均衡、监控和故障处理等方面,以确保整个系统的可靠性和稳定性。
- 分布式系统的复杂性:微服务架构涉及构建和管理分布式系统,而分布式系统本身具有一些固有的挑战,如网络延迟、分布式一致性和容错性。
1.3 说下微服务有哪些组件?🔥
-
注册中心:用于服务的注册与发现,管理微服务的地址信息。
- Spring Cloud Netflix:Eureka、Consul
- Spring Cloud Alibaba:Nacos
-
配置中心:用于集中管理微服务的配置信息,可以动态修改配置而不需要重启服务(
@RefreshScope
)。- Spring Cloud Netflix:Spring Cloud Config
- Spring Cloud Alibaba:Nacos Config
-
远程调用:用于在不同的微服务之间进行通信和协作。
- RESTful API:如 RestTemplate、Feign
- RPC(远程过程调用):如 Dubbo、gRPC
-
API 网关:作为微服务架构的入口,统一暴露服务,并提供路由、负载均衡、安全认证等功能。
- Spring Cloud Netflix:Zuul、Gateway
- Spring Cloud Alibaba:Gateway、Apisix 等
-
分布式事务:保证跨多个微服务的一致性和原子性操作。
- Spring Cloud Alibaba:Seata
-
熔断器:用于防止微服务之间的故障扩散,提高系统的容错能力。
- Spring Cloud Netflix:Hystrix
- Spring Cloud Alibaba:Sentinel、Resilience4j
-
限流和降级:用于防止微服务过载,对请求进行限制和降级处理。
- Spring Cloud Netflix:Hystrix
- Spring Cloud Alibaba:Sentinel
-
分布式追踪和监控:用于跟踪和监控微服务的请求流程和性能指标。
- Spring Cloud Netflix:Spring Cloud Sleuth + Zipkin
- Spring Cloud Alibaba:SkyWalking、Sentinel Dashboard
2 注册中心
2.1 注册中心有什么用?🔥
- 服务注册:各个服务在启动时向注册中心注册自己的网络地址、服务实例信息和其他相关元数据。这样,其他服务就可以通过注册中心获取到当前可用的服务列表。
- 服务发现:客户端通过向注册中心查询特定服务的注册信息,获得可用的服务实例列表。这样客户端就可以根据需要选择合适的服务进行调用,实现了服务间的解耦。
- 负载均衡:注册中心可以对同一服务的多个实例进行负载均衡,将请求分发到不同的实例上,提高整体的系统性能和可用性。
- 故障恢复:注册中心能够监测和检测服务的状态,当服务实例发生故障或下线时,可以及时更新注册信息,从而保证服务能够正常工作。
- 服务治理:通过注册中心可以进行服务的配置管理、动态扩缩容、服务路由、灰度发布等操作,实现对服务的动态管理和控制。
2.2 SpringCloud可以选择哪些注册中心?
SpringCloud 可以与多种注册中心进行集成,常见的注册中心包括:
- Eureka:Eureka 是 Netflix 开源的服务发现框架,具有高可用、弹性、可扩展等特点,并与 Spring Cloud 集成良好。
- Consul:Consul 是一种分布式服务发现和配置管理系统,由 HashiCorp 开发。它提供了服务注册、服务发现、健康检查、键值存储等功能,并支持多数据中心部署。
- ZooKeeper:ZooKeeper 是 Apache 基金会开源的分布式协调服务,可以用作服务注册中心。它具有高可用、一致性、可靠性等特点。
- Nacos:Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它提供了服务注册和发现、配置管理、动态 DNS 服务等功能。
- etcd:etcd 是 CoreOS 开源的一种分布式键值存储系统,可以被用作服务注册中心。它具有高可用、强一致性、分布式复制等特性。
2.3 说下Eureka 和 Nacos的区别?🔥
我的项目采用的 nacos 作为注册中心,选择 nacos 的一个重要原因就是它也支持配置中心。
- 共同点:Nacos 与 eureka 都支持服务注册和服务发现,都支持服务提供者利用心跳监测的方式做健康检测
Nacos 与 Eureka 的区别
- Nacos 支持服务端主动检测提供者状态:对于临时实例和 Eureka 一样采用心跳监测,而非临时实例 Nacos 会主动检测服务提供者状态,默认为临时实例。
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除。
- Nacos 在服务列表变更时可以主动推送消息给服务消费者,服务列表更新更及时
- Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka 采用 AP 方式
总的来说,Eureka 着重于服务注册与发现的简单易用,适用于基于 Spring Cloud 的微服务架构;Nacos 结合了服务注册与发现、配置管理等多种功能,适用于云原生应用场景;ZooKeeper 提供了强一致性和分布式协调的功能,适用于更复杂的分布式系统。
2.4 Eureka实现原理了解吗?
- 服务注册与发现: 当一个服务实例启动时,它会向 Eureka Server 发送注册请求,将自己的信息注册到注册中心。Eureka Server 会将这些信息保存在内存中,并提供 REST 接口供其他服务查询。服务消费者可以通过查询服务实例列表来获取可用的服务提供者实例,从而实现服务的发现。
- 服务健康检查: Eureka 通过心跳机制来检测服务实例的健康状态。服务实例会定期向 Eureka Server 发送心跳,也就是续约,以表明自己的存活状态。如果 Eureka Server 在一定时间内没有收到某个服务实例的心跳,则会将其标记为不可用,并从服务列表中移除,下线实例。
- 服务负载均衡: Eureka 客户端在调用其他服务时,会从本地缓存中获取服务的注册信息。如果缓存中没有对应的信息,则会向 Eureka Server 发送查询请求。Eureka Server 会返回一个可用的服务实例列表给客户端,客户端可以使用负载均衡算法选择其中一个进行调用。
3 配置中心
3.1 为什么微服务需要配置中心?🔥
-
集中管理配置: 每个微服务都需要一些配置信息,如数据库连接信息、端口号等。使用配置中心可以将这些配置信息集中管理,方便统一配置和修改。
-
动态更新配置: 配置中心可以实现配置的动态更新,当配置信息发生变化时,自动通知到各个微服务实例,无需重启服务即可生效。
-
环境隔离和配置版本管理: 微服务通常会部署在不同的环境中,如开发、测试、生产环境等,每个环境可能需要不同的配置信息,配置中心支持配置版本管理。
-
动态路由和灰度发布: 部分配置信息可能影响服务的路由策略或流量控制,如限流配置、路由规则等。通过配置中心,可以实现动态路由和灰度发布功能,根据配置信息的变化调整服务的流量分发策略。
-
安全性和敏感信息加密: 部分配置信息可能包含敏感信息,如密码、密钥等。配置中心可以提供安全的配置管理机制,支持敏感信息的加密存储和访问控制,确保配置信息的安全性。
3.2 SpringCloud可以选择哪些配置中心?
- Spring Cloud Config:官方推荐的配置中心,支持将配置文件存储在 Git、SVN 等版本控制系统中,并提供 RESTful AP