一、protocol buffers 的官方定义:
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
通过将结构化的数据进行串行化(序列化),从而实现数据存储/RPC数据交换的功能。
序列化:将数据结构或对象穿换成二进制串的过程。
- 判断每个字段是否有设置值,有值才进行编码.
- 根据字段标识号&数据类型将字段值通过不同的编码方式进行编码.
反序列化:将在序列化过程中产生的二进制串转换成数据结构或者对象的过程。
- 解析从输入流读入的二进制字节数据流.
- 将解析出来的数据按照指定的格式读取到
C++、Rust
等对应的结构类型中.
Protocol Buffers编码方式:
Varint编码: 是一种变长的编码方式,核心思想是对数值越小的数字,用越少的字节数表示,这样可以减少数字的字节数,进行数据压缩。
Zigzag编码:是一种变长的编码方式。zigzag按绝对值升序排列,将整数hash成递增的数值序列,哈希函数为h(n)=(n<<1)^(n>>31)
,对应地long型(64)位的哈希函数为h(n)=(n<<1)^(n>>63)
。
zigzag编码将正数和负数重新映射为递增的无符号数,其主要目的就是使绝对值小的数值映射为小的无符号数,已方便后序压缩字节;解码为编码的逆,首先将zigzag编码还原成哈希值,然后用哈希函数h
的逆h’(n)=(n>>>1)^-(n&1)
得到原始整数值。
T-L-V的数据存储方式
T:tag,L:length,V:value
。以标识-长度-字段值
表示单个数据,最终将所有数据拼接成一个字节流,从而实现数据存储的功能。
Protocol Buffers 是一种轻便高效的序列化结构化数据的协议;通常用在存储数据和需要远程数据通信的程序上;跨语言、但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
Protocol Buffers: 1、可以加速站点之间的数据传输速度 2、解决数据传输不规范的问题。
序列化协议需要考虑什么?
序列化之后的流的大小(占用带宽)、序列化和反序列化的性能(CPU资源占用)、是否支持跨语言
扩展性好:你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
XML、JSON、ProtoBuf比较
- XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力
- 性能方面:体积小:序列化速度快比xml和json快2-50倍;序列化后,数据大小可缩小3倍;因为体积小传输起来带宽和速度会有优化。
- 使用简单:proto编辑器自动进行序列化和反序列化、
- 维护成本低:多平台仅需要维护一套对象协议文件(.proto)、
- 向后兼容性好:可扩展性好不必破坏旧数据格式,便可直接对数据进行更新、
- 加密性好:http抓包只能抓到字节。
缺点:通用性差、自解释性差;不适用于对基于文本的标记文档(如HTML)建模,因为文本不适合描述数据结构。
- XML、JSON 更注重数据结构化,关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足(为保证极致的效率,会舍弃一部分元信息)
- ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。
Protocol Buffers常用概念:
# Message定义:描述了一个请求或响应的消息格式。
# 字段标识:消息的定义中,每个字段都有一个唯一的数值标签。
# 常用数据类型:double、 float、int32/64、bool、bytes、
# Service服务定义:在Service中可以定义一个RPC接口。
二、RPC是什么? gRPC又是什么?
RPC代指远程过程调用(Remote Procedure Call); 包含了传输协议和编码(对象序列号)协议;允许运行于一台计算机的程序调用另一台计算机的子程序。
Birrell和Nelson在1984年发表于ACM Transactions on Computer System的论文《Implementing remote procedure calls》对RPC的机制做了经典的诠释。
RPC是指计算机A上的进程,调用另一台计算机B上的进程,其中A上的调用进程被挂起(根据请求的类型调用进程处理情况不同),而B上的被调用进程开始执行,并将结果返回给A。计算机A接收到返回值后,调用进程继续执行。
调用方可以通过参数等方式将信息传送给被调用方,而后可以通过传回的结果得到信息。
GO语言官方也提供了RPC库/net/rpc提供了通过网络访问一个对象方法的能力。服务器需要注册对象,通过对象的类型名暴露这个服务。
gRPC是一个高性能、开源、通用的RPC框架。;基于HTTP2.0协议标准设计开发;支持多语言,默认采用Protocol Buffers数据序列化协议。
三、什么是微服务?
1、首先他是一种架构模式
2、相比较单体架构,微服务架构更独立,能够单独更新和发布。
3、微服务里面的服务仅仅用于某个特定的业务功能。
微服务:逻辑清晰;快速迭代;多语言灵活组织。
微服务架构的特点:1、系统服务层完全独立出来,并将服务层抽取为一个一个微服务;
2、微服务遵循单一原则
3、微服务之间采用RESTful等轻量协议通信。
4、微服务一般使用容器技术部署,运行在自己的独立的进程中,合理分配其所需的系统资源。
5、每个微服务都有自己独立的业务开发活动和周期。
微服务与领域驱动设计(DDD:Domain Driven Design)
康威定律:组织对应微服务拆分。
任何组织在设计一套系统时,所交付的设计方案在结构上都与该组织的通信结构保持一致、
DDD的作用: 真正决定软件复杂性的是设计方法。
有助于指导我们确定系统边界;能够聚焦在系统核心元素上;帮助我们拆分系统。
DDD常用概念---领域:
领域:领域是有范围界限的也可以说是有边界的;
核心域:核心域是业务系统的核心价值
通用子域:所有子域的消费者,提供着通用服务。
支撑子域:专注于业务系统的某一重要的业务。
界限上下文:不在于如何划分边界,而在于如何控制边界。
四、GO语言中的GO-kit和 GO-Micro框架:
GO-kit 是GO语言工具包的集合,提供了用于实现系统监控和弹性模式组件的库,例如日志记录、跟踪、限流、熔断等。
基于GO-kit的应用程序架构由三个主要的部分组成:传输层、接口层和服务层。
传输层:用于网络通信,服务通常使用HTTP和gRPC等网络传输方式,或使用NATS等发布订阅系统相互通信。此外,GO-kit还支持AMQP和Thrift等多种网络通信模式。
接口层:是服务层和客户端的基本构建块。在GO-kit中服务中的每个对外提供的接口方法都会定义一个端点(Endpoint),以便在服务器和客户端之间进行网络通信。
服务层 :是具体的业务逻辑实现。服务层的业务逻辑包含核心业务逻辑。
GO-Micro是基于go语言实现的插件化RPC微服务框架,提供了服务发现、负载均衡、同步传输、异步通信以及事件驱动等机制,它尝试去简化分布式系统间的通信,让开发者可以专注于自身业务逻辑的开发。
GO-Micro是组件化的框架,每一个基础功能都有对应的接口对象,方便扩展。同时,组件又是分层的,上层基于下层功能继续向上提供服务,整体构成GO-Micro框架。
GO-Micro框架中的组件:
Resgistry:服务发现组件,提供服务发现机制:解析服务名字至服务地址。目前支持的注册中心有:Cousul、Etcd、Zookeeper、dns、Gossip等。
Selector:基于Resgistry的客户端负载均衡组件,Client组件使用Selector组件从Resgistry返回的服务列表中进行负载均衡的选择。
Broker:发布和订阅组件,服务之间基于消息中间件的异步通信方式,线上通常使用消息中间件,如Kafka、RabbitMQ等。
Transport:服务之间同步通信方式。
Codec:服务之间消息的编码和解码组件
Server:服务主体,该组件基于上面的Resgistry、Selector、Broker和Transport组件,对外提供一个统一的服务请求入口。
Client:提供访问微服务的客户端。类似Server组件,它也是通过Resgistry、Selector、Broker和Transport组件实现查找服务、负载均衡、同步通信、异步消息等功能。
五、golang ORM 框架beego:
beego是一个快速开发Go语言应用的HTTP框架,它可以用来快速开发API、Web及后端服务等各种应用。是一个RESTful的框架。
beego的八大模块:cache、config、context、httplibs、logs、orm、session、toolbox。
beego是基于八大独立的模块构建的,是一个高度解耦的框架。用户即使不适用beego的HTTP逻辑,也依旧可以独立使用这些模块。如可以使用cache模块来做逻辑缓冲;基于日志模块来记录操作信息;使用config模块来解析各种格式的文件。
六、常用的服务注册与发现框架:Consul、Etcd、Zookeeper
Consul是GO语言实现,主要用于实现分布式系统的服务发现与配置(主要功能)。Consul是分布式、高可用、可横向扩展的。
相比于Etcd、Zookeeper业务范围更小,更适合于服务注册与发现。Etcd、Zookeeper属于通用的分布式一致性存储系统。
主要提供一下主要特性:
1、服务发现:可使用HTTP和DNS的方式将服务实例的元数据注册到Consul,并通过Consul发现所依赖服务的元数据列表。
2、健康检查:Consul提供定时的健康检查机制,定时请求注册到Consul中的服务实例提供的健康检查接口,将异常返回的服务实例标记为不健康。
3、Key/Value:Consul提供了Key/Value存储功能(附带功能),可以提供简单的HTTP接口进行使用。
4、多数据中心:Consul使用Raft算法;来保证数据一致性,提供了开箱即用的多数据中心功能。
Etcd是由CoreOS开源,采用Go语言编写的分布式、高可用的Key/Value存储系统,主要用于服务发现和配置共享。
ETCD经典的应用场景:
1、Key/Value存储:etcd支持HTTP RESTful API,提供强一致性、高可用的数据存储能力。
2、服务注册与发现:通过在ETCD中注册某个服务的目录,服务实例连接Etcd并在目录下发布对应的IP和port,以供调用方使用,可以有效地实现服务注册与发现功能。
3、消息发布与订阅:通过ETCD的Watcher机制,可以使订阅者订阅他们关心的目录。当消息发布者修改被监控的目录内容时,可以将变化实时通知给订阅者。
Etcd集群中的节点提供两种模式:Proxy和Peer
1、Proxy:该模式下的Etcd节点会作为一个反向代理,把客户端的请求 转发给可以的Etcd Peer集群。Proxy并没有加入到Etcd的一致性 集群中,不会降低集群的写入性能。
2、Peer:Peer模式下的节点提供数据存储和同步的哪里能力。Peer之间通过Raft协议进行Leader选举和保持数据强一致性,通常建议部署奇数个节点提供高可用的集群能力。
相比于其他的组件讲,Etcd更为轻量级,部署简单,支持HTTP接口。
Zookeeper作为Hadoop和Hbase的重要组件,是一个开源的分布式协调服务。Java语言开发。Zookeeper具备广大的周边生态。Etcd则以简单易用的特性吸引力大量开发人员。
Zookeeper底层只实现了两个功能:管理客户端提交的数据和为客户端程序提供数据节点的监听服务。基于Zookeeper可以实现服务注册与发现、消息发布与订阅、分布式协调与通知、分布式锁、Master选举、集群管理和分布式队列等诸多功能。
Zookeeper集群中存在3中角色,分别为Leader、Follwer和Observer。
etcd集群中的3个角色:Leader、Follwer和Candidate。
Go-kit是一套微服务工具集。提供了多种服务注册与发现的组件。包括:Consul、Etcd、Zookeeper。