Gopherの筆記

收录了 33 篇文章 · 1 人关注

  • golang实现微信支付v3版本

    一、准备阶段获取私钥官方文档 https://kf.qq.com/faq/161222N...获取私钥证书的序列号 https://pay.weixin.qq.com/wik...openssl x509 -in 1900009191_20180326_cert.pem -noout -serial serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C私钥获取后有三个文件apiclient_key.p12 apiclient_cert.pem apicl...

  • 100行代码实现一个高性能网络转发小工具

    使用场景就不说了,可以支持任意TCP网络数据转发用 google 搜索,有很多这样的代码片段,但是作为一个小工具,都不完整,比如没有参数解析,打印都是print,而不是规范的日志,有些异常也没有处理下面通过104行代码,完成一个麻雀虽小,但是五脏六腑都齐全的小工具命令行解析对于一个命令行工具,参数解析是第一步, 也可能是用户使用你的工具交互的首选途径,不管其他参数如何,总的需要一个-v,打印下程序的版本吧golang的命令行有很多强大的第三方库, 比如cobra , kingpin 等,但是既然...

  • 一次golang程序无故频繁重启的问题

    1. 错误日志 监控日志 程序启动时会打印进程号,同时有系统signal信号捕捉程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出。 1.1不能被捕捉的信号 SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略) SIGSTOP 17,19,23 Stop 停止进程(不能被捕获、阻塞或忽略) 第一个就是我们常见的kill -9 pid 2. 排查方式 1.1 查看日志 日志中加入了捕捉信号量的程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出 // for bui...

  • Golang并发模型:轻松入门流水线FAN模式

    前一篇文章《Golang并发模型:轻松入门流水线模型》,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Golang并发,提高软件性能。但FAN模式不一定是万能,不见得能提高程序的性能,甚至还不如普通的流水线。我们先介绍下FAN模式,再看看它怎么提升性能的,它是不是万能的。 这篇文章内容略多,本来打算分几次写的,但不如一次读完爽,所以干脆还是放一篇文章了,要是时间不充足,利用好碎片时间,可以每次看1个标题的内容。 FA...

  • Golang依赖注入框架wire全攻略

    在前一阵介绍单元测试的系列文章中,曾经简单介绍过wire依赖注入框架。但当时的wire还处于alpha阶段,不过最近wire已经发布了首个beta版,API发生了一些变化,同时也承诺除非万不得已,将不会破坏API的兼容性。在前文中,介绍了一些wire的基本概况,本篇就不再重复,感兴趣的小伙伴们可以回看一下:搞定Go单元测试(四)—— 依赖注入框架(wire)。本篇将具体介绍wire的使用方法和一些最佳实践。 本篇中的代码的完整示例可以在这里找到:wire-examples Installing ...

  • Go语言使用chromedp爬虫

    title: Go语言使用chromedp爬虫 tags: Go,chromedp author: Clown95 背景 最近朋友让我帮忙爬取一个网站上面的数据,当时看到页面觉得很简单,虽然有25000多页,但是网站没有反爬虫机制,只要多开几个协程就行。 当我简单的爬取第一页之后,发现url没有page参数。好吧,查看翻页的源代码看看,javascript:__doPostBack('anpDataPager','2') 看到这个翻页我有点头疼,是aps写的后台,通过js调dll内部跳转的。 考...

  • 如何优雅地等待所有的goroutine退出

    Table of Contents 1. 通过Channel传递退出信号 2. 使用waitgroup goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢? 1 通过Channel传递退出信号 Go的一大设计哲学就是:通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样...

  • 面试官:换人!他连进程、线程、协程这几个特点都说不出

    前言在操作系统课程的学习中,很多人对进程线程有大体的认识,但操作系统教材更偏向于理论叙述,本文会结合 Linux 系统实现分析,更加印象深刻。同时,大部分人都接触进程和线程比较多,对协程知之甚少,然而最近协程并发编程技术火热起来,希望读完本文你对协程也有一个基本的了解。话不多说,我们马上进入本文的学习。进程首先还是说下「程序」的概念,程序是一些保存在磁盘上的指令的有序集合,是静态的。进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程,进程是程序资源管理的最小单位。进程与资源那么进程都管理...

  • Golang,kafka实现消息推拉

    Kafka的安装与启动 kafka中涉及的名词 消息记录:由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中,记录在生产中称为生产者记录,在消费者中称为消费记录。Kafka集群保持了所有发布的消息,直到它们过期,无论消息是否被消费了,在一个可配置的时间段内,Kafka集群保留了所有发布的消息。比如消息的保存策略被设置为2天,那么在一个消息被发布的两天时间内,它都是可以被消费的。Kafka的性能是和数据量无关的常量级的,所以保留太多数据并不是问题 生成者:生产者用于发布消息...

  • Golang使用redigo实现redis的分布式锁

    有些分布式场景会有分布式锁的需求,可以为了原子操作,也可能为了性能的原因,不管是分布式锁市面是有不少解决方法的,比如etcd、consul、zookeeper… 初次之外redis这样的nosql也是可以实现分布式锁的。 python党喜欢用redis、etcd、consul来搞。 java这帮人更喜欢用zookeeper来实现分布式锁,zookeeper做分布式锁有临时节点(Ephemeral Node)的效果,也就是说当客户端出问题时,watch在zookeeper的服务会监听到的, 另外由...

  • 6行代码解决golang TCP粘包

    什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论。本文使用golang的bufio.Scanner来实现自定义协议解包。 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数据包并显示出来 type Package struct { Version [2]byte // 协议版本,暂定V1 Length int16 // 数据部分长度 Timestamp int64 // 时间戳 HostnameLength int16 // 主机名长度 Hostname []byte...

  • golang日志框架zap简洁配置

    golang日志框架zap简洁配置 $ 前言 zap是uber开源的一款高性能日志组件框架 $ 配置目标 日志按天分割,一天一个文件 只保留近七天的日志 错误日志输出堆栈 源码 package base import ( "fmt" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "go.uber.org/zap" "go.uber.org/zap/zapcore" "io" "os" "time" ) var Log *zap.Sugar...

  • 浅谈 Golang sync 包的相关使用方法

    更多精彩文章:https://deepzz.com Desc:Go sync 包的使用方法,sync.Mutex,sync.RMutex,sync.Once,sync.Cond,sync.Waitgroup 尽管 Golang 推荐通过 channel 进行通信和同步,但在实际开发中 sync 包用得也非常的多。另外 sync 下还有一个 atomic 包,提供了一些底层的原子操作(这里不做介绍)。本篇文章主要介绍该包下的锁的一些概念及使用方法。 整个包都围绕这 Locker 进行,这是一个 i...

  • gf框架之grpool – 高性能的goroutine池

    grpool Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小。充分将goroutine复用,减少goroutine的创建/销毁的性能损耗,这便是grpool对goroutine进行池化封装的目的。例如,针对于100W个执行任务,使用goroutine的话需要不停创建并销毁100W个goroutine,而使用grpool也许底层只需要几千个goroutine便能充分复用地执行完成所有任务。经测试,...

  • Go 并发控制

    前言 提到Go语言的并发,就不得不提goroutine,其作为Go语言的一大特色,在日常开发中使用很多。 在日常应用场景就会涉及一个goroutine启动或结束,启动一个goroutine很简单只需要在函数前面加关键词go即可,而由于每个goroutine都是独立运行的,其退出有自身决定的,除非main主程序结束或程序崩溃的情况发生。 那么,如何控制goroutine或者说通知goroutine结束运行呢? 解决的方式其实很简单,那就是想办法和goroutine通讯,通知goroutine什么时...

  • 项目发布脚本-go

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin clear printf " # Name: Downtown_Shell_Deploy_Script # # Purpose:Deploy tar.gz to the host # # Notes: # 1 Upload your tar.gz file to the path /data/source # # 2 ./scr...

  • golang socket编程

    osi参考模型将计算机网络结构分为7个层次,但是在实际的开发应用中,我们更加认可TCP/IP族协议的五层结构,即应用层(http、ftp、dns),传输层(udp、tcp),网络层(ip),链路层(以太网),物理层。 socket编程作为一种基于网络层和传输层的数据io模式主要分为两种,TCP Socket和UDP Socket,也即面向连接的流式Socket和面向无连接的数据报式Socket。 今天主要和大家讲讲golang的TCP Socket编程。先来看个简单的例子吧 server.go ...

  • golang面试题整理

    golang面试题整理 1、go的调度 2、go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型 3、go defer(for defer),先进后出,后进先出 func b() { for i := 0; i < 4; i++ { defer fmt.Print(i) } } 4、select可以用于什么,常用语gorotine的完美退出 golang 的 select 就是监听 IO 操作,当 IO 操...

  • 秒杀系统的艺术

    12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。尤其是春节期间,大家不仅使用12306,还会考虑“智行”和其他的抢票软件,全国上下几亿人在这段时间都在抢票。“12306服务”承受着这个世界上任何秒杀系统都无法超越的QPS,上百万的并发再正常不过了!笔者专门研究了一下“12306”的服务端架构,学习到了其系统设计上很多亮点,在这里和大家分享一下并模拟一个...

  • EMQ百万级MQTT消息服务(TLS Docker Golang)

    附上: 喵了个咪的博客:w-blog.cn EMQ官方地址:http://emqtt.com/ EMQ中文文档:http://emqtt.com/docs/v2/guide.html 1.TLS证书验证 为了保障安全.我们常常会使用HTTPS来保障请求不被篡改,作为MQTT使用TLS加密的方式来保障传输安全 EMQ默认使用的TLS加密的端口是8883端口,默认证书在EMQ目录下etc/certs: 对应的配置文件在emq.conf中,可以修改你的端口和配置文件路径 listener.ssl.ex...

  • 基于drone构建CI-CD系统

    kubernetes集群三步安装 CI 概述 用一个可描述的配置定义整个工作流 程序员是很懒的动物,所以想各种办法解决重复劳动的问题,如果你的工作流中还在重复一些事,那么可能就得想想如何优化了 持续集成就是可以帮助我们解决重复的代码构建,自动化测试,发布等重复劳动,通过简单一个提交代码的动作,解决接下来要做的很多事。 容器技术使这一切变得更完美。 典型的一个场景: 我们写一个前端的工程,假设是基于vue.js的框架开发的,提交代码之后希望跑一跑测试用例,然后build压缩一个到dist目录里,再...

  • Go 资源整理,这里有你想要的????

    嗯~世界上第二好的语言,这里有你可能想要的????在 GitHub 上稳定更新,觉得不错请点个 Star ❤️ 如转载分享,请保留出处,谢谢 ???? 原文地址: https://shockerli.net/post/go... GitHub: https://github.com/shockerli/... 官网: https://golang.org国内官网镜像(访问快~): https://golang.google.cn GitHub: https://github.com/golang...

  • 100 行写一个 go 的协程池 (任务池)

    前言 go 的 goroutine 提供了一种较线程而言更廉价的方式处理并发场景, go 使用二级线程的模式, 将 goroutine 以 M:N 的形式复用到系统线程上, 节省了 cpu 调度的开销, 也避免了用户级线程(协程)进行系统调用时阻塞整个系统线程的问题。【1】 但 goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine 显然很有价值。 本文正是针对上述情况而提供一种简单的...

  • 写在新年第一天的Moba类游戏前后端开发分享

    我们之前一段时间做的一个游戏,勉强算是“后端房间分配","战局帧同步(前后端差帧编解码)"和"独立机器人服务器”都体验过一遍了吧,目前项目也属于无人维护的状态,干脆就开源了 https://github.com/genxium/TreasureHunterX,希望对于想做同类游戏的朋友也有帮助。由于这类游戏常会遇到匹配不到真实玩家需要机器人加入陪玩,所以这里也提供一个配套的BotServer仓库(非必须,测试时两个浏览器对战即可)。现在前端(Creator v2.1.3)和后端(Golang +...

  • Golang操作elasticsearch(一)

    Golang操作elasticsearch 使用第三方包:olivere github。总结一下olivere操作ES的常用功能,方便查阅。 说明:以下例子用到的es index:"test", es type:"test", es address: "http://10.1.1.1:9200" 新建es client func ESClient() (client *elastic.Client,err error){ file := "./log.log" logFile, _ := os....

  • Gin(八):cookie的使用

    原文首发于 ISLAND 上一章节我们留下了一个小尾巴,那就是权限校验中间件并灭有进行玩啥,那么今天就对它进行完善。 ???? Cookies 接上回,如何来判断用户是否登录呢? cookie 就是一个很好的凭证,cookie 会保留到浏览器上,每次访问请求的时候就会携带上,后端通过对 cookie 的识别,来判断用户是否登录。 由此一来,首先我们是要在登录的时候保存 cookie 。修改 userHandler 中 UserLogin 代码 在判断密码正确的时候,对 cookie 进行添加。 ...

  • 敏捷 & DevOps & Drone

    CI/CD对开发团队的重要性 软件开发是是一个复杂的工业化流程,编码只是其中的一部分,CI/CD 使得开发流程更加标准化、专业化、自动化和更加稳定,可以在开发过程中提早发现问题,从而提高开发效率,节省大量时间,一个好的CI/CD流程可以大大提高了软件的价值。CI/CD尤其对追求持续快速响应变化,持续迭代的敏捷开发中流程尤为重要。 CI/CD的技术选型 技术选型对于一个产品一个团队来说至关重要。对于敏捷团队的技术选型,往往不需要大而全的方案,更看重轻量高效,易于快速掌握,Drone刚好满足以上要求...

  • golang 使用RSA生成公私钥,加密,解密,并使用SHA256进行签名,验证

    话不多说直接上代码: package main import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/hex" "encoding/pem" "errors" "fmt" ) func main() { //rsa 密钥文件产生 fmt.Println("-------------------------------获取RSA公私钥-------------------------...

  • Consul使用手册

    Consul是什么 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 : service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。 health checking:健康检测使consul可以快速的 告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。 key/value sto...

  • Ubuntu 18.04下 Hyperledger Fabric 1.0 的搭建

    请大家按照步骤进行,避免不必要的错误。 1.查看 apt source sudo vi /etc/apt/sources.list 如果看到是http://cn.xxxxx之类的,那么就不用换的。但是如果其中是http://us.xxxxxx之类的,那么就是外国的。需要更换源,通过以下命令进行批量更换。 :%s/us./cn./g 更换完成后输入 :wq 保存退出。之后更新源。 sudo apt-get update 然后安装ssh sudo apt-get install ssh 2.安装GO...

  • 一探B站后台架构, 他山之石, 何以攻玉? -- 仅从一个一线Golang开发者的角度谈B站4.22代码

    4月22日, B站部分后台源代码因为某愤怒的员工, 被上传至Github. 本文我们不讨论安全, 法律 (根据代码漏洞, 去恶意攻击或者获利是违法的! 我们工作时也要注意代码安全), 我仅从开发者的角度谈谈, 这份代码我们能学到什么? B站Golang生态建设, 代码规范, 工具建设, 技术栈选择, 对于Go在部门或公司的推广又有哪些值得借鉴? 首先必须得说, B站这份代码整体还是不错的, 不是说组件或者基础库多么的厉害, 而是从整体目录分布, 业务代码分布, API易用性, 业务代码风格, 工...

  • [golang] logrus的简单封装

    在大型项目中,使用logrus进行日志打印,如不加一些如[usecase.CreateUser]前缀,将会很难定位到打印日志的代码位置。故liamylian/logrus-ext借鉴了python的logging模块,对logrus进行了简单封装。从而可以在日志中打印当前的模块名和调用函数名。 var log = Get("usecase", &Option{WithFunc: true}) // 输出: // time="2019-04-18T15:36:37+08:00" level=err...

  • Gopher 2019 Go并发编程的分享

    目录 [−] 内容划分基本同步原语MutexRWMutexCondWaitgroupOnceA XXX must not be copied after first use.PoolMap扩展同步原语ReentrantLockSemaphoreSingleFlightErrGroupSpinLockfslockconcurrent-map原子操作操作的数据操作方法SubtractValueChannelGo内存模型单个goroutine内包级别的init函数go语句channelMutex/RW...