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秒。如果有多个消费者,这个延迟会降低,因为每个消费者的睡眠时间的叉开的。
...
(2)Redis分布式锁
1.使用set和其两个扩展参数(ex,nx)实现分布式锁 可以使用setnx (set if not exists) 加锁,如果执行结束,再将锁释放掉。
123> setnx lock:task_id true··· doing task ···> del lock:task_id
但是这样会有问题,如果在执行task之间出现了异常,删除锁的操作无法执行,就会出现死锁。
于是可以在加锁的时候加上过期时间,这样即使出现异常也可以保证锁可以正常释放。
1234> setnx lock:task_id true> expire lock:task_id 5··· doing task ···> del lock:task_id
以上逻辑还会有问题,如果在setnx和expire之间服务器突然挂掉了,导致没有给锁加上过期时间,仍然会造成死锁。
这种问题的根源在于setnx和expire不是原子指令。可以使用set的扩展参数,实现setnx和expire的原子操作,从而实现分 ...
并发性能测试工具Jmeter的使用
一 Jmeter的配置与安装
Java JDK的安装
下载jdk8以上版本,包含1.8,本应用已经下载了 jdk-8u241-macosx-x64.dmg
安装java jdk
配置java的环境变量如下
123456789cd /etc/profilesudo vim profile将这几行命令添加到配置文件中,注意路径和版本一定要保持一致JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/HomePATH=$JAVA_HOME/bin:$PATH:.CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_HOMEexport PATHexport CLASSPATH
测试是否安装成功
java -version
Jmeter的安装
进入jmeter官网,下载Jmeter的安装二进制文件 https://jmeter.apache.org/download_jmeter.cgi ...
(1)Redis的基本数据结构
一、5种基础数据结构 Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过key值来获取相应的value数据。不同类型的数据结构差异在于value不同。
1.string(字符串)a.键值对 相当于字典中的key-value,支持简单的增删改查操作。
b.批量键值对 可以对多个字符串进行批量读写,节省网络耗时开销。
c.过期和set命令扩展(setex,setnx) 对key设置过期时间,超时候会自动删除,这个功能常用来控制缓存的失效时间。
setnx 如果key不存在就创建。如果key存在,就创建失败。
d.计数可以对整数的value进行自增操作。
自增取值范围:long类型的范围,-2^64~2^64
即,-9223372036854775808到9223372036854775807
超出范围,redis会报错。
2.list(列表) Redis中的列表是链表而不是数组。这代表list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为 ...
高级函数的使用细节
一 函数签名的概念 一个函数签名 (或类型签名,或方法签名) 定义了函数或方法的输入与输出。
简单的说: 函数的签名就是函数的参数列表与返回值列表的统称。使用签名可以鉴别不同函数的特征,此外,也定义了用户与函数直接交互的方法。
特别说明:
1 参数的名称和返回值的名称,不作为函数签名的一部分。换句话说,就是签名与参数的名称无关。
2 只要两个函数参数列表和返回值列表元素的顺序与类型是一致,就可以说明该两个函数是一样的函数或者说实现了同一个类型函数。
例如:
123456789101112 // 自定义函数类型type MyFuncType func(int, int) int// 实现一个和MyFuncType一样类型的函数func TestFunc (a int, b int) int { return a + b}func main() { var c MyFuncType = TestFunc d := c(1, 1) fmt.Println(d ...
解决go mod模式下本地包引用问题
使用go mod模式,进行项目源码管理,可以解决不用在Gopath下的src目录下进行项目开发。
在go mod 下,解决自定义包倒入出错问题:
1main.go:11:2: package hellogRPC/proto/hello is not in GOROOT (/Users/austsxk/Golang_dev/go/src/hellogRPC/proto/hello)
解决的方法:
在每个包下,都使用go mod进行管理,对于需要在项目本地导入的包,可以在当前包的go mod文件中:
自定义导入包的路径,如上图所示,将在server包中使用到的hellogRPC/proto/hello包就命名为此,并在require中填入相关内容,初始化版本为v0.0.0,然后使用 replace 关键词 将其取代为相对于当前文件的包的相对路径。
在server包中就可以正常导入 hellogRPC/proto/hello包
如下图所示:
计算机系统知识(一)
计算机系统基础知识
计算机系统硬件的基本组成计算机硬件由运算器、控制器、存储器、输入设备、输出设备组成;
运算器、控制器和存储器合起来为CPU;
输入设备与输出设备为外设;
存储器为记忆设备,分为外部存储器和内部存储器。
中央处理单元 负责获取程序的指令、并对指令进行编码、执行指令。
CPU功能
程序控制。CPU通过控制指令的执行来控制程序的执行顺序;
操作控制。CPU产生每条操作指令的操作信号,并将操作信号送往对应的部件,控制对应的部件按指令的功能进行操作;
时间控制。CPU对各种操作的时间进行控制,指令执行过程中操作信号的产生、持续时间、已经出现的时间顺序进行严格的控制。
数据处理。CPU对数据进行数据运算和逻辑运算,对数据加工处理,以便于处理结果被使用。
CPU组成
CPU主要是由运算器、控制器、寄存器组、内部总线等组成;
运算器
运算器由算数逻辑单元、累加寄存器、数据缓冲寄存器、状态条件寄存器组成。进行数据加工处理,用于计算机的算数计算和逻辑计算。
主要功能有两点:
执行所有的算数运算。进行加 ...