1.微服务架构数据库
1.1 特征服务器
自动化部署,端点智能化,语言和数据的去中心化控制。网络
1.2架构架构
一种将一个单一应用程序开发为一组小型服务的方法,每一个服务运行在本身的进程中,服务间通讯采用轻量级通讯机制(一般用HTTP资源API)。可经过全自动部署机制独立部署,共用一个最小型的集中式的管理。服务可用不一样的语言开发,使用不一样的数据存储技术。负载均衡
1.微服务架构框架
1.1 特征异步
自动化部署,端点智能化,语言和数据的去中心化控制。socket
1.2架构函数
一种将一个单一应用程序开发为一组小型服务的方法,每一个服务运行在本身的进程中,服务间通讯采用轻量级通讯机制(一般用HTTP资源API)。可经过全自动部署机制独立部署,共用一个最小型的集中式的管理。服务可用不一样的语言开发,使用不一样的数据存储技术。微服务
1、需求缘起
服务化的一个好处就是,不限定服务的提供方使用什么技术选型,可以实现大公司跨团队的技术解耦,以下图:
服务A是欧洲团队提供服务,欧洲团队的技术背景是Java,能够用Java实现服务;
服务B是美洲团队提供服务,能够用C++实现服务;
服务C是中国团队提供服务,能够用Go实现服务;
服务的上游调用方,按照接口、协议便可完成对远端服务的调用。
但实际上,99.9%的公司的团队规模有限,技术团队人数也有限,基本是使用同一套技术体系来调用和提供服务的:
这样的话,若是没有统一的服务框架,RPC框架,各个团队的服务提供方就须要各自实现一套序列化、反序列化、网络框架、链接池、收发线程、超时处理、状态机等“业务以外”的重复技术劳动,形成总体的低效。因此,统一RPC框架把上述“业务以外”的技术劳动统一处理,是服务化首要解决的问题。
在达成【“使用统一的RPC框架”是正确的道路】这个一致的前提下,本文指望用简单通俗的言语简述一下一个通用RPC框架的技术点与实现。
2、RPC背景与过程
什么是RPC(Remote Procedure Call Protocol),远程过程调用?
先来看下什么是本地函数调用,当咱们写下:
int result = Add(1, 2);
这段代码的时候,咱们知道,咱们传入了1,2两个入参数,调用了本地代码段中的一个Add函数,获得了result出参。此时,传入数据,传出数据,代码段在同一个进程空间里,这是本地函数调用。
那有没有办法,咱们可以调用一个跨进程(因此叫“远程”,典型的,这个进程部署在另外一台服务器上)的函数呢?
最容易想到的,两个进程约定一个协议格式,使用Socket通讯,来传输【入参】【调用哪一个函数】【出参】。
假设请求报文协议是一个11字节的字节流:
(1)前3个字节填入函数名
(2)中间4个字节填入第一个参数
(3)末尾4个字节填入第二个参数
同时能够设计响应报文协议是一个4字节的字节流:
即处理结果。
调用方的代码可能变为:
简单解释一下:
(1)讲传入参数变为字节流
(2)将字节流发给服务B
(3)从服务B接受返回字节流
(4)将返回字节流变为传出参数
服务方的代码可能变为:
这个过程也很好理解:
(1)服务端收到字节流
(2)将字节流转为函数名与参数
(3)本地调用函数获得结果
(4)将结果转变为字节流
(5)将字节流发送给调用方
这个过程用一张图描述如上,调用方与服务方的处理步骤都是很是清晰的。这个过程存在最大的问题是什么呢?
回答:调用方太麻烦了,每次都要关注不少底层细节
(1)入参到字节流的转化,即序列化应用层协议细节
(2)socket发送,即网络传输协议细节
(3)socket接受
(4)字节流到出参的转化,即反序列化应用层协议细节
能不能调用层不关注这个细节呢?
回答:能够,RPC框架就是解决这个问题的,它可以让调用方“像调用本地函数同样调用远端的函数(服务)”。
3、RPC框架职责
经过上面的讨论,RPC框架要向调用方屏蔽各类复杂性,要向服务提供方也屏蔽各种复杂性:
(1)调用方感受就像调用本地函数同样
(2)服务提供方感受就像实现一个本地函数同样来实现服务
因此整个RPC框架又分为client部分与server部分,负责把整个非(1)(2)的各种复杂性屏蔽,这些复杂性就是RPC框架的职责。
再细化一些,client端又包含:序列化、反序列化、链接池管理、负载均衡、故障转移、队列管理,超时管理、异步管理等等等等职责。
server端包含:服务端组件、服务端收发包队列、io线程、工做线程、序列化反序列化、上下文管理器、超时管理、异步回调等等等等职责。
however,由于篇幅有限,这些细节不作深刻展开。
4、结论
(1)RPC框架是架构微服务化的首要基础组件,它能大大下降架构微服务化的成本,提升调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各种复杂细节
(2)RPC框架的职责是:让调用方感受就像调用本地函数同样调用远端函数、让服务提供方感受就像实现一个本地函数同样来实现服务