客户端与微服务直接通信
GateWay:API 网关是一个服务器,是系统的单入口点。它类似于面向对象设计模式中的门面(Facade)模式。API 网关封装了内部系统架构,并针对每个客户端提供一个定制 API。它还可用于认证、监控、负载均衡、缓存和静态响应处理。例如nginx,node.js
API 网关作为系统的单入口点,并且负责请求路由,组合和协议转换。它为每个应用客户端提供了一个自定义 API。API 网关还可以通过返回缓存或默认数据来掩盖后端服务故障。
服务必须使用进程间通信(IPC)机制进行交互
交互方式:一对一 ,一对多
同步 还是异步
几种表现形式:
请求/响应
通知(又称为单向请求)
请求/异步响应
发布/订阅
发布/异步响应
1、数据格式和协议:
确定服务之间通信的数据格式和协议,如JSON、XML、Protocol Buffers等。
统一协议有助于确保服务之间的兼容性和互操作性。
2、服务发现:
确保每个服务都能够找到其他服务的位置和地址。
使用服务发现机制,如注册中心、DNS等,使服务能够动态地发现和连接到其他服务。
3、消息传递方式:
选择适当的消息传递方式,如HTTP/REST、消息队列、RPC等。
不同的应用场景可能需要不同的通信方式。
4、安全性:
确保通信是安全的,防止未经授权的访问和数据泄露。
使用加密、身份验证和授权机制来保障通信的安全性。
5、错误处理和重试机制:
设计服务间通信的错误处理机制,包括如何处理超时、网络错误、服务不可用等情况。
实施重试策略以增加系统的健壮性。
6、版本控制:
管理服务接口的版本,确保对现有服务的更改不会破坏依赖该服务的其他系统。
使用版本控制机制,如语义化版本控制。
7、负载均衡:
处理服务间通信的负载均衡,确保请求被均匀地分发到多个服务实例。
提高系统的可伸缩性和容错性。
8、监控和日志:
实施监控和日志记录机制,以便及时发现和解决通信问题。
收集有关通信性能、错误和异常的信息,用于故障排除和系统优化。
9、限流和流量控制:
确保服务之间的通信不会导致过度的流量,采用限流和流量控制手段。
防止因为高并发而导致系统性能下降。
10、持久性和一致性:
解决异步通信中的一致性问题,确保消息传递的持久性。
使用事务或其他机制来保障数据的一致性。
1、HTTP/REST API:
通过HTTP协议提供RESTful API,服务之间通过HTTP请求和响应进行通信。
简单易用,适用于无状态通信
2、消息队列:
使用消息队列系统(如RabbitMQ、Apache Kafka、ActiveMQ等),服务可以异步地通过消息进行通信。
提供解耦和可伸缩性,适用于需要异步处理的场景。
3、RPC(远程过程调用):
使用RPC框架(如gRPC、Thrift、Protocol Buffers等),服务之间可以像调用本地函数一样进行远程调用。
提供更直观的接口定义和强类型的通信。
4、WebSocket:
提供全双工通信,适用于需要实时性的场景。
常用于实时通知、聊天等应用。
5、共享数据库:
多个服务共享同一个数据库,通过数据库进行数据共享。
可能导致数据耦合,需谨慎使用。
6、事件驱动架构:
使用事件驱动的架构,服务通过发布-订阅模式进行通信。
适用于需要在系统内部广播事件的场景。
7、GraphQL:
提供灵活的查询语言,服务可以按需获取需要的数据。
适用于前端向后端发起复杂查询的场景。
8、CORBA(公共对象请求代理体系结构):
一种面向对象的远程通信协议。
在某些遗留系统中可能仍在使用。
服务实例的网络位置在服务注册中心启动时被注册。当实例终止时,它将从服务注册中心中移除。通常使用心跳机制周期性地刷新服务实例的注册信息。
服务发现的关键部分是服务注册中心。服务注册中心是一个可用服务实例的数据库。服务注册中心提供了管理 API 和查询 API 的功能。服务实例通过使用管理 API 从服务注册中心注册或者注销。系统组件使用查询 API 来发现可用的服务实例。
有两种主要的服务发现模式:客户端发现与服务端发现。在使用了客户端服务发现的系统中,客户端查询服务注册中心,选择一个可用实例并发出请求。在使用了服务端发现的系统中,客户端通过路由进行请求,路由将查询服务注册中心,并将请求转发到可用实例。
服务注册
定义: 服务注册是将服务的元数据(例如服务名称、IP地址、端口号、健康状态等)注册到服务注册中心的过程。
职责:
将服务的信息注册到服务注册中心,使其他服务能够发现和调用它。
定期更新服务的健康状态,以便其他服务能够知道该服务的可用性。
处理服务实例的注册和注销,确保服务注册中心中的信息是最新的。
服务发现
定义: 服务发现是在运行时查找和获取服务实例的过程,以便建立连接和进行通信。
职责:
查询服务注册中心,获取服务的元数据,包括服务实例的位置、IP地址、端口号等。
通过服务发现机制,使服务能够动态地找到并连接到其他服务,无需硬编码服务的位置信息。
处理服务实例的动态变化,例如新增服务、服务下线、服务健康状态变化等。
Consul、Eureka、nacos、etcd、Zookeper、Kubernetes Service Discovery、AWS Cloud Map、HashiCorp Serf。
分布式系统也需要保证数据的ACID,但是数据库的私有性导致管理困难
CAP 定理:
一致性
每次读取都会收到最近的写入或错误。
可用性
每个请求都会收到一个(非错误)响应,但不能保证它包含最新的写入。
分区容错性
尽管节点之间的网络丢弃(或延迟)任意数量的消息,系统仍继续运行。
第一个挑战是如何实现维护多个服务间的业务事务一致性。第二个挑战是如何实现多个服务中检索数据。
大多数应用使用的解决方案是事件驱动架构。实现事件驱动架构的一个挑战是如何以原子的方式更新状态以及如何发布事件。有几种方法可以实现这一点,包括将数据库作为消息队列、事务日志挖掘和事件溯源。