自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(168)
  • 资源 (2)
  • 收藏
  • 关注

原创 cmake引用jansson库

在ubuntun系统上使用clion开发c程序, cmake如何引入jansson库.

2024-01-09 14:46:06 392

原创 traefik如何使用文件发现服务02

通过docker-compose.yaml引用traefik.yml, config.yml。使用docker启动traefik, traefik使用配置文件, 并且服务也使用配置文件。traefik如何使用配置文件发现服务?

2023-05-15 17:56:46 251 1

原创 traefik入门示例解析01

微服务架构产生了大量的服务, 借助etcd之类的注册中心,找服务还需要接入etcd,还是比较麻烦,有没有统一的网关入口?下面借助简单例子, 试用并理解traefik。

2023-05-15 16:41:01 735

原创 全局gin对象如何在子模块中修改Logger

gin是通过中间件写日志, 日志对象是中间件的闭包变量。在use加载中间件完成之后,无法修改日志对象。app := gin.Default()被放在了顶层模块,并且加载了默认中间件。借助zapio.Writer对象,通过修改它的Log属性实现。程序真正的log在子模块中初始化。在子模块中如何修改gin的日志?以下是设置gin日志的方法。

2022-12-11 17:22:08 406

原创 不见他过: 职场经验

什么是不见他过

2022-09-20 22:35:49 222

原创 viper监控文件变化出现两次事件

监控配置文件变化,如果内容发生了修改,需要及时加载. 使用viper监控文件变化发现了, 对文件修改一次,会出发两次事件.

2022-09-17 19:57:31 760 1

原创 tomli支持数组混合类型

使用python的toml包解析toml配置文件。配置文件中使用了混合类型数组,结果程序报错。

2022-08-05 13:54:35 908

原创 gin支持prometheus

gin使用了微服务架构, 如何将自己的服务都监控起来?

2022-08-03 15:21:45 1168

原创 wikijs使用docker安装

wikijs文档有docker-compose安装说明, 实际中会遇到几个问题

2022-07-25 11:28:47 1851

原创 golang实现枚举类型

枚举类型是一种类型, 它的值只有有限个. 换而言之, 枚举类型=一个类型+N个离散值go的实现, 可以自定义一个类型, 把它作为枚举类型, 然后使用该类型定义N个常量.

2022-07-25 10:47:54 2210

原创 goja能够做什么

goja是什么goja实现了ECMAScript 5.1(+)特性1. 完整支持ECMAScript 5.12. 测试通过了ECMAScript官方所有测试用例3. 支持任何能在babel, typescript编译器中运行任何ES54. 支持sourcemapgoja能够做什么执行js表达式func testExpression(){ //创建运行实例 vm := goja.New() //运行表达式 v, _ := vm.RunString("2 + 2") //获

2022-05-11 10:17:01 2064

原创 golang实现单例模式

golang实现单例模式go已经提供了实现单例模式的工具sync.Once示例借用sync.Once的一次性特点import ( "sync")type singleton struct {}var _instance *singletonvar _once sync.Oncefunc GetInstance() *singleton { _once.Do(func() { instance = &singleton{} }) return instanc

2022-05-06 10:17:15 389

原创 celery5.2.1以下版本任务调用多耗费1秒

5.0.5版本celery存在一个缺陷, 调用任务耗时多用1秒 这个问题在5.2.0, 5.1.2同样存在 没理解为什么到5.2.1版本才解决,甚至一度把celery排除python技术栈

2021-12-14 16:47:34 406

原创 openssh8.6默认不支持公钥ssh(gogs无法使用)

最近升级了自己的linux后, 更新gogs代码时,发现用不了了反复测试原因,发现是最新版本openssh8.6关闭了公钥登录

2021-12-02 21:46:01 982 2

原创 基于ectd实现go的服务注册

描述基于etcd实现go程序的服务注册,所看的学习资料均比较简单, 实际中要经过反复测试,自己写了一个先用着,有坑再填.需求1. 注册一个服务: 程序启动时2. 注销服务: a. 程序异常退出时, 自动注销, 有5秒TTL延迟; b. 调用Stop()接口主动注销3. 健壮性: a.ectd单节点重启, ectd本身支持; b. etcd全部重启后, 能够恢复正常4. key的格式: 前缀/ip/pid5. value: 字符串.(可以先转为json, 再转string)创建etcd客户

2021-11-27 18:40:46 552

原创 go和python解码msgpack不一致

描述有一个消息字典类型, 使用go进行编码, 传入消息中间件。同时有一个python程序监听, 监听到消息之后进行解码, 遇到了编码问题环境go使用: github.com/vmihailenco/msgpack/v5 v5.3.4python使用: msgpack==1.0.2python解码# go编码的对象是个字典,value可能包含了数组,并且数组类型复杂msgpack.unpackb(xxx)错误提示UnicodeDecodeError: 'utf-8' codec

2021-11-27 18:31:02 674

原创 golang位移操作的一个小坑

问题描述现有int16类型的整数,将它转为两个字节存放。在还原时,一不小心会就被坑。错误用法length := int(keyBytes[cursor] + keyBytes[cursor+1] <<8)正确用法keyBytes := []byte{ 16, 1}length := int(uint16(keyBytes[cursor]) + uint16(keyBytes[cursor+1]) <<8)错误原因字节byte位移时类型不会自动变化, 先要转换类型

2021-11-25 16:02:07 486

原创 nats批量publish最后一条疑似丢失

问题描述写了一个测试脚本,从数据读取一组数据,然后逐条publish到nats-server中, 确定每条都publish了有另外一个程序中subscribe订阅,在该程序发现最后一条一直没收到环境go: 1.16nats-server程序摘要发布for _, record := range records{ ... gNatsConn.Publish(Topic, record) time.Sleep(time.Second*0.1) //

2021-11-14 13:20:34 324

原创 go版本的supervisord

#%%描述python版本的supervisrod, 在linux、windows系统中离线安装都不怎么方便. 是否有go版本的呢?github地址https://github.com/ochinchina/supervisord/踩坑记录编译32版本, 有些报错, 需要修改源码在ui界面快速点击start/stop, 进程可能会启动多个。需要加锁处理处理.用法配置文件查找顺序$CWD/supervisord.conf$CWD/etc/supervisord.conf

2021-11-14 13:14:32 922

原创 influxdb遇到时间点存储不了

问题描述有一份mysql存储的历史数据,准备把它转为influxdb存储, 时间点用的是mysql表中记录的创建时间,创建时间是时许的。环境描述influxdb: 2.0.8开发语言: goinflux客户端: influxdb-client-go 2.5.0关键代码摘要使用如下代码, 创建point,发现存储不了。point := influxdb2.NewPoint("table_name", map[string]string{ ...

2021-09-23 10:47:55 278

原创 influxdb如何把point中的多个field一起查出来

问题描述influx查询包含了水平拆分、垂直拆分. 查询结果的每一条记录record,只对应一个field写入一个point时包含多个field, 查询时如何将这几个field一起查出来呢?写入示例point := influxdb2.NewPoint("history", map[string]string{ "Version": DedefaultVersion, "Name": sh.Name, "Active": fmt.Sprin

2021-08-29 14:33:47 2326

原创 golang编译-ldflags -H windowsgui被认为是病毒

介绍使用walk为程序做了一个windows界面, cmd窗口需要隐藏。使用了 go build -ldflags="-H windowsgui"结果exe程序被杀毒软件认为是病毒为什么会认为是病毒?隐藏cmd窗口, 双击exe,可以直接启动,并且看不到任何窗口。这不就是病毒的喜欢干的事吗.所以有些杀毒软件, 干脆通杀, 使用了 "-H windowsgui" 直接被认为是病毒我们这些正常的需求该咋办呢?解决办法在程序中,使用代码隐藏cmd窗口import "github.co

2021-08-26 17:18:49 2700 5

原创 influxdb的docker-compose如何配置

influxdb的docker-compose如何配置新建数据目录mkdir data-volumne生成配置文件docker run --rm influxdb:2.0.8 influxd print-config > config.ymldocker-compose配置docker-compose.yaml内容version: "2"services: influxdb: image: influxdb:2.0.8 volumes:

2021-08-26 06:21:28 1261

原创 以管理员身份运行cmd有哪几种方法

描述除了右键"以管理员身份运行",还有哪几种方法,能够以管理员身份启动cmd方式一:右键"以管理员方式运行"方式二:powershell命令Start-Process cmd -Verb runasStart-Process powershell -Verb runas方式三: 第三方工具http://code.kliu.org/misc/elevate/方式四:编程在编译程序时,设置启动时请求权限佛說大乘無量壽莊嚴清淨平等覺經pdf净土大经科注2014-doc此生必看的科学实验

2021-08-26 05:11:23 6946

原创 golang离线环境依赖包问题

问题描述在一个win10虚拟机中安装了go(go1.16.4)的开发环境, 其中有自己的项目,此时正常编译。然后将这个虚拟机放到内网,内网网络受限,不允许访问外网如果新一个依赖包,该怎么办呢?方法一: 拷贝vendor目录(推荐)在外网环境项目目录,生成vendorgo mod vendor将vendor拷贝进内网,放在内网项目目录缺点:只能当前项目使用优点:体积小类似python的pip download -r requipment.txt,将包下载后放到一个目录方法二:

2021-08-21 17:02:26 3389 4

原创 nats-server系统服务只能使用sc命令注册

起因描述windows环境下nats-server注册成系统, 官方推荐是sc命令而我觉得sc命令台太麻烦, 为什么不用github.com/kardianos/service,或者更方便的工具呢?方法一:使用nssm通过界面进行配置下载地址http://nssm.cc/download过程省略结果死活不行,由于是第三方工具,出错找不到原因,放弃方法二:通过服务外壳作为系统服务介绍使用go生成一个demo.exe,再将demo.exe注册成系统,demo.exe读取配

2021-08-19 02:38:39 378

原创 zap日志写入通道被覆盖

描述实现了一个io.Writer接口,允许zap日志写入,传递给界面,出现了日志被覆盖、重复的情况。原因io.Writer的接口Write传入的[]byte真实类型是slice。通道传递slice时,用的是引用传递,所以真实数据有被覆盖的情况示例zap初始化...out = COut()zapcore.NewCore(encoder, zapcore.AddSync(out), clevel),...自定义日志写入Channelpackage logsvar _Globa

2021-08-17 19:54:02 291

原创 msgpack代替json防止丢失类型

描述开发了一个通信协议, 协议对数据类型比较敏感, 根据不同数据数据类型使用不同格式。golang的数据类型能够满足需求。然后,讲协议转为http方式时,如果传入json,会发现数据类型不符合预期例如,本来是应该int结果是float64; 本来应该是[]byte,结果是string环境http服务器: gin开发语言: golang解决方法探寻什么传输协议会带上数据类型?json类型丢失默认情况下gin的BindJSON,可将传入的参数绑定到具体的结构体,产生类型转换。然后,我的结

2021-06-30 15:06:26 306

原创 人生枷锁之一:傲慢

问题有时会生出轻视之心,觉得某某能力不行。确实它真的能力不行,为什么会产生这种情绪?别人与我何干,应该很平淡才对。这是什么?在什么地方是否会出现?对我有多大危害?这是什么?傲慢什么地方会出现?1、熟人之间。熟悉对方,才会有分别判断,才会产生某某不行的情绪。2、能力、相貌、财富、权势、等等不平等的地方实例1、骂人、打人。傲慢是原因之一。2、刻薄、不能容人。傲慢是原因。3、怨恨,愤世嫉俗。有才能而不得志,傲慢是原因。4、嫌弃、不如意。觉得周围人不如你,必然产生嫌弃感。对我有多大危

2021-06-15 06:01:07 209 1

原创 nats的安装docker方式

描述docker-compose方式启动nats-server。nats的镜像非常小, docker-cpomse进行管理。下面是配置方式docker-compose.yaml配置version: "2"services: nats-server: #image: provide/nats-server:latest image: nats:latest volumes: - ./nats-server.conf:/nats-s

2021-06-12 11:58:42 1996

原创 go实现Event事件模型修正

描述之前文章中实现了event事件模型,实际使用中发现了几个问题并发会出现情况send先执行, 此时还没有waiter。将wait拆分成addWaiter和wait()不能使用缓冲通道。会出现send完成,wait还未收到的情况。用法修正e.Reset()waiter := e.AddWaiter()waiter := e.Wait(waiter, xxx)e.Send(xxx)事件实现package commonimport ( "context" "errors

2021-06-03 22:35:51 248

原创 rabbitmq辣眼睛的忙等

背景用golang做了一个分布式结构的系统, 消息服务器用了rabbitmq。整体是基于machinery+rabbitmq形式的分布式任务系统在做压力测试时,发现rabbitmq的cpu使用率飙升分析官方给出的解释scheduler采用了忙等,来提高消息传递性能https://www.rabbitmq.com/runtime.html#cpu其中也讲了一些方法来降低cpu使用率官方建议rabbtimq最好是装在单独的服务器,不与其它应用共用。也介绍了修改cpu使用个数

2021-05-28 07:10:49 198

原创 go实现Event事件context版

描述上一篇文章,写了go如何实现Event事件,有几个可以优化的地方.sync.Map保存结果可以不用这么复杂.改用context关闭通道更加方便Event实现package commonimport ( "context" "errors" "go.uber.org/zap" "time")func NewEvent() *Event { e := &Event{ log: zap.S(), } e.Reset() return e}type Even

2021-05-22 08:24:44 311 1

原创 go如何实现并发安全的优先级队列

描述go的如何实现优先级队列?优先级别队列是否并发安全?我的需求场景实现了一个通信协议,收发消息。发送通道会阻塞。如果拥堵时,要控制拥堵消息的优先顺序。优先级用Priority加上时间, Priority小优先, 早到优先。原理通过实现官方接口heap, 得到优先级队列使用用chan进行控制并发控制,达到并发安全的效果优先队列实现package queueimport ( "xxxx/packets" "container/heap" "time")//---

2021-05-20 19:10:34 830

原创 go实现Event事件

描述go协程之间用通道通信,如何将它改造成事件形式。需求描述以下是我的需求e := NewEvent()//协程1等待结果, 10是等待时间e.Wait(10)//协程2发送结果e.Send(xxxx)原理原理比较简单,不描述了示例package commonimport ( "go.uber.org/zap" "sync" "time")var NOT_USED interface{} = struct{}{}func NewEvent() *Event {

2021-05-16 21:08:33 2023 1

原创 golang如何正确关闭计时器

描述go的官方库计时器, 有一个陷阱,ticker.Stop()如果不注意会导致协程无法关闭。如果我们想强制中断计时,该如何做?示例:ticker.Stop()会导致协程无法结束下面示例便于理解func main(){ ticker := time.NewTicker(time.Second*10) go func(){ log.Println("go start") select{ case <-ticker.C:

2021-05-16 20:10:59 1041 1

原创 golang用通道实现串口信号量

描述串口通信,使用权该谁?需要采用信号量,进行控制。go如何实现?原理缓冲通道的缓冲大小等于资源数time计时器控制超时示例func NewPortAvailableSem()*PortAvailableSem{ ps := &PortAvailableSem{ PortChan: make(chan int, 1), } ps.PortChan <- 1 return ps}type PortAvailableSem struct{ PortCh

2021-05-15 16:07:02 240 1

原创 golang超时等待

描述go中如何实现超时等待python实现:队列超时等待queue.get(block=True, timeout=45)go实现:通道+time计时select会阻塞两个case,直到其中一个返回。如果是response,则停止计时器; 否则,就返回错误func _waitResponse(queueChan *chan int, timeout time.Duration) (int, error){ ticker := time.NewTicker(timeout) var resp

2021-05-08 11:09:51 544

原创 任务队列machinery用法

描述go实现的基于消息中间件的异步任务队列, 下面是学习笔记使用概述步骤1: 创建server,配置参数、注册task。(此处server只是个配置作用, 并不是单独的server进程)步骤2: 启动worker步骤3: 发送task与celery的用法是完全一致的创建serverfunc startServer() (*machinery.Server, error) { cnf := &config.Config{ Broker: "amqp://gue

2021-05-01 09:24:51 580 1

原创 golang如何实现静态变量的效果

说明go的结构和方法接收者, 可以模拟类的概念, 然而go不支持静态变量不能总是每次先创建一个结构体, 然后获取变量吧该如何办?如何创建"类"先展示一下,平时我是如何创建"类"的私有的结构体作为真实对象对外暴露方法,这个方法类似class可以作为参数传递,使用这个class就可以创建对象BaseVar定义对外暴露的接口定义方法的interface,方便作为参数传递type BaseVar interface { //对外暴露的接口}//方便传递typ

2021-04-24 20:40:45 6481 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除