软件架构的演进 1、软件架构的发展软件架构的发展经历了从 单体架构、垂直架构、SOA 架构到微服务架构的过程。 1.1、单体架构Web 应用程序发展的早期,大部分 web 工程师将所有的功能模块打包到一起并放在一个 web 容器中运行,所有功能模块使用同一个数据库。 下图是一个单体架构的电商系统: 优点: 项目架构简单,前期开发成本低,周期短。小型项目的首选。 开发效率高,无须考虑跨语言,模块之间交互采用本地 2023-02-01 architecture #architecture
04.log标准库 log标准库golang内置了log包,实现简单的日志服务。通过调用log包的函数,可以实现简单的日志打印功能。 log包定义了Logger类型,该类型提供了一些格式化输出的方法。 log包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|P 2023-01-22 go > go标准库
05.errors标准库 errors标准库errors包实现了操作错误的函数。go语言使用error类型来返回函数执行过程中遇到的错误,如果返回的error值为nil,则表示未遇到错误,否则error会返回一个字符串,用于说明遇到了什么错误。 123type error interface { Error() string} error不一定表示一个错误,它可以表示任何信息,比如io包中就用e 2023-01-22 go > go标准库
06.bytes标准库 bytes标准库bytes包提供了对字节切片进行读写操作的一系列函数,字节切片处理的函数比较多分为基本处理函数、比较函数、后缀检查函数、索引函数、分割函数、大小写处理函数和子切片处理函数等。 1. 常用函数1.1 转换 函数 说明 func ToUpper(s []byte) []byte 将 s 中的所有字符修改为大写格式返回。 func ToLower(s []byte) []b 2023-01-22 go > go标准库
07.io标准库 io标准库io包中提供I/O原始操作的一系列接口。它主要包装了一些已有的实现,如 os 包中的那些,并将这些抽象成为实用性的功能和一些其他相关的接口。 1. 错误变量 var EOF = errors.New(“EOF”)正常输入结束Read返回EOF,如果在一个结构化数据流中EOF在不期望的位置出现了,则应返回错误ErrUnexpectedEOF或者其它给出更多细节的错误。 var 2023-01-22 go > go标准库
08.ioutil标准库 ioutil标准库ioutil包封装了一些I/O实用程序函数。 函数 说明 ReadAll 读取数据,返回读到的字节slice ReadDir 读取一个目录,返回目录入口数组[]os.FileInfo ReadFile 读取一个文件,返回读到的文件内容字节slice WriteFile 根据文件路径,写入字节slice TempDir 在一个目录中创建指定前缀 2023-01-22 go > go标准库
09.bufio标准库 bufio标准库bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。 1. bufio包原理io操作本身的效率并不低,低的是频繁的访问本地磁盘的文件。所以bufio就提供了缓冲区(分配一块内存),读和写都先在缓冲区中,最后再读写文件,来降低访问本地磁盘的次数,从 2023-01-22 go > go标准库
10.builtin标准库 builtin标准库builtin包提供了一些类型声明、变量和常量声明,还有一些便利函数,这个包不需要导入,这些变量和函数就可以直接使用 1. 常用函数1.1 append1func append(slice []Type, elems ...Type) []Type slice = append(slice, elem1, elem2) 直接在slice后面添加单个元素,添加元素类 2023-01-22 go > go标准库
12.sort标准库 sort标准库sort包提供了排序切片和用户自定义数据集以及相关功能的函数。 sort包主要针对[]int、[]float64、[]string、以及其他自定义切片的排序。 主要包括: 对基本数据类型切片的排序支持。 基本数据元素查找。 判断基本数据类型切片是否已经排好序。 对排好序的数据集合逆序 1. 排序接口1234567type Interface interface { 2023-01-22 go > go标准库
13.math标准库 math标准库math包包含一些常量和一些有用的数学计算函数,例如:三角函数、随机数、绝对值、平方等 1. 常量12345678910111213141516fmt.Printf("Float64的最大值: %.f\n", math.MaxFloat64)fmt.Printf("Float64最小值: %.f\n", math.SmallestNonzeroFloat64)fmt.Printf(" 2023-01-22 go > go标准库
14.flag标准库 flag标准库Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 1. os.Args如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 123456789func main() { // 获取命令行参数 // os.Args:[]string if len(os.Args) > 0 { 2023-01-22 go > go标准库
15.runtime标准库 runtime标准库runtime包提供和go运行时环境的互操作,如控制goroutine的函数。 它也包括用于reflect包的低层次类型信息。 1. 环境变量 环境变量GOGC设置最初的垃圾收集目标百分比。当新申请的数据和前次垃圾收集剩下的存活数据的比率达到该百分比时,就会触发垃圾收集。默认GOGC=100。设置GOGC=off 会完全关闭垃圾收集。runtime/debu 2023-01-22 go > go标准库
16.context标准库 context标准库context 翻译成中文是 上下文 的意思,它可以对 API 和进程之间传递截止日期、取消信号和其他请求范围的值。 使用上下文的程序应遵循以下规则: 保持包之间的接口一致 不要在结构类型中存储上下文 上下文应该是第一个参数,通常命名为ctx 上下文值仅用于传输进程和API的请求范围数据,而不用于向函数传递可选参数 context 是 Golang 开发常用的并发编程技术。 2023-01-22 go > go标准库
BASE 理论 BASE 理论是由 eBay 架构师提出的,它是对大规模分布式系统实践的总结,BASE 理论是对 CAP 理论的延伸,其核心思想是即使无法做到强一致性(CAP 的一致性是强一致性),但应用可以采用适当的方式来使系统达到 最终一致性。是CP(强一致性)和AP(强可用性)权衡的结果。 BASE 理论是基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eve 2022-12-01 分布式 #分布式
CAP 理论 项目起初都是单体应用,随着业务扩展,流量越来越大,单体扛不住高并发,分布式将业务拆分成子业务部署到不同的机器上,不同的机器节点通过网络进行通信,协作服务。分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。 分布式系统的最大难点,就是各个节点的状态如何保持一致。CAP理论是分布式的理论基础。 分布式系统必须要考虑网络分区的问题:有网络,就会有网络交互的问题 2022-12-01 分布式 #分布式
分布式事务解决方案 分布式事务分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务组合而成。 对于分布式事务而言几乎满足不了 ACID,其实对于单机事务而言大部分情况下也没有满足 ACID,不然怎么会有四种隔离级别呢?所以更别说分布在不同数据库或者不同应用上的分布式事务了。 分布式事务有几种解决方案: 2PC(Two-phase commit protocol、二阶段提交) 3PC TCC(Try 2022-12-01 分布式 #分布式
幂等 定义幂等概念来自数学,表示对数据源做 N 次变换和 1 次变换的结果是相同的。 在互联网项目中幂等性用来表示用户对同一操作发起的一次请求或者多次请求的结果是一致的。 要求幂等的场景 前端重复提交:用户快速重复点击多次,造成后端生成多个内容重复的数据。 接口超时重试:对于给第三方调用的接口,为了防止网络抖动或其他原因造成请求丢失,这样的接口一般都会设计成超时重试多次。HTTP,RPC 等在超时的情 2022-12-01 分布式 #分布式
强一致性 弱一致性 最终一致性 最近在看zookeeper视频,提到了zookeeper的数据提交是最终一致性。leader和超过一半的follow提交成功后才会返回成功。 这种方式在ES等分布式系统中也有体现,可以设置主Shard提交即返回成功,或者需要Replica Shard提交成功再返回。 提到分布式架构就一定绕不开“一致性”问题,而“一致性”其实又包含了数据一致性和事务一致性两种情况,本文主要讨论数据一致性(事务一致性 2022-12-01 分布式 #分布式
JMeter 入门使用 JMeterApache JMeter 是 Apache 组织基于 Java 开发的压力测试工具。体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为 JMeter 是 Java 开发的,所以运行的时候必须先要安装 jdk。JMeter 是免安装的,拿到安装包之后直接解压就可以使用,同时它在 linux/windows/macos 上都可以使用。安装包也 2022-03-08 test #test
线程组参数解释 Number of Threads(users) | 线程数线程数,相当于模拟的用户数量 Ramp-up Period(in seconds) | Ramp-up 时间(秒) 该参数决定多长时间启动所有线程。如果使用10个线程,ramp-up period=100秒,那么JMeter用100秒使所有10个线程启动并运行。每个线程会在上一个线程启动后10秒(100/10)启动。Ramp-u 2022-03-08 test #test