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

简介: 微服务拆分后需跨进程通信,常见方式包括HTTP调用(如RESTful、OpenFeign、@HttpExchange)、RPC框架(如Dubbo、gRPC、Thrift)、消息队列(如Kafka、RabbitMQ)及服务网格(如Istio)。不同场景下可依据性能、异步、跨语言等需求选择合适方案。

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

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


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 等直接调用以外,还经常用消息来做通信。

RocketMQKafkaRabbitMQ 以及 ActiveMQ 等,有很多这样的消息中间件可供选择。


服务网格

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


怎么选?

  1. 如果对性能有严格要求,可能需要选择高性能的RPC框架,如 gRPC 或 Dubbo 等,它们可以提供更快速和高效的通信方式。
  2. 如果系统是非常复杂的分布式微服务项目,涉及多个微服务和复杂的业务逻辑,可能需要考虑使用支持服务注册、负载均衡、断路器等功能的微服务框架,如 Spring Cloud 的各种组件(包括 Feign、Ribbon、Hystrix 等)或 Dubbo。
  3. 如果需要支持异步通信,消息队列肯定是首选了,当然有些 RPC 框架也支持异步,但是 MQ 还能起到解耦、削峰填谷等作用呢。
  4. 如果要有跨语言的异构场景,可以考虑用 Service Mesh。
目录
相关文章
|
20天前
|
架构师 微服务
【架构师】微服务的拆分有哪些原则?
微服务拆分需遵循七大原则:职责单一、围绕业务、中台化公共模块、按系统保障级别分离、技术栈解耦、避免循环依赖,并遵循康威定律使架构与组织匹配,提升可维护性与协作效率。
109 4
|
20天前
|
Java Spring
IDEA调出services窗口
本教程分两步指导:首先点击指定选项,然后在Templates中添加Spring Boot并应用,即可调出services窗口,快速完成配置。
76 11
|
22天前
|
XML Java 开发者
springboot自动装配的基本原理
Spring Boot自动装配基于“约定大于配置”理念,通过@SpringBootApplication、@EnableAutoConfiguration与spring.factories机制,结合条件注解实现智能Bean加载。它根据依赖自动配置组件,大幅简化开发。其核心是AutoConfigurationImportSelector筛选符合条件的配置类,实现按需装配。开发者可专注业务,享受“开箱即用”的便捷体验。(238字)
|
消息中间件 安全 Kafka
服务调用:微服务架构的默契交流
在微服务架构中,服务调用是构建分布式系统的核心组成部分。本博客将深入探讨服务调用的概念、重要性以及如何在微服务环境中有效地进行服务之间的交流。
|
20天前
|
消息中间件 存储 负载均衡
【高可用】什么是异地多活、同城容灾?
异地多活与同城容灾均为提升系统高可用的分布式架构。前者实现跨地域数据中心实时同步与故障切换,保障全球服务连续性;后者聚焦同城内快速容灾,通过高速网络实现低延迟、高可靠的数据同步与负载均衡,适用于对延迟敏感的业务场景。
75 11
|
21天前
|
Cloud Native Java API
Spring Boot 3.0 vs. 2.0
Spring Boot 3.0 带来革命性升级:全面支持 Java 17+ 与 Jakarta EE,引入原生编译、增强可观测性,推动云原生转型。相比 2.0,性能更强、启动更快、更现代。新项目应首选 3.0,老项目需逐步迁移,拥抱未来。
|
25天前
|
缓存 监控 Java
用 Spring Boot 3 构建高性能 RESTful API 的 10 个关键技巧
本文介绍使用 Spring Boot 3 构建高性能 RESTful API 的 10 大关键技巧,涵盖启动优化、数据库连接池、缓存策略、异步处理、分页查询、限流熔断、日志监控等方面。通过合理配置与代码优化,显著提升响应速度、并发能力与系统稳定性,助力打造高效云原生应用。
371 3
|
25天前
|
Prometheus 监控 数据可视化
我用 Spring AOP 做了一个可插拔的日志追踪系统
基于Spring AOP设计的可插拔日志追踪系统,通过注解实现方法级日志监控,无侵入、易配置。支持全局开关、日志级别控制与TraceId链路追踪,有效解耦业务代码与日志逻辑,提升系统可维护性与可观测性。
90 6
|
22天前
|
供应链 安全 数据可视化
2025年MES系统厂商排名揭晓:深度解析头部企业如何破解生产数智化难题
树根科技MES系统以“软件+咨询”模式深度融合精益生产与数智化技术,依托根云平台实现设备互联、数据集成与流程固化。其微服务架构支持灵活配置,覆盖计划、生产、质量、仓储等全场景,助力企业提升交付率、缩短周期、实现全流程追溯,为中大型离散制造企业提供高适配、可扩展的智能工厂解决方案。
130 2
|
缓存 负载均衡 Dubbo
Sentinel 集群限流设计原理
Sentinel 集群限流设计原理
Sentinel 集群限流设计原理