1.协议分层模型
通信协议通常按照分层模型进行设计,常见的分层模型包括 OSI七层模型 和 TCP/IP四层模型 。OSI七层模型包括应用层、表示层、会话层、传输层、网络层、数据链路层和物理层;而TCP/IP四层模型则包括应用层、传输层、网络层和网络接口层。每个层次都有其特定的功能和职责,确保数据的完整传输和错误处理。
2.传输协议
主要传输协议分类及功能
TCP(传输控制协议)
面向连接的可靠协议,确保数据顺序和完整性,适用于网页浏览、文件下载等场景。其核心技术包括滑动窗口、拥塞控制(如慢启动、快速重传)等。
UDP(用户数据报协议)
无连接的轻量级协议,牺牲可靠性换取传输效率,常用于视频流、在线游戏等实时应用。
HTTP/HTTPS
HTTP:超文本传输协议,用于网页数据明文传输。
HTTPS:通过SSL/TLS加密的HTTP安全版本,保护隐私数据(如网银交易)
FTP(文件传输协议)
专用于文件上传下载,但默认安全性较低,推荐使用SFTP或FTPS替代。
SMTP(简单邮件传输协议)
负责电子邮件的发送和服务器间转发。
SSH(安全外壳协议)
加密远程登录和管理服务器,防止数据窃听
3. RPC框架
RPC(Remote Procedure Call)即远程过程调用,是一种通过网络从远程计算机程序上请求服务的技术,它允许程序像调用本地方法一样调用远程服务,而无需了解底层网络细节。
3.1 概念
1. RPC的核心概念
RPC是一种分布式计算技术,其核心思想是屏蔽网络通信的复杂性,使开发者能够像调用本地函数一样调用远程服务。它基于客户端-服务器模型,通过特定的协议(如TCP、UDP或HTTP)实现跨进程或跨机器的通信。
2.RPC的工作原理
- 客户端调用:客户端发起对远程服务的调用,通过客户端存根(Client Stub)将参数序列化为网络可传输的格式。
- 网络传输:序列化后的数据通过底层网络协议传输到服务端。
- 服务端处理:服务端存根(Server Stub)接收数据并反序列化,调用本地服务处理请求。
- 结果返回:处理结果经序列化后返回客户端,客户端存根反序列化并返回给调用方。
3.RPC的关键组件
- 客户端与服务端:分别作为调用方和服务提供方。
- 存根(Stub):负责序列化/反序列化和网络通信。
- 协议与序列化:定义数据传输格式(如JSON、Protobuf)和通信规则。
3.2 具体实现
1. OpenFegin
OpenFeign是Spring Cloud基于Netflix Feign二次开发的声明式(使用接口的方式)HTTP客户端,支持Spring MVC注解,简化了微服务间的远程调用,并默认集成Ribbon实现负载均衡。
OpenFeign 内部使用了 HTTP 客户端(默认是 Apache HttpClient 或 JDK 自带的 HttpClient)来执行实际的 HTTP 请求。
响应传输方式:
2. Dubbon和GRPC
Dubbo是阿⾥巴巴开源的基于 Java 的⾼性能 RPC分布式服务框架,致⼒于提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理⽅案。 Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接⼝,Dubbo协议相⽐RESTful协议速度更快RPC。
响应传输方式:
因为不需要转json,体积小,速度快。
3. 区别
1. 协议
- Dubbo支持多传输协议(Dubbo、Rmi、Http、Redis等),可以根据业务场景选择最佳的方式,非常灵活。默认的Dubbo协议利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。
- OpenFeign基于Http传输协议,短连接,不适合高并发的访问。
2. 负载均衡
- Dubbo支持4种算法(随机、轮询、活跃度、Hash一致性),而且算法里面引入权重的概念。配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。负载均衡的算法可以精准到某个服务接口的某个方法。
- OpenFeign只支持N种策略:轮询、随机、ResponseTime加权。
3. 容错策略
- Dubbo支持多种容错策略:failover、failfast、broadcast、forking等,也引入了retry次数、timeout等配置参数。在选择远程服务调用框架时,我们需要综合考虑项目的需求和场景。对于需要高度灵活性和定制化的服务调用需求,Dubbo可能是一个更好的选择。它支持多种协议,灵活的负载均衡策略和容错机制,能够满足复杂的服务调用场景。
- OpenFeign可能更加适合HTTP协议的服务调用。它简化了服务间的调用,提供了声明式的服务接口,可读性性更高。
4. 总结
- Dubbon和GPRC性能更好,OpenFegin性能差一点
- OpenFegin和GRPC支持跨语言。
- OpenFegin使用JSON序列化传输,可读性更高。