golang高性能服务器编程
小步快跑的形式介绍golang服务器开发的基础细节。
唐墨123
我的生涯一片无悔,我想起那天夕阳下的奔跑,那是我逝去的青春。
展开
-
《一个电子工程师的12年》
redis、mysql、sqlite、kafka、zeromq、mongodb、http/https、rest api、mqtt、thread pool、go routine等等,陷入了复杂重复的循环中,中间,我见过形形色色的人,有的很傻,有的很自私,有的很狭隘,有的很极端,有的很要面子,有的很无耻,有的很卑鄙,有的人能当着你的面出尔反尔,这些人的所作所为有适合能惊掉你的下巴……2012年专科毕业,单片机没有学会,keil也不熟悉,protel 99se不熟悉,烙铁不熟悉,就突然毕业了。原创 2024-02-29 00:06:40 · 103 阅读 · 0 评论 -
lvgl 8 多style属性设置
全部修改一个小部件的属性,大概最多需要调用64 *111 次api, 其中111 个api,设置64个不同的参数和值。当时实际开发时很少有人这么干,默认的属性占到一大半,一小半属性才需要额外设置(例如坐标、颜色、图片、透明度、渐变色、边框、轮廓、pad填充等常规属性需要额外修改)。一个object对应的style最多有2^6(64)个,每个style有最多111个属性值。而lvgl 8中,每一个part(一个控件最多8个part)的每一个状态(最多有9个状态)的属性,都需要有一个单独的style 变量。原创 2022-10-16 18:39:43 · 1255 阅读 · 0 评论 -
lv_meter
lvgl8开始,gauge和line_meter被移除,新增lv_meter实现仪表盘功能。原创 2022-10-05 12:58:10 · 1885 阅读 · 0 评论 -
git 常用命令集合
分支创建:git branch jack_tool切换到新创建分支:git checkout jack_tool删除分支:#查看分支:root@ubuntu:~/go/src/github.com/lotus# git branch jack_tool master testing tmproot@ubuntu:~/go/src/github.com/lotus# g#删除远程分支:root@ubuntu:~/go/src/github.com/lotus# git原创 2021-04-28 18:04:14 · 141 阅读 · 0 评论 -
开源IM软件----rabbit
开源聊天软件原创 2022-06-02 11:02:29 · 2029 阅读 · 1 评论 -
《k3s 源码解析7 ---- k3s agent启动流程》
k3s agent 启动流程:1)解析配置文件作为参数、可被cli指定的参数覆盖2)创建tunnel隧道服务(也就是正向代理服务器)(代理服务器除了负载均衡作用,更重要的是提供稳定的网络连接:用长连接保活、用短连接提供业务。这样可以避免网络抖动对业务的干扰/破坏)3)加载linux kernel module,通过exec.Command(),执行命令行:modprobe --overlay|–nf_conntrack|–br_netfilter|–iptable_nat|ip6table_na.原创 2022-05-29 02:21:16 · 782 阅读 · 0 评论 -
从零实现文件加密、解密(基础原理演示)
有一个做底端嵌入式的朋友请求帮忙做一个加密、解密的功能。 蓝牙一个广播包是32byte,因此不可能用rsa等加密算法。这里用异或进行加密原理:1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0上代码:#include <stdio.h>#include <stdlib.h>#include <string.h>// 密钥const unsigned char PUB[32] = { 0x01, 0.原创 2022-05-10 10:50:16 · 1404 阅读 · 0 评论 -
golang slice去重
以前去面试,某个面试题目如下:数据类型如下:type ele struct { id int lastTime time.Time}请编写函数,对Id重复的元素,只保留lastTime最新的元素。分析:先排序后去重速度会比盲目去重要快,按照id排序后需求去重的数据比较集中,比按照时间戳排序要快。 方案如下:按照id排序在排序后的slice上面放置窗口滑动块,窗口的范围是:id连续相同的元素func RemoveDuplicates(islice []ele, dna int) []原创 2022-04-29 10:12:23 · 1606 阅读 · 0 评论 -
golang 1.8泛型测试
golang 目前最新版本是1.8.1, 泛型功能测试一把。golang.org 官方例子 main.go内容如下:package mainimport ( "fmt")type Number interface { int64 | float64}func main() { // Initialize a map for the integer values ints := map[string]int64{ "first": 34, "second": 12,.原创 2022-04-19 22:09:12 · 1923 阅读 · 0 评论 -
基于linux cli( 命令行) 的翻译工具推荐
推荐2个cli翻译工具:1 有道出品的:fy2 谷歌翻译:trans从易用性上来说,fy cli比较美观好用,支持彩色。 从功能上来说,trans支持的语言更多,更强大。fy安装使用:0) 安装apt install fy -y1) 汉译英root@jack-VirtualBox:~/translate-shell# fy 你好吗/var/lib/gems/2.7.0/gems/fy-1.0.1/lib/fy/fanyi.rb:17: warning: URI.escape i原创 2022-04-05 19:10:17 · 5697 阅读 · 0 评论 -
如何扩大ubuntu的ubuntu--vg-ubuntu--lv空间
在使用virtualbox安装ubuntu时,默认被选中了lvm安装根分区,且根分区比较小。因此磁盘不够用。扩大ubuntu的ubuntu–vg-ubuntu–lv空间1 查看根分区空间:root@jack:~# df -hFilesystem Size Used Avail Use% Mounted onudev 948M 0 948M 0% /devtmpfs .原创 2022-03-12 14:11:32 · 6608 阅读 · 3 评论 -
helm部署ingress nginx controller
helm是用于ingress nginx controller部署的一个客户端工具,有专用的服务站点和资源仓库。helm官方网站链接一、仓库添加:1 )Add Repository (stable)$ helm repo add nginx-stable https://helm.nginx.com/stable$ helm repo updateAdd Repository (experimental)$ helm repo add nginx-edge https://helm.ng.原创 2022-02-08 00:17:09 · 1614 阅读 · 0 评论 -
golang 编译错误:unknown revision xxx
go mod处理第三方依赖包时出现unknown revision xxx错误。原因:github上面的一些开源组件,用的git版本是最新的版本。 而编辑机的git版本比较旧,有的git命令没有,导致下载失败。解决方法:升级git到最新版本(目前是2.35.1)。sudo apt update # 更新源sudo apt install software-properties-common # 安装 PPA 需要的依赖sudo add-apt-repository ppa:git-core/pp原创 2022-01-31 22:34:48 · 4316 阅读 · 0 评论 -
golang 网络心跳包设置
socket 心跳:import ( "log" "net" "time" "github.com/felixge/tcpkeepalive")func main() { addr := "0.0.0.0:8080" tcpAddr, err := net.ResolveTCPAddr("tcp", addr) if err != nil { log.Fatalf("net.ResovleTCPAddr fail:%s", addr) } listener, err原创 2022-01-31 15:32:57 · 966 阅读 · 0 评论 -
k8s deployment部署、更新
nginx.yaml:apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx原创 2022-01-24 00:48:44 · 4426 阅读 · 0 评论 -
k8s yaml资源清单格式
k8s由于资源比较多,组合起来参数众多,不适合用cli传参的形式。 因此用yaml文件的形式传参给k8s。 yaml文件相当于剧本,运维人员相当于制片人,k8s相当于导演,docker相当于剧务、pod详单于演员资源清单格式:apiVersion: # 可以通过cli获取:kubectl api-resources |grep [deployments|svc|pods]kind: Deployment # 资源类型:Deployment|Pods|Ingress|Services|....原创 2022-01-18 00:09:58 · 1461 阅读 · 0 评论 -
yaml 编码格式简述
在linux服务器中,基础的组件:节点发现(etcd)、负载均衡、数据编解码、压缩、主题订阅、数据持久化。其中数据编解码常用的有xml、json、yaml、protobuf、cbor。常用的数据编解码格式:xml是以标签为中心的数据编码结构json是以弱标签为中心的数据编码结构yaml是以弱数据为中心的数据编码结构protobuf是以强数据为中心的数据编码结果cbor是超强数据为中心的数据编码结构本文讲其中的yaml结构。基本语法:缩进时不允许使用tab键,只允许使用空格缩进的.原创 2022-01-17 23:52:12 · 1164 阅读 · 0 评论 -
k8s yaml 文件中的api版本如何选择?
在创建不同的资源时,发现yaml文件用到的api版本不一样。 本文主要讲如何api版本的选择。在你的k8s集群执行命令,查看你的k8s 提供的api 和版本信息,输出列格式:NAME 资源名称SHORTNAMES 资源名称简写NAMESPACED 是否需要指定命名空间APIGROUP => apiVersionKIND 资源类型VERBS 可用的方法[root@k8s-master ~]# kubectl api-resources -o wideNAME .原创 2022-01-09 13:16:22 · 989 阅读 · 1 评论 -
centos8.5 搭建k8s--1.23.1集群
1、kubernetes安装介绍1.1 K8S架构图在这里插入图片描述master节点用于管理整个k8s集群slave节点用于运行容器1.2 K8S搭建安装示意图3种网络类型:host机网络,master用于管理k8s集群pod网络,pod之间互相调用service网络,对外提供服务1.3 节点设置:1 节点资源:节点ip节点角色192.168.1.101k8s-master192.168.1.102k8s-node1192.168.1原创 2021-12-19 17:44:53 · 161 阅读 · 0 评论 -
论 rdma 的实现原理
最近业务需要,接触到ceph相关的技术。 Rdma是ceph里面的一个概念。 以下分析是纯粹个人根据经验进行理解,具体原理最好是看librdma的代码。功能:在大文件拷贝时,dma控制器接管cpu对拷贝过程的控制,减少数据从用户空间到内核空间的层级,拷贝完成后异步的方式通知cpu。效果:显著降低高负荷时,cpu性能下降,数据拷贝延迟问题。应用范围:ceph,filecoin挖矿扇区转移。以及其他需要夸节点拷贝大量数据的业务场景。如果我去从0实现一个rdma方案,应该是如.原创 2021-11-29 17:33:03 · 639 阅读 · 0 评论 -
什么,cp命令不是很好用? 用golang实现一个---带黑白过滤器的----系统文件拷贝工具
设计目标:在大型项目中,会生成比较多的中间文件,例如.o, *.so, *.a, .pbg,.pdf, *.mp4等类型的文件, 在用tar打包或cp到其它路劲时,指向拷贝某一些种类型的文件。 本文就是实现这个功能。 磨刀不误砍柴工,看哪里不爽就去改造它。首先看下cp的命令:root@jack-VirtualBox:~/ll/copy_source_code_tools# cp --helpUsage: cp [OPTION]... [-T] SOURCE DEST or: cp [OPT.原创 2021-11-26 18:41:37 · 514 阅读 · 0 评论 -
lotus-miner扇区销毁、提币
当扇区出现错误,由于一些不可抗力无法恢复(如硬盘损坏、备份丢失等),那么区块浏览器就总会显示有几个错误扇区,影响了存储提供者形象,便要及时终止错误扇区。或是连续14天windowpost证明错误会自动终止扇区。终止扇区的操作如下:一、终止错误的扇区0. 编译lotus-shed# cd lotus/# env RUSTFLAGS="-C target-cpu=native -g" FFI_BUILD_FROM_SOURCE=1 make lotus-shed# cp lotus-shed /.原创 2021-11-16 18:15:48 · 2265 阅读 · 0 评论 -
golang注入框架fx的原理浅谈
uber的fx依赖注入框架:fx能干啥? 下面睁大氪金x眼:没有依赖注入框架时写代码:直白一点的例子:func1()依赖A模块(假设是DB模块),A依赖B模块(假设是网络模块),B依赖C模块(假设是日志模块),如果没有注入框架的话,程序员需要用代码去确保:先启动C模块,再启动B模块,再启动A模块,再启动func1。 如果函数组件 和 依赖的模块数量比较庞大的话,就很恶心人了。每次修改一点点与模块相关的代码,你都可能不得不再用大量的时间去调整启动顺序。 贼恶心!!!!!!因此依赖注入原创 2021-11-02 18:58:12 · 2340 阅读 · 4 评论 -
试问,如何设计一个高并发的golang日志库
golang中有很多优秀的日志库,例如zerolog,see-log,blog4go等。 这些日志首先具备强大的高并发能力,其次具备丰富的接口,输入格式,索引接口。 把外壳去掉,日志库的设计原理本质上是一样的。package mainimport ( "context" "fmt" "io" "os" "sync" "time")var ( colorOff = []byte("\033[0m") colorRed = []byte("\033[0;31m").原创 2021-10-29 18:47:30 · 1082 阅读 · 0 评论 -
shell测试工具框架
#!/bin/bashfunction usage(){ echo "NAME:" echo " "$0 echo "" echo "USAGE:" echo " "$0" [command options] [arguments...]" echo "" echo "Author:jack" echo "VERSION:" echo " v0.0.1"原创 2021-10-27 18:55:51 · 6897 阅读 · 0 评论 -
golang调度、内存管理、反射原理、代码/编译器/cpu之间的关系
golang调度原理golang的携程,在linux线程之上实现了一个私有的调度系统,比线程池更强大,我们分析一下GMP:golang内存管理内存碎片化问题的出现,根本原因是因为内存管理粒度过大。例如一块豆腐,如果你切成片去分配,有的人需要的块比较大,有的比较小,就会出现浪费。 再例如ipv4的分配机制,就是因为粒度过大,造成有的很饱,有的很饿。 解决办法是用Ipv6,ipv6的特点是编码更多、粒度更小。c/c++的内容布局内存碎片如何产生?golang的内存管理机制:..原创 2021-10-27 17:44:11 · 185 阅读 · 0 评论 -
golang 开发环境(ide)比较
大部分的golang ide我都用过一段时间,因此可以比较一下。LiteIDE 是用qt写的一款开源ide,因为是开源所以比较灵活,后续一定会发扬光大有可能超越vscode。现阶段适合初级选手。goland 商业级ide工具,跳转,搜索,编译,调试,插件,主题都比较全,而且运行速度极快(通过预先在内存中解析tags来实现快速索引),不足之处是耗内存和cpu,需要收费。 破解版经常失效会让你重新破解(1个月内弹出来几次是正常的,很烦人)。vscode 与goland几乎一样好用,各种插件,主题等.原创 2021-09-12 11:55:31 · 7456 阅读 · 0 评论 -
从linux服务器开发的角度---->分析嵌入式蓝牙应用的开发流程
随着蓝牙5.0的发布和5G的普及,物联网兴起的趋势不可阻挡。 作为终端类产品,除了具备AI思考能力,还需要网络连接能力,由于布线比较复杂,施工成本高,我认为越来越多的应用将会基于无线射频技术,接入物联网。 世界在变化,有可能突然物联网就火爆全球了,作为程序员永远都要确保技术至少要跟得上,哪怕是勉强呢。 因此,我决定降维打击一把,去分析一下蓝牙设备的开发流程:推广,假如我想做一款智能手机自己用,咋整? 靠,是不是很难??? 淡定,万丈高楼平地起,终究还是一块块砖头垒起来的:移原创 2021-09-05 13:29:15 · 950 阅读 · 0 评论 -
我对无损压缩技术的理解
想写一个关于数据压缩算法的文章。我也懒得去看libz的代码。 我的思维方式通常是:如果我去设计一款软件,我应该怎么去设计,理论能不能行得通,理论是否是最优的解。 得到肯定后,再去比对别人的,总是惊讶的发现,跟我想的差不太多,好熟悉。这样的感觉。我想下面的截图,可以比较清晰的解释本文的主旨。...原创 2021-09-03 16:46:55 · 378 阅读 · 0 评论 -
golang反转单链表
双链表不需要反转,只需要在引用时改变头的引用位置即可。 单链表反转,有2种做法:1重构方法,将node存储在有序容器中,例如切片中,然后重新构建一条链表。2直接反转指针法,保存好Node前后索引,改变指针的指向。一般我经常用linux kernel的双链表,插入,查找,删除正向反向索引,都贼灵活,几乎不用单链表。在生产环境哪个程序员如果用单链表,可以怼死他先,用单链表的程序员这不是sb吗。不过面试有的公司会问,这时候问你什么你就答什么就好,因为这个人虽然技术可能不如你 或者 比你差很多,但是他是面原创 2021-08-05 12:46:00 · 717 阅读 · 2 评论 -
golang 左右交换int类型的所有bit
源码:root@jack-VirtualBox:~/test/zz# cat main.go package mainimport "fmt"func rint(d int64) int64 { var dd int64 for i := 0; d != int64(0); i++ { if (d & 0x01) != int64(0) { dd |= 1 << (63 - i) } d = d >> 1 } return dd}原创 2021-08-04 08:33:44 · 268 阅读 · 0 评论 -
索引二叉树
二叉树索引:root@jack-VirtualBox:~/test/tree# cat main.go package mainimport "fmt"type Node struct { Val int Left *Node Right *Node}var ss [][]stringfunc BinaryTreePath(root *Node, sss [][]string, path []string) { strv := fmt.Sprintf("%d", roo原创 2021-08-02 20:49:36 · 443 阅读 · 0 评论 -
mongodb 统一接口封装(golang版本)
Curl发送POST请求json参数curl -H "Content-Type:application/json" -X POST --data "{\"cmd-type\":5, \"filename\":\"file1.txt\", \"content\":\"file-content1234556789abcdefg\" }" http://127.0.0.1:8000/ci...原创 2019-08-19 14:54:49 · 1091 阅读 · 0 评论 -
golang 常用math函数列表
正弦函数,反正弦函数,双曲正弦,反双曲正弦:func Sin(x float64) float64func Asin(x float64) float64func Sinh(x float64) float64func Asinh(x float64) float64一次性返回sin,cos:func Sincos(x float64) (sin, cos float64)余弦函数,反余弦函数,双曲余弦,反双曲余弦:func Cos(x float64) float64func Aco原创 2021-07-29 14:30:57 · 1209 阅读 · 0 评论 -
设计一个可用于无线传输业务的 纠删码(c语言版本)
本文来源:某兄弟是搞电子信息的,公司的产品出现丢包率太高问题。使用的是rfid射频信号。据分析后,发现rfid波长太长,容易收到干扰,造成byte数据bit反转问题(例如,一根弹簧的长度被压缩或拉伸了,代表的值就不一样)。在分布式存储例如ceph,gluster,minio,hdfs中都有纠删码的使用,可以实现数据受损检测和恢复。纠删码最先出现在无线传输技术领域,被用于对讲机的音频传输中,发扬光大与互联网领域。 因此考虑使用纠删码来补救,提升rfid无线射频信号的传输正确率。 由于这3年用.原创 2021-07-29 12:23:49 · 330 阅读 · 3 评论 -
使用两级merkle tree,解决文件存储的证明问题
加密先看默克尔树:[外链图片转存失败(img-u1NlUho6-1567418914648)(https://i.loli.net/2019/09/02/sSuVJELkr13g5NI.jpg)]1.0的设计方法:假设区块链调度器,随机指定挑战d5数据块。在之前的做法是,让被挑战者生把d5数据,和其祖先路径哈希值返回给挑战者,供验证。在有限的时间内(1min)挑战者先计算 d5的数据+d5...原创 2019-09-06 15:54:28 · 599 阅读 · 0 评论 -
设计一个AOA蓝牙精准室内定位系统
有个兄弟搞嵌入式,拖笔者帮忙搞一下蓝牙芯片的AOA定位功能。酒也喝了,菜也吃了。 时间是要花的,话说笔者有8年没有搞过硬件了,稍微有点手生…… 先从分析开始,自下而上进行设计,据笔者所知,目前AOA蓝牙定位的准确度可以到10cm, 可以满足室内定位,例如机器人送餐服务、扫地机器人、停车导航等应用场景。芯片选型:先说下芯片厂家是怎么回事儿:大家都知道intel是做x86主机和服务器芯片的,高通是做soc的,也就高端手机arm芯片。海思也是做soc的,主推4k,8k硬件编解码内置h264协议电路.原创 2021-07-24 23:00:22 · 3646 阅读 · 4 评论 -
goalng 输入账号密码
在创建账号和密码时,需要隐藏字符串。源码目录:package mainimport ( "bufio" "bytes" "fmt" "os" "github.com/howeyc/gopass" "github.com/seeleteam/go-seele/common/errors")// GetPassword ask user for password interactivelyfunc GetPassword() (string, error) { fmt.Pri.原创 2021-07-23 13:07:10 · 517 阅读 · 0 评论 -
slice填充
区块链底层使用merkle tree,需要对数据([]byte)进行填充等操作。 本文封装了这些操作。源码结构:root@jack-VirtualBox:~/test/slice# tree.├── go.mod├── go.sum├── main.go├── misc│ └── util.go└── tt1 directory, 5 filesroot@jack-VirtualBox:~/test/slice#main.gopackage mainimport .原创 2021-07-23 12:11:01 · 3536 阅读 · 0 评论 -
如何设计一个完整的共享充电宝系统?
为什么有这篇文章:因为共享充电宝行业没有任何技术含量,躺着赚钱。 关键是他们可能误以为自己技术很牛逼的样子。内容包括:充电宝原理图(电路图)微信小程序架构图服务发现系统、注册服务、登录服务、mqtt连接、支付、商城、广告推送系统、monodb 集群架构用户画像(用pytorch实现)1、充电宝原理图:2、 微信小程序架构:3、服务器架构:4、用户画像:...原创 2021-07-22 20:10:00 · 2130 阅读 · 0 评论