✅各个微服务之间,有哪些调用方式?
典型回答
当我们的应用做了拆分,做成了一个个的微服务之后,就需要跨进程调用了,不像单体项目,可以进程内直接调用。
那么,微服务之间的跨进程调用都有哪些方式呢?
HTTP 调用
首先最常见的我就是 HTTP 调用了,使用HTTP协议进行通信,通过HTTP请求和响应进行数据交换。常见的方式有以下几种:
RESTful API:
- RESTful API是基于HTTP协议的一种设计风格,微服务可以通过直接发送HTTP请求和接收HTTP响应来进行通信。
- 框架/工具:可以使用Spring MVC等框架来实现RESTful风格的API,并通过HTTP客户端(如RestTemplate、Apache HttpClient、OkHttp)来发起请求。
Feign&OpenFeign:
- OpenFeign是Spring Cloud中的一个组件,基于Feign进行了扩展和优化,可以通过定义接口和注解的方式来简化微服务之间的REST API调用。
- OpenFeign支持集成服务发现、负载均衡(与Ribbon集成)、断路器(与Hystrix集成)等功能。
但是从Spring Cloud 2020版本开始,官方宣布Feign将不再维护和支持,推荐使用OpenFeign作为替代方案。再但是,随着SpringCloud 2022的发布,官方宣布OpenFeign将被视为功能完整。这意味着Spring Cloud团队将不再向模块添加新特性。只会修复bug和安全问题。
@HttpExchange:
- 在Spring 6.0 发布之后,Spring内置了一个HTTP客户端——@HttpExchange ,可以用它来代替 Feign 和 OpenFeign
Spring Cloud REST Client:
- Spring Cloud提供了一些支持微服务之间HTTP调用的组件和库,如Spring Cloud LoadBalancer、Spring Cloud Circuit Breaker等,可以与RestTemplate或WebClient等HTTP客户端结合使用。
RPC 调用
除了 HTTP 外,用的比较多的还有 RPC 的方式。
以下是目前比较常用的几个 RPC 的框架:
Dubbo:
- Dubbo是阿里巴巴开源的高性能RPC框架,主要用于Java开发。
- 提供了服务注册与发现、负载均衡、远程调用、容错等功能,支持大规模分布式应用的RPC调用。
gRPC:
- gRPC是一个高性能、开源和通用的RPC框架,基于HTTP/2协议。
- gRPC支持多种编程语言,并且提供了客户端和服务端的自动生成代码,支持双向流和多种认证方式。
- 同时也有Spring Cloud gRPC,用于在基于Spring的微服务架构中集成gRPC。
Thrift RPC:
- Facebook开发的跨语言的高效RPC框架,支持多种编程语言。提供了跨语言的RPC支持。
- 可以通过IDL定义接口和数据类型,并生成对应的客户端和服务端代码。
消息队列
多进程之间的通信,除了 HTTP、RPC 等直接调用以外,还经常用消息来做通信。
像 RocketMQ、Kafka、RabbitMQ 以及 ActiveMQ 等,有很多这样的消息中间件可供选择。
✅Kafka、ActiveMQ、RabbitMQ和RocketMQ都有哪些区别?
服务网格
还有一种是新技术(其实也好多年了)——Service Mesh(服务网格),技术如Istio、Linkerd等,提供了对微服务之间通信的控制和管理能力,包括负载均衡、故障处理、安全策略等,通过Sidecar代理实现微服务的通信和控制。
扩展知识
怎么选?
1、如果对性能有严格要求,可能需要选择高性能的RPC框架,如gRPC或Dubbo 等,它们可以提供更快速和高效的通信方式。
2、如果系统是非常复杂的分布式微服务项目,涉及多个微服务和复杂的业务逻辑,可能需要考虑使用支持服务注册、负载均衡、断路器等功能的微服务框架,如Spring Cloud的各种组件(包括Feign、Ribbon、Hystrix等)或Dubbo。
3、如果需要支持异步通信,消息队列肯定是首选了,当然有些 RPC 框架也支持异步,但是MQ 还能起到解耦、削峰填谷等作用呢。
4、如果要有跨语言的异构场景。可以考虑用 Service Mesh