Go实现23种设计模式—模版方法模式
一 类别 行为型模式
二 概述 定义一个操作的基本框架,框架中的方法有基本方法和模版方法。模版方法是对基本方法的组装与调用,从而完成固定的逻辑,基本方法是其他子类对接口实现的重载,从而使用相同的模版,产生不同的结果。
三 使用场景 A. 多个子类有共有的方法,并且逻辑基本相同;
B. 很多依赖与某一核心算法,可以将该算法设为模版算法;
C. 重构中对于重复业务逻辑的代码通过设置模版方法如钩子函数、装饰器进行设计;
四 优点 A. 将共有的部分进行封装、减少代码的重复性,以便于系统的高可维护性。
B. 基本方法的实现延迟到子类进行具体实现,控制的行为由父类约束。
五 实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667package Templateimport ...
Go实现23种设计模式—门面模式(外观模式)
一 类别 门面模式又叫外观模式,是一种常用的封装模式
二 概述 给一系列具有关联性的子系统的集合提供对外访问的一组接口,调用者不用明确内部具体的业务逻辑,只需要调用这组接口达到目的即可。也就是要求子系统外部与内部不能直接进行通讯,必须通过一个统一的对象进行,而这个统一的对象就是门面。门面模式通过只提供高层次的接口,从而降低了外部与子系统调用的复杂性。
三 关系 门面角色: 了解子系统内部的全部业务逻辑与实现。
子系统角色: 被门面角色的实现对象所调用,等价于外界的客户端。
Client角色: 只需要传入相对应的签名,调用相关方法,就能得到目标结果。
子系统内部: 在实现Clinet调用方业务需求的同时,可以对具体业务进行功能拓展,对外不变,对内多变,增加额外的功能,比如说检验等。
四 门面模式的优点 A. 减少了系统的相互依赖性;在我看来通过门面的代理,直接切断了调用方与各个子系统内部的调用关系,降低了双方的耦合关系,从而降低了系统混乱、依赖。直接将两者的依赖关系转移到 ...
go应用性能分析工具
一 Go性能调优 Go语言的性能主要是体现在四个方面:
A. CPU profile :报告cpu的使用情况,使用一定频率采集程序在cpu和寄存器上的数据;
B. 内存 profile(heap profile):报告程序内存使用情况;
C. Block profiling: 报告goroutine阻塞,不再运行的情况;用来查找和分析死锁;
D. Groutine profling: 报告goroutine的使用情况,区分调用关系;
常用工具:
runtime/pprof:采集工具型应用的数据;
net/http/pprof:采集服务型应用运行数据信息;
二 工具型应用性能分析(runtime/pprof)A. CPU分析1234567891011import ( "runtime/pprof")f, err := os.Create("./cpu.pprof")err = p ...
Go可选参数的优雅使用技巧
前言 在Go语言中,是不支持类似Python的可选参数,在函数进行参数拓展或者配置参数的默认参数就比较麻烦。如果使用不当,会在将来接口拓展中造成很大的影响。
主要影响:
破坏兼容性
直接在函数定义处,添加拓展参数,会导致所以调用处都要进行修改,破坏了代码的完整性,因为有的逻辑中可能不需要该参数。
不破坏兼容性,重新添加一个新的初始化的函数,随着参数添加的越来越多,初始化函数越来越多,非常冗余。
因此使用可选参数配置的方式进行初始化和默认参数的设置就优雅的解决了参数拓展带来的一系列问题。
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778package mainimport "fmt"// 本文是实现可选参数的最佳实现// 对于函数的可选参数和默认参数配置,通常要在不影响不破坏现 ...
chapter-1 gRPC的概述与发展
一 gRPC概述 gRPC (the “g” stands for something different in every gRPC release) is an inter-process communication technology that allows you to connect, invoke, operate, and debug distributed heterogeneous applications as easily as making a local function call.
gRPC 是一个高性能、开源、通用的RPC框架,是一种进程间通讯技术,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来就像调用本地程序一样,轻松的实现远端服务的连接、调用、操作和调试,很容易去构建分布式应用和服务 ...
时序数据库-InfluxDB-1-基础概念与简单实用
一、什么是InfluxDB InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
当前最新稳定版本InfluxDB v2.0
二、InfluxDB基础概念2.1 database(数据库) 同SQL中的database
123456> show databasesname: databasesname----telegraf_internal
2.2 measurement(表) 同SQL中的table
1234567891011121314151617181920212223242526272829> use telegrafUsing database telegraf> show measurementsname: measurementsname----cpudockerdocker_container_blkiodocker_container_cpud ...
protobuf协议与go的转换
protoc的安装
查看版本
1brew search protobuf
安装指定版本
1brew reinstall protobuf@3.1
查看protobuf版本
1protoc --version
plugin插件的安装
123456789101112go get https://github.com/golang/protobuf直接安装,应该会失败;采用github上的包进行代替安装方法如下:git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpcgit clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/netgit clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/textgit clone https://github.com/golang/sys.git $GOPATH/s ...
kratos创建新项目架构
下载
1git clone https://github.com/go-kratos/kratos.git
安装
123切换至目录:/cmd/kratos先安装相关依赖: go mod download执行: go install
配置
12将安装好的应用复制到用户应用程序目录下:cp $GOPATH/bin/kratos /usr/local/bin
初始化项目
在任意地方就可以使用命令进行创建项目:
执行: kraots new fsu
项目结构
12cd fsutree
123456789101112131415161718192021222324.├── LICENSE├── Makefile├── README.md├── api│ ├── README.md│ └── helloworld│ ├── helloworld.pb.go│ ├── helloworld.proto│ ├── helloworld_grpc.pb.go│ └── helloworld_http.pb.go├── cmd│ └── s ...
Golang的垃圾回收与三色标记法
关键词: 垃圾回收 内存管理 自动释放 三色标记 STW
一 STW STW就是Stop the world的缩写或者Start the world的缩写。指从stop到start这两个动作直接的时间间隔,即万物都静止。
STW在垃圾回收过程中保证了实现的正确性、防止了在垃圾回收过程中内存的无限增长等问题,从而停止赋值器对操作对象图的操作过程。
STW的时间会影响系统的性能,在这个过程中,用户的代码被停止运行和放缓运行。STW越长,对用户代码造成的影响越大(延迟)。
在Go1.14之前,没有异步抢占。for {} 这样的goroutine进不去STW阶段,就会造成卡机等现象。Go 1.14 之后,这类 goroutine 能够被异步地抢占,从而使得进入 STW 的时间不会超过抢占信号触发的周期,程序也不会因为仅仅等待一个 goroutine 的停止而停顿在进入 STW 之前的操作上。
二 标记-清除(-Go1.3)
标记(Mark phase)
暂停程序的业务逻辑;
从程序根节点开始遍历所有对象,并标记可达对象;
...
(3)Redis延时队列
redis消息队列不是专业的消息队列,没有非常多的高级特性,没有ack保证,适合用于对消息没有很高的可靠性要求的场景。
1.list实现异步消息队列 使用rpush和lpush实现消息入队列。rpop和lpop实现消息出队列。
2.阻塞读:防止队列空时无限循环 如果队列空了,客户端会陷入pop的死循环中,会拉高客户端CPU的消耗,也会是redis的QPS拉高,如果这样的客户端有几十个,redis的慢查询可能也会增多。
QPS:每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
a.sleep使读操作慢下来 使用sleep,当队列为空时,让线程sleep一会。可以让客户端的CPU消耗降下来,Redis的QPS也能降下来。
b.阻塞读(brpop,blpop) 使用睡眠会导致消息的延时增大。如果只有一个消费者,那么延时就是1秒。如果有多个消费者,这个延迟会降低,因为每个消费者的睡眠时间的叉开的。
...



