八股整理:微服务通讯方式有哪些?

微服务的通讯方式主要有以下几种:

  1. RESTful API:基于 HTTP 协议的 RESTful API 是最常用的微服务通讯方式之一。服务之间通过 HTTP 请求和响应进行通讯,实现数据交换。这种方式简单、通用,适用于各种场景,但可能不适合对实时性要求非常高的场景。
  2. RPC(远程过程调用):RPC 允许一个服务像调用本地方法一样调用另一个服务的方法。它通过将方法调用封装成网络数据包并在不同的进程之间传输,实现不同服务之间的互相调用。RPC 方式可以提高调用的效率和性能,但可能需要更多的配置和管理工作。
  3. 消息队列通讯:如 RabbitMQ、Kafka、RocketMQ 等,服务之间不直接调用,而是通过消息队列进行异步消息传递,实现服务之间的解耦和异步处理。
  4. 事件驱动通讯:服务之间通过事件触发通讯,一旦某个服务发生了某个事件,就会触发其他服务的响应。这种方式可以实现服务的松耦合和事件的实时处理,典型的实现如 Event Bus。
  5. WebSocket(长连接通信):使用 WebSocket 实现双向通信,常用于实时推送场景,服务间可以维持长期的 TCP 连接进行数据交换。

其中,RESTful API 和 RPC 是微服务间最常用的通讯方式,但它们的使用场景又略有不同:

  • RESTful API 通常用于外部接口或第三方接口通讯。
  • RPC 通常用于内部微服务之间的方法调用。

1.RESTful API VS RPC

它们的区别主要体现在以下几点:

  1. 功能和用途不同
    1. RESTful API 常用于浏览器和服务器之间的通信,第三方接口通讯等,它可以实现基于请求-响应模式的通信,支持无状态和有状态的交互。
    2. RPC 是一种用于远程过程调用的协议,用于不同计算节点之间的通信,多用于微服务内部间的调用。它允许应用程序通过网络调用远程服务,并像调用本地方法一样轻松实现分布式系统的集成。
  2. 数据格式不同
    1. RESTful API 使用文本格式来传输数据,通常使用 JSON 或 XML 进行序列化。
    2. RPC 通常使用二进制格式来传输数据,例如 Protocol Buffers(ProtoBuf)或 Apache Thrift。
  3. 性能不同:RPC 通常比 RESTful API 更高效。这是因为 RPC 的协议设计更加轻量级,并且它可以对传输的数据进行二进制压缩,使得请求报文体积更小,从而提高传输效率。而 RESTful API 基于 HTTP 协议,其报文头等信息可能使得传输的数据量相对较大,传输效率较低。

2.RESTful API 通讯实现

RESTful API 目前主流的实现方式有以下两种:

  • RestTemplate:Spring 内置的用于执行 HTTP 请求的类。
  • Spring Cloud OpenFegin:OpenFeign 是 Spring Cloud 对 Feign 库的封装,提供声明式的 HTTP 客户端,简化了服务调用的编码工作。

具体实现如下。

2.1 RestTemplate 使用

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

// 使用时
@Autowired
private RestTemplate restTemplate;

public void callOtherService(String serviceName) {
    String url = "http://" + serviceName + "/api/path";
    ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
}

2.2 Spring Cloud OpenFegin 使用

OpenFegin 引入到项目之后,需要先在 Spring Boot 启动类上添加 @EnableFeignClients 注解,之后使用以下代码就可以实现 RESTful 通讯了:

import org.springframework.cloud.openfeign.FeignClient;  
import org.springframework.web.bind.annotation.GetMapping;  
  
@FeignClient(name = "service-provider")  
public interface ServiceProviderClient {  
  
    @GetMapping("/api/hello")  
    String hello();  
}

3.RPC 通讯实现

RPC 目前主流的通讯方式有以下两种:

  • Dubbo:阿里巴巴公司开源的一个 Java 高性能优秀的服务框架,它基于 TCP 或 HTTP 的 RPC 远程过程调用,支持负载均衡和容错,自动服务注册和发现。
  • gRPC:Google 开发的高性能、通用的开源 RPC 框架,它主要面向移动应用开发并基于 HTTP/2 协议标准设计。gRPC 使用 ProtoBuf(Protocol Buffers)作为序列化工具和接口定义语言,要求在调用前需要先定义好接口契约,并使用工具生成代码,然后在代码中调用这些生成的类进行服务调用。

课后思考

RestTemplate 底层是如何实现?Spring Cloud OpenFeign 底层是如何实现的?说说它的执行流程?

参考 & 鸣谢

javacn.site

#八股文##java#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务