Golang分布式设计模式之-----分层设计

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang      

提到分布式系统,我们会想到很多机器,分别部署着各自的服务,然后整体组成一个分布式系统。在这类系统中,分布式系统与常规的集中式系统存在着以下三个区别。(来自分布式算法导论)

1、缺乏全局状态知识

2、缺乏全局时间帧

3、非确定性

         这三大特点也成为分布式系统设计的难点。也正是如此,分布式系统的设计比常规的集中式系统要难的多。为了区别,我们称这种分布式系统为,群体分布式。这种犹如社会群体。

         golang语言天生具有分布式的特点,其主要是基于协程与chan的概念。如果对golang不了解的人可以简单的去看看golang语言。

         有了golang语言,我们的可执行程序,也可以设计成分布式。一个可执行程序设计成分布式,这种分布式我们成为单体分布式。这种犹如,个体,存在着很多的部件。

         其与群体分布式的区别在于:

1、由于在同一个可执行程序中,全局状态知识,是可以存在的。

2、由于在同一个可执行程序中,全局时间帧,也是可以存在的。

3、也存在着非确定性

         其实我们就经常与分布式打交道,其中最经典的有:tcp协议(点对点的通信),路由协议(包的传递过程)。这都是典型的分布式算法。

         那么OSI7层模型与tcp/ip模型都属于分层的设计模式。现在我们将此设计经验。借鉴到golang语言的开发过程中。

         下面我们以一个http流分析系统举例

一、根据功能,划分成不同的层次。

         1)dump层:利用pcap进行抓包

         2)传输层:对包进行解析tcp信息

         3)流层:将tcp包进行组装成tcp流

         4)http层:对tcp流进行识别生成相应的http信息

二、分层之后,进行接口的定义

         接口有几种方式

         1)采用func变量

                  这种情况一般以单个接口的时候

         2)采用interface

         这种情况对应于有多个func接口的时候

         3)采用chan

                  这种模式更多的适用于两个协程之间进行通信,我个人不建议做成模块之间的接口

三、组装

         在main函数中,反向初始化

         1)初始化http模块

         2)初始化流层,并将http中的接口函数与流层对接

                  流层.Init(http.接口函数)

         3)初始化传输层,并将流层的接口与传输层对接

                  传输层.Init(流层.接口函数)

         4)初始化抓包层,并将传输层的接口与抓包层对接

                  抓包层.Init(传输层.接口函数)

         分层设计,可以归属于一种类似于流水线的处理模式。属于状态的简单转移。这种设计的好处,在于,各个模块之间的耦合性降低,各个模块自成一体。整个系统的测试、维护都变得简单。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

1.2.2 计算机网络协议、接口、服务的概念

协议就是规则的集合。在网络中药做到有条不紊地交换数据,就必须遵循一些事先约定好的规则。这些规则明确规定了所交换的数据的格式以及相关的 同步问题。这些为进行网络中...

942
来自专栏大愚Talk

为什么要用Redis

最近阅读了《Redis开发与运维》,非常不错。这里对书中的知识整理一下,方便自己回顾一下Redis的整个体系,来对相关知识点查漏补缺。

1932
来自专栏Golang语言社区

转-Golang分布式设计模式之-----分层设计

提到分布式系统,我们会想到很多机器,分别部署着各自的服务,然后整体组成一个分布式系统。在这类系统中,分布式系统与常规的集中式系统存在着以下三个区别。(来自分布...

41113
来自专栏樊华恒的专栏

海量之道系列文章之弱联网优化 (五)

在客户端接入服务器调度策略的演化过程中,我们最早采用了“就近接入”的策略,在距离客户端更近的地方部署服务器或使用CDN,期望通过减少RTT来提高网络交互响应性能...

5370
来自专栏Java帮帮-微信公众号-技术文章全总结

Java等IT开发视频资源分享(不断更新)

前言: 该日志一直更新,资源都是免费分享获取精品资源需要分享好友加【Java帮帮】微信公众号,好资源大家共享,赶快分享到你的QQ空间让更多朋友都能获取免费的资源...

1.5K8
来自专栏IT技术精选文摘

客服系统微服务架构的演化

微服务要求 ? ? ? ? 服务协作 ? 服务治理 ? 服务治理 ? ? ? 1 怀疑第三方 坚持一条信念:“所有第三方服务都不可靠”,不管第三方什么天花乱坠...

4075
来自专栏腾讯架构师的专栏

多核处理器下数据库系统日志管理器优化技术探讨

传统数据库的设计假设磁盘为主要存储设备,其性能取决于基于I/O代价模型的优化。然而,当前数据库运行的平台已逐渐转移到由多核处理器、大内存和以闪存为代表的低延迟存...

2191
来自专栏黑泽君的专栏

BS和CS的区别有哪些?

3732
来自专栏Java学习网

测试是浪费时间,我的程序肯定没问题

测试是浪费时间,我的程序肯定没问题 尽管关于测试驱动开发(TDD)的书和文章有成百上千之多,仍然有很多人从未感受过测试的强大力量。 之所以不愿意去写测试程序不...

2505
来自专栏PingCAP的专栏

性能测试工具的 Coordinated Omission 问题

很早之前就看过 Gil 大神的一篇文章《Your Load Generator Is Probably Lying To You - Take The Red ...

2425

扫码关注云+社区