我们都知道现在的项目开发中都是一个微服务一个微服务的部署,然后每个微服务之间都是相对独立的,不会再像之前的老项目所有的不同的功能模块都集成在一个项目中了,但是每个微服务之间的通信问题,就成了一个非常重要的内容了。今天了不起就陪着大家来了解一下这个微服务之间的通信方式,如果面试官问到了,就看你怎么发挥了。
图片
微服务之间的通信方式
其实微服务之间的通信方式,如果让了不起来回答的话,无非就是三种内容,同步通信,异步通信,事件驱动架构(EDA),但是也有很多人会说,实际上这个微服务之间的通信方式也可以归结为两种,一种就是同步通信,一种就是异步通信,而这个事件驱动架构并不能算是一种通信方式,了不起觉得不对,他其实也算是一种,只不过没有那么的标准罢了,个人理解问题,反正只要能回答上两种,其实就已经算是合乎标准的回答了。
同步通信
微服务之间通过请求-响应的方式进行通信,例如 RESTful API 和 RPC。通信过程中,请求方需要等待响应方的返回结果,因此可靠性较高,但可能会出现请求排队、线程阻塞等问题,从而影响系统的响应速度和并发性能。
异步通信
微服务之间通过消息队列进行异步通信,例如Kafka和RabbitMQ。通信过程中,发送方向消息队列发送消息,接收方从消息队列中消费消息,消息传输以异步的方式进行,不需要等待接收方的响应。由于解耦性高,消息队列还可以支持发布-订阅模式,消息得以广播到多个服务中,助于构建高可伸缩的系统。不过异步通信也可能导致延迟较高,以及可靠性和容错性较差等问题。
事件驱动架构(EDA)
微服务之间通过发布-订阅模式进行通信,例如Apache Kafka和AWS SNS/SQS。通信过程中,发布者发布事件,订阅者订阅事件,事件传递以异步的方式进行。通过EDA,不同服务之间可以实现松耦合通信,提高系统的可伸缩性和弹性,但需要谨慎处理网络分区等极端情况,以避免出现一致性等问题。
既然我们都已经知道了这个微服务之间的通信方式了,那么是不是得看看微服务通信实现呢?
微服务通信实现
服务注册与发现
服务注册与发现是微服务架构的关键组件之一。它允许服务在启动时注册其自身,并通过服务发现机制向其他服务公开其位置。为了实现服务注册与发现,我们通常使用以下组件:
ZooKeeper:
ZooKeeper 是一个具有高可用性和可扩展性的分布式协调服务。它可以用于服务注册和发现,以及配置管理。
- etcd:
etcd 是一个分布式键值存储系统,用于服务注册和发现,并提供强一致性保证。
- Consul:
Consul 是一个分布式服务发现和配置管理系统。它支持多数据中心、健康检查和负载均衡等功能。
服务调用
服务调用是微服务之间通信的另一个重要组件。它包括客户端负载均衡、服务降级、熔断和容错等功能。为了实现服务调用,我们通常使用以下组件:
- Ribbon:
Ribbon 是一个负载均衡器,它可以帮助我们在集群中平衡负载。它支持多种负载算法和服务发现,可以与Eureka等注册中心集成。
- Feign:
Feign 是一个声明式的 REST 客户端,它使编写 REST 客户端变得更加简单。我们可以使用注解来定义需要访问的服务接口,并且在运行时自动生成实现代码。
- Hystrix:
Hystrix 是一种容错和熔断框架,它可以帮助我们处理分布式系统中的故障,并防止故障扩散。Hystrix 通过控制线程池和请求队列来实现熔断机制,从而避免系统崩溃。
- Resilience4j:
Resilience4j 是一个轻量级的容错库,它提供了诸如熔断、超时、重试和限流等功能。与Hystrix相比,Resilience4j提供了更为灵活和集成化的解决方案。
其实如果你掌握到这些内容的时候,那么面试中问到关于微服务之间的通信方式的话,你回答起来应该问题就不大了。