微服务学习之路(三)——实现RPC远程服务调用
RPC(Remote Producedure Call)调用原理:服务消费者称为客户端,服务提供者称为服务端,处于不同网络地址,需要建立网络连接。建立连接后,双方还必须按照某种约定的协议进行网络通讯——通讯协议。正常通讯后,为了减少传输数据大小,还要对数据进行压缩——数据序列化和反序列化。
如何建立连接?服务端如何处理请求?数据传输采用什么协议?数据怎能序列化和反序列化?
一、客户端和服务端之间基于TCP协议建立网络常用两种途径。
1、HTTP通讯
2、Socket 通讯
Socket通讯时基于TCP/IP协议的封装,建立一次Socket连接至少需要一对套接字,其中一个运行于客户端——ClientSocket;另外一个运行于服务器端——ServerSocket。
Socket通讯分为四步:服务器监听、客户端请求、连接确认、数据传输
* 服务器监听:ServerSocket 通过bind()函数绑定某个具体端口,然后调用listen()函数实时监控网络状态,等待客户端的连接请求。
* 客户端请求:ClientSocket 调用connect()函数向ServerSocket绑定的地址和端口发起连接请求。
* 服务端连接请求:当ServerSocket监听或者接收到ClientSocket的连接请求时,调用accept()函数响应ClientSocket的请求,同客户端建立连接。
* 数据传输:当ClientSocket和ServerSocket建立连接后,ClientSocket调用send()函数,ServerClient调用recevice()函数,ServerSocket处理请求后,调用send()函数,ClientSocket调用recevice()函数,就可以得到返回结果。
当网络不可靠,出现网络闪断,连接超时,服务器宕机等,通常处理手段有两种:
* 链路存活检测:客户端需要定时发送心跳检测机制(一般通过ping请求)给客户端,如果服务器连续n次心跳检测或者超过规定的时间都没有回复消息,则认为此时连接已经失效,这个时候客户端就需要重新与服务端建立连接。
* 段连重试:通常有多种情况会导致连接断开,比如客户端主动关闭、服务端宕机或者网络故障等。这个时候客户端就需要与服务器重新建立连接,但一般不能立刻完成重连,而时是要等待固定的间隔后再发起重连,避免服务端的连接回收不及时,而客户端瞬间重连的请求太多而把服务端的连接数占满。
二、服务端如何处理请求
* 同步阻塞方式(BIO)
* 同步非阻塞方式(NIO)
* 异步非阻塞方式(AIO)
三、数据改如何序列化和反序列化
常见两类:文本类 XML/JSON;二进制类 PB/Thrift
考虑三方面:
* 支持数据结构类型的丰富度
* 跨语言支持
* 性能。PB序列化的压缩比和速度都要比JSON高很多,但可读性较差。
微服务学习之路(三)——实现RPC远程服务调用的更多相关文章
- 微服务实践之路--RPC
微服务实践之路--RPC 重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thr ...
- 为什么说要搞定微服务架构,先搞定RPC框架?
今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一.需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队 ...
- 【58沈剑架构系列】为什么说要搞定微服务架构,先搞定RPC框架?
第一章聊了[“为什么要进行服务化,服务化究竟解决什么问题”] 第二章聊了[“微服务的服务粒度选型”] 今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC ...
- SFDC 微服务实践之路 2016.12.10 杭州(整理)--转
原文地址:http://mp.weixin.qq.com/s/8cC4Ewt6yPjnxdYxuNZlFQ 微服务是什么? 微服务是一种细粒度(Fine-Grain)的SOA 或许在座的高朋了解过其概 ...
- Spring Cloud微服务学习笔记
Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...
- 为什么说要搞定微服务架构,先搞定RPC框架
今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一.需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
- .NET Core 微服务学习与实践系列文章目录索引(2019版)
参考网址: https://archy.blog.csdn.net/article/details/103659692 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各 ...
- 学习之路三十九:新手学习 - Windows API
来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...
随机推荐
- sde.layers表的eflags字段解析
ArcSDE地理数据库,虽然经常在用,但仅限于了解功能层面的东西,其内部实现机制对我来说是个黑盒子.因为想了解register with geodatabase操作在数据库层面到底发生了什么,我分析了 ...
- CSS3手机端字体不能小于12号的方法
CSS3手机端字体不能小于12号的方法 <pre> .xiaoyu12fontsize{ -webkit-transform-origin: 0% 0%; -webkit-transfor ...
- Selenium基础教程(二)环境搭建
一.环境搭建 (1)初学者最佳环境: Python 2.7 + Selenium 2+ Firefox 46 (2)喜欢尝新的环境: Python 3.6 + Selenium 3+ Firefox ...
- fio压测
目录 fio工具介绍 参数介绍 测试举例 模板如下: 四路服务器测试的小tips fio工具介绍 用于测试存储设备IO性能. 当存储设备中存在用户数据时,严谨使用fio进行写操作!!! 参数介绍 rw ...
- 用Powershell强制同步Windows主机与Internet time server的时间
第一步,判断Windows Time服务是否正在运行,如果没有,则开启它. 第二步,强制同步,不知为何,往往第一次会失败,那么就多运行几次好了. Get-Service w32time | Where ...
- SQL语句替换某个字段的部分数据
update `表名` set `字段`= replace(字段, '旧数据', '新数据');
- [转帖]k8s 基本使用(下)
k8s 基本使用(下) https://www.jianshu.com/p/116ce601a60f 如果你没有看过上篇的话,推荐阅读完 k8s 基本使用(上)后再阅读本篇内容. kubectl cr ...
- 【题解】与查询 [51nod1406]
[题解]与查询 [51nod1406] 传送门:与查询 \([51nod1406]\) [题目描述] 给出 \(n\) 个整数,对于 \(x \in [0,1000000]\),分别求出在这 \(n\ ...
- FusionInsight大数据开发---HDFS应用开发
HDFS应用开发 HDFS(Dadoop Distributed File System) HDFS概述 高容错性 高吞吐量 大文件存储 HDFS架构包含三部分 Name Node DataNode ...
- person类与其子类在使用中的内存情况(含java的改写和c#的屏蔽)
JAVA 普通person类及调用代码: public class Person { public String xm; public int nl; public void setme(String ...