【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。
目录
相关文章
|
消息中间件 安全 Kafka
服务调用:微服务架构的默契交流
在微服务架构中,服务调用是构建分布式系统的核心组成部分。本博客将深入探讨服务调用的概念、重要性以及如何在微服务环境中有效地进行服务之间的交流。
|
Java 机器人 Maven
【Java用法】微服务之间的相互调用方式之一,通过FeignClient客户端调用其他微服务的方法包含熔断器(Hystrix)
【Java用法】微服务之间的相互调用方式之一,通过FeignClient客户端调用其他微服务的方法包含熔断器(Hystrix)
655 0
|
8月前
|
架构师 微服务
【架构师】微服务的拆分有哪些原则?
微服务拆分需遵循七大原则:职责单一、围绕业务、中台化公共模块、按系统保障级别分离、技术栈解耦、避免循环依赖,并遵循康威定律使架构与组织匹配,提升可维护性与协作效率。
581 4
|
4月前
|
运维 负载均衡 Java
微服务基础1-微服务拆分与服务调用
文章摘要: 本文详细介绍了微服务架构的概念、优势及实现方式。对比单体架构的局限性,微服务通过拆分功能模块实现高内聚、低耦合,提升系统可用性和开发效率。重点讲解了微服务拆分策略(纵向按功能、横向抽通用)、服务注册与发现机制(基于Nacos),以及远程调用方案(RestTemplate和OpenFeign)。OpenFeign通过动态代理简化RPC调用,支持连接池和日志配置,使远程调用如同本地方法。文章还探讨了微服务拆分时机(初创期验证后或大型项目初期直接采用),为不同规模团队提供架构演进建议。
|
8月前
|
消息中间件 架构师 Kafka
【架构师】如何做技术选型?
技术选型无绝对优劣,关键在于“更合适”。需综合评估功能满足度、可扩展性、安全性、性能等非功能性需求,同时考量使用人数、社区活跃度、迭代速度、学习与维护成本,以及与现有技术体系的匹配度,权衡利弊后做出最优选择。
346 4
|
8月前
|
Java Spring
IDEA调出services窗口
本教程分两步指导:首先点击指定选项,然后在Templates中添加Spring Boot并应用,即可调出services窗口,快速完成配置。
438 11
|
8月前
|
XML Java 开发者
springboot自动装配的基本原理
Spring Boot自动装配基于“约定大于配置”理念,通过@SpringBootApplication、@EnableAutoConfiguration与spring.factories机制,结合条件注解实现智能Bean加载。它根据依赖自动配置组件,大幅简化开发。其核心是AutoConfigurationImportSelector筛选符合条件的配置类,实现按需装配。开发者可专注业务,享受“开箱即用”的便捷体验。(238字)
|
8月前
|
缓存 监控 Java
用 Spring Boot 3 构建高性能 RESTful API 的 10 个关键技巧
本文介绍使用 Spring Boot 3 构建高性能 RESTful API 的 10 大关键技巧,涵盖启动优化、数据库连接池、缓存策略、异步处理、分页查询、限流熔断、日志监控等方面。通过合理配置与代码优化,显著提升响应速度、并发能力与系统稳定性,助力打造高效云原生应用。
754 3
|
8月前
|
设计模式 Java 数据库连接
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)
|
8月前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
754 1

热门文章

最新文章