当前位置: 首页 > news >正文

系统设计原则

系统设计原则

好的系统是迭代出来的。先解决核心问题,预测未来可能出现的问题,对现有的问题有方案,对未来的问题有预案。不是一上来就按1亿用户量设计,也不要过度复杂化系统。

业务千变万化,技术层出不穷,设计理念也是百花齐放,看起来似乎很难有一套通用的规范来适用所有的架构设计场景。但是总是有一些原则是可以通用的。

在设计系统时,应该多思考墨菲定律:

  • 任何事情都没有表面看起来那么简单
  • 所有的事情都会比你预计的时间长
  • 可能会出错的事一定会出错
  • 如果你担心某种情况发生,那么它就更有可能发生

在系统划分时,也要思考康威定律:

  • 系统架构是公司组织架构的反映
  • 应该按照业务闭环进行系统拆分/组织架构划分,实现闭环/高内聚/低耦合,减少沟通成本
  • 如果沟通出现问题,那么就应该考虑进行系统和组织架构的调整
  • 在合适时机进行系统拆分,不要一开始就把系统/服务拆得非常细,虽然闭环,但是每个人维护的系统多,维护成本高该处使用的url网络请求的数据。

一、系统的技术设计原则

1.1.高并发原则

1.1.1.无状态

如果设计的是无状态的,那么应用比较容易进行水平扩展。

实际生产环境可能是这样的:应用无状态,配置文件有状态。比如,不同的机房需要读取不同的数据源,此时,就需要通过配置文件或配置中心指定。比如后台系统使用session共享机制保证分布式部署。

1.1.2.拆分

在系统设计时,要考虑到系统是否做拆分。如果资源有限,并且用户并没有那么多,可以做一个大而全的系统。

而高并发的应用,通常是要做拆分的。拆分可以依据多个维度:

  • 系统维度 :如订单、库存、商品系统等
  • 功能维度 :如,对登录系统再拆分,划分为 :验证码登录、微信登录、密码登录等功能。
  • 读写维度 :针对读写再做分离,读服务可以使用缓存、写服务使用分库分表。

1.1.3.服务化

首先判断单点服务是否可以满足。如果不能满足,集群可以吗?使用Nginx做负载均衡是否可以解决?

服务越来越多,是否要使用服务自动注册与发现?某些服务访问量太大,导致整个系统不可用,要不要上服务降级和限流?哪些是主要服务?

1.1.4.消息队列

消息队列的作用有三个 :削峰、解耦、异步。

使用消息队列可以实现服务解耦(一对多消费)、异步处理、流量削峰/缓冲等。但是订阅者太多,那么订阅单个消息队列就会成为瓶颈,此时需要考虑对消息队列进行多个镜像复制。

使用消息队列时,需要注意消息丢失、重复接收的场景。这对于不能容忍生产失败的业务场景来说,一定要做好后续的数据处理工作,比如持久化数据同时要增加日志、报警等,或者在生产失败后发送http请求来保证成功。还有消息重复问题,特别是一些分布式消息队列,出于对性能和开销的考虑,在一些场景下会发送消息重复接收,需要在代码层面进行防重处理。

1.1.5.缓存

缓存对读服务来说,是扛流量的必选技术。不同的场景缓存不同的信息,以解决不同的问题:

  • 浏览器端缓存
  • 客户端缓存
  • CDN缓存
  • 接入层缓存: 使用Nginx做一层缓存
  • 应用层缓存
  • 分布式缓存
  • 异步与并发:某些资源实时性没那么高,可以考虑使用异步加载,如用户评价、商品打分这种。获取多个资源时,采用并发的方式获取,可以大大的加快访问速度。

1.1.6.数据异构

所谓数据异构,是把数据按需(数据结构、存取方式、存取形式)异地构建存储。比如将mysql里面的数据缓存到redis里面去,就是一种数据异构的方式。

分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候是按照订单ID维度去分库分表,那么后来的业务需求按照商家维度去查询。相同的数据需要做多种异构可以使用MQ机制接收数据的变更,然后存储到合适的存储引擎,如订单id纬度的分库分表、商家纬度的分库分表、用户纬度的分库分表、redis、Elasticsearch等。

另外,还需要考虑对历史订单数据进行归档处理,以提升服务的性能和稳定性。而有些数据异构的意义不大,如库存架构,可以考虑异步加载,或者合并并发请求。

总结起来大概有以下几种场景:

  • 数据库镜像
  • 数据库实时备份
  • 多级索引
  • search build(比如分库分表后的多维度数据查询)
  • 业务cache刷新
  • 价格、库存变化等重要业务消息

常见的异构方式:

  • 完全克隆。做数据备份。将数据库A,全部拷贝一份到数据库B,这样的使用场景是离线统计跑任务脚本的时候可以。缺点也很突出,不适用于持续增长的数据。

  • binlog方式。比如使用比较广泛的canal是基于mysql数据库binlog的增量订阅和消费组件。订阅mysql的binlog日志,消费这些日志做主从同步、缓存更新。

  • MQ方式。业务数据写入DB的同时,也发送MQ一份,也就是业务里面实现双写,消费MQ的数据做各种异构处理。这种方式比较简单,但也很难保证数据一致性,对简单的业务场景可以采用这种方式。

1.2.高可用原则

1.2.1.降级

对于一个高可用服务,很重要的一个设计就是降级开关,提前写好降级逻辑。

可以手动降级,也可以自动降级。自动降级触发的条件可以使用:超时的请求数超过阈值、异常的请求数超过阈值时。阈值具体设置为多少,通过压测初步确认,上线观察后,再次调整。

降级的手段:停止读数据库、准确结果转为近似结果、使用静态结果、同步转异步、功能裁剪、禁止写(高峰期减少不必要的写)、分用户降级、工作量证明POW(验证码、数学题、拼图、滑块)。

主要依据如下思路:

  1. 开关集中化管理:通过推送机制把开关推送到各个应用。

  2. 可降级的多级读服务:可以指定服务调用降级为只读本地缓存、只读分布式缓存、只读默认数据。

  3. 开关前置化: 如架构是Nginx—>Apache,可以将开关前置到Nginx接入层,在Nginx层做开关,请求流量汇源后端应用或者只是一小部分流量回源

  4. 业务降级:当高并发流量来袭,保证核心业务是正常的,并保障数据最终一致性即可。这样就把一些同步调用改成异步调用,优先处理高优先级数据或特殊特征的数据,合理分配进入系统的流量,以保障系统可用。

1.2.2.限流

当监控发现外部流量超过阈值或内部资源使用达到阈值(通过压测、上线观察、调整)时,告知各系统限流打开。

限流的目的是防止恶意请求流量,或者防止流量超出系统峰值。思路如下:

  • 基于请求的限流:

    限制请求总量。如腾讯会议最多500人。

    限制时间量。如一个时间窗口内最多接受100个请求。

  • 基于关键资源的限流:

    统计连接数、线程数、cup等硬件参数。难点是如何确定哪些是关键资源、阈值是多少。

    使用池化技术:线程池、连接池;使用队列排队;

相关限流的算法:

  • 滑动时间窗口:有突刺
  • 漏桶: 请求进入队列的速度不受限制,但是超过队列的大小就拒绝,请求出队列的速度固定。请求会匀速出队列。
  • 令牌桶:系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。有突刺。

有些大流量是正常的用户,这种是要临时的水平扩容。

原则是限制流量穿透到后端薄弱的应用层

1.2.3.熔断

熔断发生的三个必要条件,缺一不可,必须全部满足才能开启 hystrix 的熔断功能:

  • 有一个统计的时间周期,滚动窗口;如1000毫秒
  • 请求次数必须达到一定数量;如20次
  • 失败率达到阈值;如50%

熔断器的三个状态:

  • 关闭状态。关闭状态时用户请求是可以到达服务提供方的。
  • 开启状态。开启状态时用户请求是不能到达服务提供方的,直接会走降级方法。
  • 半开状态。当熔断器开启时,过一段时间后,熔断器就会由开启状态变成半开状态。半开状态的熔断器是可以接受用户请求并把请求传递给服务提供方的,这时候如果远程调用返回成功,那么熔断器就会有半开状态变成关闭状态,反之,如果调用失败,熔断器就会有半开状态变成开启状态。

Hystrix功能建议在并发比较高的方法上使用,并不是所有方法都得使用的。

Sentinel的熔断策略是根据响应时间,响应时间超过阈值,熔断开关打开。

1.2.4.恢复

撤出限流、消除降级、关闭熔断

熔断使用半开状态,完成吞吐量爬升、缓存预热。

灰度发布,限流阈值逐步提升。

1.2.5.隔离

  • 数据隔离:数据按照重要性排序、分库
  • 机器隔离:给重要的用户单独配置服务器,用用户标识去路由
  • 线程池隔离:线程池分配。hystrix
  • 信号量隔离:计数器。hystrix
  • 集群隔离:服务分组(注册中心)、秒杀
  • 机房隔离:3个服务。局域网IP、路由。
  • 读写隔离:主从
  • 动静隔离:识别静态资源。nginx CDN
  • 爬虫隔离:对IP的访问频率
  • 冷热隔离:秒杀、抢购。读:缓存;写:缓存+队列

1.2.6.异地多活

异地机房部署相同的服务,同时对外提供服务(不是备份)。防止因为停电、火灾、水灾、地震、战争等问题导致服务不可用。

异地多活通常考虑RTT(round trip time):网络请求一个来回消耗的传输时间。光纤光速计算 300000 KM/s,两个机房如果一个在上海,一个在新疆,隔5000KM, rtt = 300000 / 5000 * 2 = 120毫秒的往返时延。

多活要求:

  • 请求任何一个节点,都能正常响应
  • 某些系统故障,用户访问其他系统也能访问

分类:

  • 同城异区:距离较近,可以防止停电、机房起火
  • 跨域异地:距离较近,可以防止停电、机房起火、火灾、水灾、地震。
  • 跨国异地(隔离):延迟,已经无法让系统提供服务了。通常在异国开展业务,数据和服务就放在异国,和国内数据是隔离的。

异地多活容易出现数据不一致问题,要保证核心业务的多活。如用户系统有注册、登陆、修改用户信息等功能,保证正常注册、登陆多活,修改用户信息可以根据时间合并数据。

1.2.7。可回滚

灰度发布。版本化机制,当程序出错时,回滚到上一个版本。

二、业务设计原则

2.1.防重、幂等

重复提交业务,消息中间件重复消费消息。使用分布式锁、数据库唯一键等保证。

2.2.模块复用

相同的功能只开发一次,模块化。不要到处拷贝相同的代码。

2.3.可追溯

可以快速追踪到问题涉及的这个数据链路,快速定位问题。traceId

2.4.反馈原则

给出精确友好的结果反馈。如http接口调用异常时尽量给出精确的异常原因,降低内外部沟通成本。

2.5.流程可定义

相关工作有明确的流程规范

2.6.系统审批化

系统变更需要审批

2.7.文档和注释

完善文档和注释

2.8.备份

代码备份:git、分支
数据备份:运维备份,操作记录备份。
人员备份:不因个人离职导致项目停滞。

2.9.规范

制定规范,定期review。

三、系统性能常见指标

3.1.响应时间(Response time)

响应时间就是用户感受软件系统为其服务所耗费的时间,对于网站系统来说,响应时间就是从点击了一个页面计时开始,到这个页面完全在浏览器里展现计时结束的这一段时间间隔,看起来很简单,但其实在这段响应时间内,软件系统在幕后经过了一系列的处理工作,贯穿了整个系统节点。

根据“管辖区域”不同,响应时间可以细分为:

  • 服务器端响应时间这个时间指的是服务器完成交易请求执行的时间,不包括客户端到服务器端的反应(请求和耗费在网络上的通信时间),这个服务器端响应时间可以度量服务器的处理能力。
  • 网络响应时间,这是网络硬件传输交易请求和交易结果所耗费的时间。
  • 客户端响应时间,这是客户端在构建请求和展现交易结果时所耗费的时间,对于普通的瘦客户端Web应用来说,这个时间很短,通常可以忽略不计;但是对于胖客户端Web应用来说,比如Java applet、AJAX,由于客户端内嵌了大量的逻辑处理,耗费的时间有可能很长,从而成为系统的瓶颈,这是要注意的一个地方。

那么客户感受的响应时间其实是等于客户端响应时间+服务器端响应时间+网络响应时间。细分的目的是为了方便定位性能瓶颈出现在哪个节点上。

3.2.吞吐量(Throughput)

吞吐量是我们常见的一个软件性能指标,对于软件系统来说,“吞”进去的是请求,“吐”出来的是结果,而吞吐量反映的就是软件系统的“饭量”,也就是系统的处理能力,具体说来,就是指软件系统在每单位时间内能处理多少个事务/请求/单位数据等。但它的定义比较灵活,在不同的场景下有不同的诠释,比如数据库的吞吐量指的是单位时间内,不同SQL语句的执行数量;而网络的吞吐量指的是单位时间内在网络上传输的数据流量。吞吐量的大小由负载(如用户的数量)或行为方式来决定。举个例子,下载文件比浏览网页需要更高的网络吞吐量。

3.3.资源使用率(Resource utilization)

常见的资源有:CPU占用率、内存使用率、磁盘I/O、网络I/O。

3.4.点击数(Hits per second)

点击数是衡量Web Server处理能力的一个很有用的指标。需要明确的是:点击数不是我们通常理解的用户鼠标点击次数,而是按照客户端向Web Server发起了多少次http请求计算的,一次鼠标可能触发多个http请求,这需要结合具体的Web系统实现来计算。

3.3.并发用户数(Concurrent users)

并发用户数用来度量服务器并发容量和同步协调能力。在客户端指一批用户同时执行一个操作。并发数反映了软件系统的并发处理能力,和吞吐量不同的是,它大多是占用套接字、句柄等操作系统资源。

另外,度量软件系统的性能指标还有系统恢复时间等,其实凡是用户有关资源和时间的要求都可以被视作性能指标,都可以作为软件系统的度量,而性能测试就是为了验证这些性能指标是否被满足。

四、总结

一个系统的设计,不仅需要考虑实现业务功能,还要保证系统高并发、高可用等。在系统容量规划(流量、容量等)、SLA制定(吞吐量、响应时间、可用性、降级方案等)、压测方案(线上、test等)、监控报警(机器负载、响应时间、可用率等)、应急预案(容灾、降级、限流、隔离、切流量、可回滚)等方面,也要有一些原则来进行设计。

相关文章:

系统设计原则

系统设计原则 好的系统是迭代出来的。先解决核心问题,预测未来可能出现的问题,对现有的问题有方案,对未来的问题有预案。不是一上来就按1亿用户量设计,也不要过度复杂化系统。 业务千变万化,技术层出不穷&#xff0c…...

推荐130个网站,非常实用,比涨工资都重要

搞学习 TED(最优质的演讲):https://www.ted.com/ 谷粉学术:https://gfsoso.99lb.net/scholar.html 大学资源网:http://www.dxzy163.com/ 简答题:http://www.jiandati.com/ 网易公开课:https…...

手机棋牌游戏开发的流程是怎样的?

最近几年,随着网络游戏的兴起,棋牌手游开发也越来越受欢迎,在国内,几乎随处可见从事手游和手游的公司。不过,虽然公司和产品很多,但效果也不一样,区别就在于,他们能不能掌握好这款游…...

浅谈C++函数重载

C相较于C语言来说,重载是一重大特性,让我们一起简单的回顾一下重载那些事 传送门函数重载是什么为什么有函数重载函数重载是如何实现的总结函数重载是什么 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能相似的同名函数 这些同名函数的形参列表(参数个数or类…...

数据分析spss应急考试

数据分析spss应急考试 前言 单项选择 15(项)*2(分)30 判断题 10*1 10 计算题 2*10 案例分析题目(考实验内容) 总四十分,分值不等 老师重点强调了回归分析因子分析方差分析参数、非参数检验 2独立样本的非参数检验应该用什么方法多独立样本…...

Handler postDelayed的实现原理

Handler postDelayed的实现原理 问题描述 Handler.postDelayed()的原理是如何保证延时执行的? 扩展:这样实现的好处是什么? 题目分析 猜测一下 以我们对Handler的了解,内部使用了Looper对消息队列进行循环获取执行&#xff0…...

【数据结构】平衡二叉树

目录 一、平衡二叉树的介绍 二、平衡二叉树的插入 1、平衡二叉树的插入步骤 2、平衡二叉树的旋转 2.1左单旋 2.2右单旋 2.3左右双旋 2.4右左双旋 三、平衡二叉树的删除(略) 四、个人对平衡二叉树见解 五、平衡二叉树整体代码 一、平衡二叉树的…...

Minecraft服务端配置

✨✨前言 ✨✨ 我的世界大家肯定都不陌生,在网易拿下中国区的代理后,很多小伙伴也是都转向了网易版我的世界,网易版我的世界可以说已经做是的十分全面了,使用起来也十分方便,一部分小伙伴也是看重了网易庞大的玩家数量…...

yunUI组件库解析:图片上传与排序组件yImgPro

yunUI是笔者开源的微信小程序功能库。目前其中包含了一些复杂的功能组件。方便使用。未来它将分为组件、样式、js三者合为一体,但分别提供。 本文所用代码皆来源于组件库中的yImgPro组件。详细代码可至github查看。地址: yunUI 。 npm地址:yu…...

Java基础:回调函数

因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助. 回调函数的作用其实就是将需要这个功能的调…...

Springboot多环境配置

此文章是根据黑马程序员课程所做的笔记课程视频 多环境开发 ​ 什么是多环境?其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样,这就是多环境。常见的多环境开发主要兼顾3种环境设置,开发环境——自己用的…...

Java Number Math 类,超详细整理,适合新手入门

目录 一、什么是Java Number类? 二、Java Number类提供了哪些基本的数字操作? 三、什么是包装类? 所有的包装类都是抽象类 Number 的子类。 四、什么是Java Math 类 Test类案例:(Math.PI 表示一个圆的周长与直径…...

俯瞰·明统系列·落霞与孤鹜齐飞、南征与北伐并举

尽江南百万兵,腰间宝剑血尤腥。 引言 元至正二十七年(1367年)四月,吴王朱元璋命中书右丞相徐达为征虏大将军、平章常遇春为副将军,率军25万由淮入河、北进中原(第一次北伐)。北伐中发布告北方官…...

Nodejs环境搭建和配置

Nodejs环境的搭建和配置 1、下载 官网:http://nodejs.cn/download/,选择windows64位 msi文件 2、安装和配置环境 双击安装之后,配置环境变量: ①系统变量那边创建NODE_PATH变量,值为nodejs文件夹的node_modules文…...

MybatisPlus------条件构造器Wrapper以及QueryWrapper用法(七)

MybatisPlus------条件构造器Wapper(七) Wrapper:条件构造器抽象类,最顶端父类 AbstarctWrapper:用于查询条件封装,生成sql的where条件。 QueryWrapper:查询条件封装(可以用于查询、删除&#x…...

NetSuite Intercompany Framework 101

今朝,谈一谈Intercompany Framework,这是一个彰显NetSuite市场野心的基础功能框架。从20.2开始逐渐浮出水面,虽然经过过往的几个版本,不断推出组成功能,但目前仍然未见其全貌。 作为顾问,你必须关注它&…...

限时活动|凭徽章领披萨大奖,玩转Moonbeam治理论坛

动动手指,无需每天打卡,用刷手机的零碎时间领一份Web3惊喜! 本次挑战的目标是鼓励大家参与社区治理、熟悉论坛操作。有关参与方式和原因的信息在Twitter上共享:有兴趣可以和ThinkWildCrypto一起探索论坛以解锁其功能、了解最近和正…...

Golang中struct{}和struct{}{}的区别你知道吗?

首先说下Golang中的结构体,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,Golang中使用关键字struct来创建一个结构体,语法如下:typeStudentstruct { Name string }下面定义一个Student结构体,例如&am…...

网络安全-信息收集- 谷歌浏览器插件收集信息,谷歌hacking搜索语法-带你玩不一样的搜索引擎

网络安全-信息收集- 谷歌浏览器插件收集信息,谷歌hacking搜索语法-带你玩不一样的搜索引擎 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 …...

基础篇—一文掌握css的边框属性

CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 1、边框样式 边框样式属性指定要显示什么样的边界。 border-style属性用来定义边框的样式 2、边框宽度 您可以通过 border-width 属性为边框指定宽度。 为边框指定宽度有两种方法:可以指定长度值,比如 2px…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...