【Java架构师】各个微服务之间有哪些调用方式?

目录

[HTTP 调用](#HTTP 调用)

[RESTful API](#RESTful API)

Feign&OpenFeign

@HttpExchange

[Spring Cloud REST Client](#Spring Cloud REST Client)

[RPC 调用](#RPC 调用)

Dubbo

gRPC

[Thrift RPC](#Thrift RPC)

消息队列

服务网格

怎么选?


当我们的应用做了拆分,做成了一个个的微服务之后,就需要跨进程调用了,不像单体项目,可以进程内直接调用。

那么,微服务之间的跨进程调用都有那些方式呢?

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作为替代方案。再但是,随着Spring Cloud 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 等,有很多这样的消息中间件可供选择。

服务网格

还有一种是新技术(其实也好多年了)------Service Mesh(服务网格),技术如 Istio、Linkerd 等,提供了对微服务之间通信的控制和管理能力,包括负载均衡、故障处理、安全策略等,通过 Sidecar 代理实现微服务的通信和控制。

怎么选?

  1. 如果对性能有严格要求,可能需要选择高性能的RPC框架,如 gRPC 或 Dubbo 等,它们可以提供更快速和高效的通信方式。

  2. 如果系统是非常复杂的分布式微服务项目,涉及多个微服务和复杂的业务逻辑,可能需要考虑使用支持服务注册、负载均衡、断路器等功能的微服务框架,如 Spring Cloud 的各种组件(包括 Feign、Ribbon、Hystrix 等)或 Dubbo。

  3. 如果需要支持异步通信,消息队列肯定是首选了,当然有些 RPC 框架也支持异步,但是 MQ 还能起到解耦、削峰填谷等作用呢。

  4. 如果要有跨语言的异构场景,可以考虑用 Service Mesh。

相关推荐
不积跬步无以至千里mmbb267 分钟前
rust_analysis
开发语言·后端·rust
SL_staff14 分钟前
10人团队如何用轻量私有化文档平台实现知识复用提效?技术视角拆解B/S架构下的协作闭环
java·开源·全栈
释厄62328 分钟前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
暴力求解1 小时前
C++ ---继承(二)
开发语言·c++·算法
南楼旧雨1 小时前
深度解析宝塔插件开发:从底层逻辑到实战定制(附独立开发案例)
dubbo
猫猫.1531 小时前
IO、存储、硬盘、文件系统详细总结
java·java-ee
陈飞EXCEL1 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习
SL_staff1 小时前
设备离线时业务不中断:JVS-IOT高可用架构解析
java·物联网·产品
各类产品分享11 小时前
工业级 AR 巡检系统选型:核心参数与架构实现要点
架构·ar·ar巡检
郭小李1 小时前
mybatis 动态 sql
java·sql·mybatis