gRPC原理
RPC 框架原理
RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。
目前分布式系统中常见的一些一致性协议:两阶段提交协议,三阶段提交协议,向量时钟,RWN协议,paxos协议,Raft协议。
两阶段提交协议,简称2PC,是比较常用的解决分布式事务问题的方式,要么所有参与进程都提交事务,要么都取消事务,即实现ACID中的原子性(A)的常用手段。
两阶段提交将提交过程划分为连续的两个阶段:表决阶段(Voting)和提交阶段(Commit)。假设在没有故障发生的情形下,两阶段提交协议由下列操作序列构成,如下图所示:
xml序列化
在java发展早期开始,为了统一接口,xml协议横空出世,良好的可读性,自由度极高的扩展性,成了很长一段时间的序列化标准规范。实现xml序列化/反序列化的方案有很多,最常见的是XStream 和 Java 自带的 XML 序列化和反序列化两种 ,并且还有基于xml协议的soap协议实现的webservice接口等。可以说xml序列化是开发中最常见也是发展时间最久的协议,并且支持跨进程和跨语言交互,但是缺陷也很明显,即xml规范下的每一个属性和值都是固定的标签形式,导致序列化后的字节流文件很大,远超于java自身的序列化方案,而且效率很低,一般建议使用在内部系统或者性能要求不高,但是对于接口的复杂度和准确性要求比较高的接口交互,或者适合多语言多进程之间交互的统一规范,不适合QPS过高的工程使用
Raft作为一种比较好理解的分布式一致性算法(相对于paxos来说,其实要理解还是有点难度的!),是通过选举机制,日志复制来保证发布式系统数据的一致性。
相对于Paxos算法,Raft引入主节点,通过竞选。其中节点类型:
Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
流程:
① 下图表示一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。
很多同学包括自己对keepalive理解不清晰,经常搞不清楚,TCP也有keepalive,HTTP也有keepalive,Nginx有keepalive,高可用也有叫keepalived的工具,经常混淆这几个概念。很多时候keepalive对于开发人员几乎是透明的,但从架构的角度,大家还是有必要认真了解一下keepalive后面那些事。
众所周知,HTTP是短连接,client向server发送一个request,得到response后,连接就关闭。之所以这样设计使用,主要是考虑到实际情况。例如,用户通过浏览器访问一个web站点上的某个网页,当网页内容加载完毕之后,用户可能需要花费几分钟甚至更多的时间来浏览网页内容,此时完全没有必要继续维持底层连。当用户需要访问其他网页时,再创建新的连接即可。
边缘计算(Edge Computing)是云计算向边缘的延伸,本文对边缘计算、雾计算、MEC、Cloudlet、分布式云等边缘计算领域相关概念和技术的定义、架构、场景等进行了比较分析,并对该领域的技术发展趋势给出了预测与展望。
在整个行业数字化转型的大背景下,在 IoT、5G、 VR、AI 等业务云化需求驱动和技术发展推动下,边缘计算(Edge Computing)概念应运而生并迅速得到了行业的广泛关注。相对于经典云计算带来的“云端”的海量计算能力,边缘计算实现了资源和服务向边缘位置的下沉, 从而能够降低交互时延、减轻网络负担、丰富业务类型、优化服务处理,提升服务质量和用户体验。
边缘计算概念并无明确定义,雾计 算、MEC、Cloudlet、 边 缘 计 算、 分 布 式 云 等 概 念 迭 出,ETSI、ITU、OpenFog、ECC、OEC、3GPP、ISO、IEC、 IEEE、Linux 基金会、OpenStack 基金会等业界主流标准 化、开源和行业组织都在积极推进但都有所侧重。本文针对边缘计算、雾计算、MEC、Cloudlet、分布式云等领域内核心技术的定义、架构、场景等进行简介,并进行比较分析。
什么是HTTP?
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
发展历史:
版本产生时间内容发展现状
HTTP/0.91991年不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求没有作为正式的标准
HTTP/1.01996年传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令正式作为标准
HTTP/1.11997年持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码2015年前使用最广泛
HTTP/22015年多路复用、服务器推送、头信息压缩、二进制协议等逐渐覆盖市场
当谈到是选择SD-WAN还是虚拟私人网络时,企业往往都要考虑两者之间的成本、云使用和应用程序等差异和因素。一方面,也是由于近些年来业界对SD-WAN的热度颇高。因此,不少企业想知道,选择SD-WAN与虚拟私人网络的根本区别和相似之处到底在哪。
先来说说虚拟私人网络。虚拟私人网络的定义是通过不太安全的网络传输(例如互联网)创建安全网络。长久以来,虚拟私人网络的基本任务一直是删除来自已验证端点的数据包。端点之间的所有通信都会进行最高级别的加密,这构成了Internet上虚拟私人网络的基础,可以说它是简单且具有成本效益的,但在保证网络性能方面可能存有问题。
SD-WAN服务基于高品质的网络资源,充分利用SDN/NFV技术进行重构骨干网络,帮助企业客户快速实现总部与分支机构互联、数据中心互联和公有云互联。下面通过一个实例来快速了解SD-WAN服务。
某集团公司是知名的钟表行业领军人物,业务领域覆盖范围广,在全球有多个分支机构。随着公司业务的不断扩展,网络系统已不能满足,现提出改造:
断点续传:指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。
有时用户上传/下载文件需要历时数小时,万一线路中断,不具备断点续传的 HTTP/FTP 服务器或下载软件就只能从头重传,比较好的 HTTP/FTP 服务器或下载软件具有断点续传能力,允许用户从上传/下载断线的地方继续传送,这样大大减少了用户的烦恼。
常见的支持断点续传的上传/下载软件:QQ 旋风、迅雷、快车、电驴、酷6、土豆、优酷、百度视频、新浪视频、腾讯视频、百度云等。
在 Linux/Unix 系统下,常用支持断点续传的 FTP 客户端软件是 lftp。
将对象转换为字节数组,方便在网络中进行对象的传输。在网络通信中,不同的计算机进行相互通信主要的方式就是将数据流从一台机器传输给另外一台计算机,常见的传输协议包括了TCP,UDP,HTTP等,网络io的方式主要包括有了aio,bio,nio三种方式。
当客户端将需要请求的数据封装好了之后就需要进行转换为二进制格式再转换为流进行传输,当服务端接收到流之后再将数据解析为二进制格式的内容,再按照约定好的协议进行处理解析。最常见的场景就是rpc远程调用的时候,对发送数据和接收数据时候的处理。
下边我们来一一介绍一下现在比较常见的几款序列化技术框架。
鉴于目前访问国外部分网站非常困难的事实,重温一下其中的基本原理还是很有必要的。IPSec VPN是目前VPN技术中点击率非常高的一种技术,同时提供VPN和信息加密两项技术,接下来就看一下IPSec VPN的原理。
IPSec VPN的应用场景分为3种:
VPN只是IPSec的一种应用方式,IPSec其实是IP Security的简称,它的目的是为IP提供高安全性特性,VPN则是在实现这种安全特性的方式下产生的解决方案。
1. 什么是SD-WAN,SD-WAN缘何而来,又为何引起了市场的如此关注?
这需要从SDN本身说起。从2006年斯坦福大学提出集中控制架构和Openflow协议,到2012年GoogleB4的商用案例,SDN萌芽期和幻灭期的关注点一直在云和数据中心内的场景,产业界急切需要找到下一个killer app。另一方面,云计算技术的发展引发了IT产业的变革,互联网+带动了传统行业的转型,to B的互联网化在2014年赶超了to C的关注度。
可以说,聚焦于企业市场和广域网范畴的SD-WAN 服务正是在这样的行业背景和期待中形成。关于SD-WAN这个词首次出现在公众视野是2014年9月发表在networkcomputing.com的文章“Software-Defined WAN: A Primer”,但实际上SD-WAN的概念来源于更早出现的Hybrid WAN,为解决企业市场Internet互联不稳定而MPLS VPN价格昂贵这样的博弈类问题。
9月16日,Wi-Fi联盟宣布启动Wi-Fi 6认证计划,这意味Wi-Fi 6技术标准即将进入我们的工作生活。可能这时候就会有小伙伴一脸懵逼的问道“啥?好好的Wi-Fi咋还整出一个6来呢?
什么是Wi-Fi 6?
Wi-Fi 6是无线局域网(WLAN)技术的下一代发展方向。Wi-Fi 6的命名原则更像是蜂窝数据网络使用的3G/4G/5G。Wi-Fi 6名称的背后是802.11无线网络标准的最新版本:802.11ax。而Wi-Fi 6将是802.11的第一个包含正交频分多址(OFDMA)的迭代,这是对正交频分多址(OFDM)的改进。
综上所述,你可以用一个并不严谨的对比法将自家现用Wi-Fi进化为Wi-Fi 6理解成为4G向5G的进化。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
传统的HTTP协议是一个请求-响应协议,浏览器不主动请求,服务器是没法主动发数据给浏览器的。
Ajax 轮询
浏览器通过JavaScript启动一个定时器,然后以固定的间隔给服务器发请求,询问服务器有没有新消息。
缺点
服务器反推
本质上也是轮询,但是在没有消息的情况下,服务器先拖一段时间,等到有消息了再回复。暂时地解决了实时性问题。
WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
WebSocket端点生命周期的第一个事件是打开通知,它用来指示到WebSocket会话另一端的连接已经建立。一旦打开通知被WebSocket对话的两端都接收到,参与的任意WebSocket后续就可以发送消息了。在WebSocket对话期间,可能会出现一些消息传递的错误。接受消息的WebSocket端点本身就可能产生错误,或者WebSocket实现本身在某些情况下也会产生错误。要注意对错误的处理。不管在WebSocket对话的哪一端准备结束对话,他都可以初始化关闭事件。下面从Java组件的视角来看看其生命周期如何呈现。
概述
Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。
解决方案就是在网络传输上利用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保证。
网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的Web/FTP数据,Cache服务器及应用Caching技术的网络设备,可大大优化数据链路性能,消除数据峰值访问造成的结点设备阻塞。
消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。
2.1 Broker
消息服务器,作为server提供消息核心服务
2.2 Producer
消息生产者,业务的发起方,负责生产消息传输给broker,
2.3 Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
2.4 Topic
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的 广播
2.5 Queue
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
2.6 Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
场景
今天,和大家聊一下 JAVA 中的 socket 通信问题。这里采用最简单的一请求一响应模型为例,假设我们现在需要向 baidu 站点进行通信。我们用 JAVA 原生的 socket 该如何实现。
建立 socket 连接
首先,我们需要建立 socket 连接(核心代码)
import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; // 初始化 socket Socket socket = new Socket(); // 初始化远程连接地址 SocketAddress remote = new InetSocketAddress(host, port); // 建立连接 socket.connect(remote);
处理 socket 输入输出流
成功建立 socket 连接后,我们就能获得它的输入输出流,通信的本质是对输入输出流的处理。通过输入流,读取网络连接上传来的数据,通过输出流,将本地的数据传出给远端。