Go 拾遗

收录了 85 篇文章 · 3 人关注

  • 120
    zap 高性能是如何做到的?

    ![插图由“go 之旅”提供,原图由 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20190815-go-how-zap-package-is-optimized/1__mMI_UYf-DsS04MU5AnRQg.png) Go 生态系统有许多流行的日志库,选择一个可以在所有项目中使用的日志库对于保持最小的一致性至关重要。易用性和性能通常是我们在日志库中考虑的两个指标。...

  • 985渣硕毕业六面腾讯,只因这份面试题拿到2-3Offer,给到30*14薪

    前言 本人是跨专业考研的985渣硕一枚,经历研究生两年的学习积累加上四个月的学习,有幸于最近面试拿到了腾讯的Offer定级2.3一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且,我对招聘也做了一些研究和相应的准备。 腾讯最新职位级别 大厂简历格式 简历作为面试的敲门砖可以说是尤为重要了,这两年研究生的生涯除了学习了一些面试技巧以及专业知识,各种各样大神的简历模板我也参考了不少,总结出一些经验在这里分享给大家,毕竟有一份专业的简历才能更好的吸引面试官...

  • 不得不了解系列之限流

    限流简介 现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(Rate Limit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服务、排队或等待、降级等处理。对于server服务而言,限流为了保证一部分的请求流量可以得到正常的响应,总好过全部的请求都不能得到响应,甚至导致系统雪崩。限流与熔断经常被人弄混,博主认为它们最大的区别在于限流主要在server实现,而熔断主要在client实现,当然了,一个服务既可以充当server也可以充当...

  • Go 每日一库之 zerolog

    简介 每个编程语言都有很多日志库,因为记录日志在每个项目中都是必须的。前面我们介绍了标准日志库log、好用的logrus和上一篇文章中介绍的由 uber 开源的高性能日志库zap。zerolog相比zap更进了一步,它的 API 设计非常注重开发体验和性能。zerolog只专注于记录 JSON 格式的日志,号称 0 内存分配! 快速使用 先安装: $ go get github.com/rs/zerolog/log 后使用: package main import "github.com/rs/...

  • 链式调用 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。 本系列文章主要采用如下结构: 什么是「XX设计模式」? 什么真实业务场景可以使用「XX设计模式」? 怎么用「XX设计模式」? 本文主要介绍「责任链模式」如何在真实业务场景中使用。 什么是「责任链模式」? 首先把一系列业务按职责划分成不同的对象,接着把这一系列对象构成一个链,然后在这一系列对象中传递请求对象,直到被处理为止。 我们从概念中可以看出责任链模式有如...

  • gin-vue-admin 基于vue和gin 搭建的后台管理系统脚手架

    项目地址: https://github.com/piexlmax/gin-vue-admin 开发者(贡献者)列表 开发者 功能 姓名 @piexlmax 项目发起者 蒋*兆 @krank666 前端联合作者 尹* @1319612909 前端css优化 杜*兰 @granty1 代码积极贡献者 印*林 gin-vue-admin gin+vue开源快速项目模板 更新代码后如果遇到前端报错请执行 npm i 前端开发会不定期增加新的依赖 请注意更新 重构记录 2019年12月12日 17:15...

  • 面试头条被拒,一年后逆袭拿到offer

    原文链接;https://mp.weixin.qq.com/s/h406uQEKFhwrepDF3b4hyw 一、印象中的头条 1.老板张一鸣跟我是福建老乡,龙岩市在我朋友说来就是山沟沟,能走出美团王兴和头条张一鸣让我卯足了去龙岩吃特产老鼠干的欲望。 2.给的钱多,笔试也贼难。参加过头条笔试的同学都知道,头条笔试可以笔试三次,就是不论你有没有参加都有三次机会。笔试就5道算法题,两个小时,去年第一次看到算法题就自闭了,第一次挂了。第二次又很认真地做,做到一半放弃了。没过几天又邀请我做第三次,有一种...

  • 手把手教你写一个完美的Golang Dockerfile

    引言 对于dockerfile而言,何为完美? 我认为应该满足以下三点: 体积小 构建快 够安全 话说不说,直接上拿走可用的Dockerfile。 FROM golang:1.13.5-alpine3.10 AS builder WORKDIR /build RUN adduser -u 10001 -D app-runner ENV GOPROXY https://goproxy.cn COPY go.mod . COPY go.sum . RUN go mod download COPY ....

  • Golang的协程调度器原理及GMP设计思想?

    一、Golang“调度器”的由来? (1) 单进程时代不需要调度器 我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是“单进程时代” 一切的程序只能串行发生。 5-单进程操作系统.png 早期的单进程操作系统,面临2个问题: 1.单一的执行流程,计算机只能一个任务一个任务处理。 2.进程阻塞所带来的CPU时间浪费。 那么能不能有多个进程来宏观一起来执行多个任务呢? 后来操作系统就具有了最早的并发...

  • 关于Golang过滤敏感信息的正确姿势

    今天正好看到一篇关于敏感信息过滤的文章,这算做一个interface实际应用的一些举例和应用。 例子中介绍了一种比较常见的使用场景:使用JSON保存数据时的对诸如用户密码等信息进行保护时候应该做的事情。作者以使用JSON格式保存用户账户和密码为例,讲解了使用json.Unmarshaler接口类型过滤敏感信息。 比如,对于保存敏感数据的结构体: 1234567891011type Credentials struct { Email string `json:”email”` Password ...

  • Golang程序员开发效率神器汇总!

    一. 开发工具1)sql2go用于将 sql 语句转换为 golang 的 struct. 使用 ddl 语句即可。例如对于创建表的语句: show create table xxx. 将输出的语句,直接粘贴进去就行。http://stming.cn/tool/sql2go.html2)toml2go用于将编码后的 toml 文本转换问 golang 的 struct.https://xuri.me/toml-to-go/3)curl2go用来将 curl 命令转化为具体的 golang 代码....

  • 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/go Wi...

  • Redis优化高并发下的秒杀性能

    本文内容 使用Redis优化高并发场景下的接口性能 数据库乐观锁 随着双11的临近,各种促销活动开始变得热门起来,比较主流的有秒杀、抢优惠券、拼团等等。 涉及到高并发争抢同一个资源的主要场景有秒杀和抢优惠券。 前提 活动规则 奖品数量有限,比如100个 不限制参与用户数 每个用户只能参与1次秒杀 活动要求 不能多发,也不能少发,100个奖品要全部发出去 1个用户最多抢1个奖品 遵循先到先得原则,先来的用户有奖品 数据库实现 悲观锁性能太差,本文不予讨论,讨论一下使用乐观锁解决高并发问题的优缺点。...

  • [译]Golang应付百万级请求/分钟

    原文:medium.com/smsjunk/han… 我在不同公司从事反爬虫、反病毒、反恶意程序已经有15年了,我知道,由于每天需要处理和应对的大量数据,这些系统最终会因此变得十分复杂。 目前我是smsjunk.com的CEO以及KnowBe4的首席架构师,两家公司都是活跃与网络安全行业。 有趣的是在过去10年作为一名软件工程师,几乎所有我参与的后端开发项目里面都是用Ruby on Rails来完成的。可是你不要误会,我热爱Ruby on Rails并且我认为它是一个非常出色的开发环境,但当你用...

  • golang 服务平滑重启小结

    golang 服务平滑重启小结 背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多。我们整个服务都是基于云,请求流量从 四层->七层->机器。 要想实现平滑重启大致有三种方案,一种是在流量调度的入口处理,一般的做法是 ApiGateway + CD ,发布的时候自...

  • 使用 Go 处理中间件

    简介 gin 的中间件 创建中间件 总结 当前部分的代码 简介 开发 web 应用的时候, 很多地方都需要使用中间件来统一处理一些任务,比如记录日志, 登录校验等. gin 也提供了中间件功能. gin 的中间件 在项目创建之初, 就已经导入了一些中间件, 当时没有仔细介绍. g.Use(gin.Logger()) g.Use(gin.Recovery()) g.Use(middleware.NoCache()) g.Use(middleware.Options()) g.Use(middlew...

  • 秒杀系统的艺术

    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...

  • Golang实现请求限流的几种办法

    在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。 简单的并发控制 利用 channel 的缓冲设定,我们就可以来实现并发的限制。我们只要在执行并发的同时,往一个带有缓冲的 channel 里写入点东西(随便写啥,内容不重要)。让并发的 goroutine在执行完成后把这个 channel 里的东西给读走。这样整个并发的数量就讲控制在这个 channel的缓冲区大小上。 比如我们可以用一个 bool...

  • go平滑重启调研选型和项目实践

    原文链接 github 什么是平滑重启 当线上代码需要更新时,我们平时一般的做法需要先关闭服务然后再重启服务. 这时线上可能存在大量正在处理的请求, 这时如果我们直接关闭服务会造成请求全部 中断, 影响用户体验; 在重启重新提供服务之前, 新请求进来也会502. 这时就出现两个需要解决的问题: 老服务正在处理的请求必须处理完才能退出(优雅退出) 新进来的请求需要正常处理,服务不能中断(平滑重启) 本文主要结合linux和Golang中相关实现来介绍如何选型与实践过程. 优雅退出 在实现优雅重启之...

  • 干货满满的 Go Modules 和 goproxy.cn

    大家好,我是一只普通的煎鱼,周四晚上很有幸邀请到 goproxy.cn 的作者 @盛傲飞(@aofei) 到 Go 夜读给我们进行第 61 期 《Go Modules、Go Module Proxy 和 goproxy.cn》的技术分享。 本次 @盛傲飞 的夜读分享,是对 Go Modules 的一次很好的解读,比较贴近工程实践,我必然希望把这块的知识更多的分享给大家,因此有了今天本篇文章,同时大家也可以多关注 Go 夜读,每周会通过 zoom 在线直播的方式分享 Go 相关的技术话题,希望对大...

  • 用 go 实现一个分布式限流器

    项目中需要对 api 的接口进行限流,但是麻烦的是,api 可能有多个节点,传统的本地限流无法处理这个问题。限流的算法有很多,比如计数器法,漏斗法,令牌桶法,等等。各有利弊,相关博文网上很多,这里不再赘述。 项目的要求主要有以下几点: 支持本地/分布式限流,接口统一 支持多种限流算法的切换 方便配置,配置方式不确定 go 语言不是很支持 OOP,我在实现的时候是按 Java 的思路走的,所以看起来有点不伦不类,希望能抛砖引玉。 1. 接口定义 package ratelimit import "...

  • 避免诸如 base、util、common 之类的包名

    写一个好的 Go 语言包的开端是起一个好名字。将你的包名视为一个 elevator pitch,你必须用一个单词来说明。 包名不好的一个普遍的原因是被命名为 *utility*,这些包混合了 helpers 和 utility 代码,还包含了各种各样不相关的函数,因此根据它们提供的内容很难描述其作用。这经常导致一个包的名字取决于它所包含内容:实用工具(utilities)。 在开发一些深层次包结构的项目时,为了避免出现循环引用,同时复用辅助函数,通常会出现类似 *utils* 或 *...

  • MySQL 亿级数据量水平分库实践

    需求背景 水平拆分和垂直拆分一直是最常见的数据库优化方式,笔者所在的部门所使用的数据库一直是主从热备的架构,但数据量在一年前就已经破亿,并以飞快的增长速度不断增加。为了减小数据库的负担,提高数据库的效率,缩短查询时间,水平拆分的工作已经必不可免。 水平拆分带来的问题 而水平拆分必然会带来一些问题,例如原本依赖于数据库自增 id 的主键在分库的场景下,多个分库下 id 做不到全局唯一;引入了分布式事务的问题,如果同一个逻辑事务里,涉及的数据跨多个数据库实例,本地事务将不生效;需要将原本的源库做拆分...

  • go实现压测工具【单台机器100w连接压测实战】

    本文介绍压测是什么,解释压测的专属名词,教大家如何压测。介绍市面上的常见压测工具(ab、locust、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具,本文还有两个压测实战项目: - 单台机器对HTTP短连接 QPS 1W+ 的压测实战 - 单台机器100W长连接的压测实战 ## 目录 - 1、项目说明 - 1.1 go-stress-testing - 1.2 项目体验 - 2、压测 - 2.1 ...

  • golang-微服务micro初体验

    什么是微服务? 一种软件体系结构模式,用于将大型单块应用程序分解为更小、可管理的独立服务,这些服务通过语言无关协议进行通信,每个服务的重点做好一件事 微服务的概念并不新鲜,这是对服务导向架构的重新构想,但其方法更整体地与unix进程和管道保持一致。 微服务架构的理念: 服务很小 - 细粒度作为单一的商业目的类似于unix哲学“做一件事,做得好” 组织文化应该包含部署和测试的自动化。这减轻了管理和运营的负担 文化和设计原则应该包含失败和错误,类似于反脆弱系统。 好处: 更容易扩展开发 - 团队围绕...

  • 如何在 Golang API 中避免内存泄漏?

    关注公众号:JongSunShine 获取更多资料 建议你在将Golang API投入生成之前阅读此文,此文是基于真实的线上问题修复经历,如有巧合,纯属踩雷! 几个星期前,在修复我们的主服务器的漏洞时,我们尝试了很多方法来调试和修复它,因为它已经投入生产几个星期了。 但是我们总是需要通过我们的自动缩放机制来缓解,使其看起来似乎一切正常。直到后来我们才明白,这是coding中出现了问题。01 架构 我们在整个系统架构中使用了微服务模式。 有一个网关 API (我们称之为主 API )为我们的用户(...

  • golang获取goroutine ID

    golang本身不提供获取goroutineID的接口,如果要获取goroutineID可以使用下面的方法 package main import ( "bytes" "fmt" "runtime" "strconv" ) func main() { fmt.Printf("goroutine ID is:%d\n", getGID()) } func getGID() uint64 { b := make([]byte, 64) b = b[:runtime.Stack(b, false)] ...

  • 使用 Go Modules(模块)进行依赖项迁移

    ## 介绍 本篇文章是 Go Modules 系列文章的第 2 部分。第 1 部分请参阅 [Go Modules 的使用方法(中文翻译版)](https://studygolang.com/articles/19334) [Using Go Modules(EN)](https://blog.golang.org/using-go-modules) Go 项目使用各种各样的依赖关系管理策略,像 `dep` 和 `glide` 这样的第三方依赖项[vendor](https...

  • 压测工具如何选择? ab、locust、Jmeter、go压测工具【单台机器100w连接压测实战】

    本文介绍压测是什么,解释压测的专属名词,教大家如何压测。介绍市面上的常见压测工具(ab、locust、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具,本文还有两个压测实战项目: 单台机器对HTTP短连接 QPS 1W+ 的压测实战 单台机器100W长连接的压测实战 目录 1、项目说明 1.1 go-stress-testing 1.2 项目体验 2、压测 2.1 压测是什么 2.2 为什么要压测 2.3 压测名词解释 2.3.1 压测类型解释 ...

  • golang微服务框架go-micro 入门教程1.1 10分钟搭建go-micro开发环境

    >微服务的本质是让专业的人做专业的事情,做出更好的东西。 `golang`具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。`go-micro`是基于`golang`的微服务编程框架,`go-micro`操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的`go-micro`入门教程,所有案列来自实操,而非网络上的复制粘贴。 >本章节的目的是让大家最快速搭建好`go-micro`环境 |软件|环境| |----|----| |操作系统...

  • golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做更美好的自己。 golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章的定位是成为最简单最容易上手的go-micro入门文章,所有案列来自实操,杜绝复制粘贴。 本章节的目的是让大家最快速搭建好go-micro环境 软件 环境 操作系统 win10 golang go 12.7/AMD64 micro micr...

  • 使用Golang的Gin框架和vue编写web应用

    背景: 之前使用Golang的Gin框架进行一些运维内部后端的API接口开发,对外提供提供json类型的数据响应,但是该种方式在浏览器访问数据时数据格式不友好(由于是API接口,一般需要使用postman之类的工具来验证接口返回数据),后来尝试了使用Golang的template模板来结合html进行数据渲染,但也发现比较缺乏美感。之后决定使用前端框架来渲染后端数据,由于vue框架的各种优势,比如简单、数据的双向绑定等等好处,决定使用vue框架来开启我的前端之旅。接下来简单来讲解下使用Golan...

  • 单机百万并发,golang 50行代码

    本文首先介绍单机百万并发的测试方法和测试结果,然后分析go语言50行代码实现的单机百万并发网络服务器背后的秘密 组网 采用6台2核8G内存的云主机作为client 采用1台4核16G内存的云主机作为server 组网图 client端设置 设置系统打开的最大文件数为20万 ulimit -n 200000 修改端口可用范围为1024到65535 echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range 单台client虚机建立18万连接 配...

  • 源码剖析golang中sync.Mutex

    go语言以并发作为其特性之一,并发必然会带来对于资源的竞争,这时候我们就需要使用go提供的sync.Mutex这把互斥锁来保证临界资源的访问互斥。 既然经常会用这把锁,那么了解一下其内部实现,就能了解这把锁适用什么场景,特性如何了。 引子 在我第一次看这段代码的时候,感觉真的是惊为天人,特别是整个Mutex只用到了两个私有字段,以及一次CAS就加锁的过程,这其中设计以及编程的理念真的让我感觉自愧不如。 在看sync.Mutex的代码的时候,一定要记住,同时会有多个goroutine会来要这把锁,...

  • API接口测试工具Restbird项目文件管理

    本文你可以了解到项目文件管理项目文件管理我们使用下面命令行管理restbird容器:docker run -ti -p {host-port}:8080 -v {path-to-project}:/data/restbird restbird/rest你首先需要创建项目文件夹,按上述命令行映射到restbird container。其中path-to-project是你创建项目文件夹的文件路径。所有的项目文件将存储到此文件中。你可以使用git、svn或者其他版本控制工具管理项目文件。一旦rest...

  • 【Golang】go get GitHub私有仓库

    go get GitHub私有仓库 go get github.com/user/project 命令内部使用 https://github.com/ git clone命令,默认只支持公有仓库,不支持私有仓库。如需要让go get支持私有仓库,则须按如下操作,使https://github.com/转为GitHub的Token访问: 1、前往 https://github.com/settings/tokens/new 产生一个Token,注意该Token必须包含repo权限。 2、执行命令 ...

  • 用 let's Encrypt 实现 HTTPS 示例( fasthttp 与net/http)

    [摘要] let's Encrypt 是一个免费提供 HTTPS 的签名服务, 这里提供一个示例,用 [certmagic](https://github.com/mholt/certmagic) 实现 fasthttp 与 net/http 上支持 HTTPS <!--more--> ## 0. 基本配置 我的域名, 包括 tsingson.io 与 www.tsingson.io , 在 DNS 上加上 A 记录, 指向我的服务器 IP 为了...

  • Go gcache 源码分析(图解)

    概述 gcache是一个用go实现的并发安全的本地缓存库。他可以实现如下功能: 指定缓存的的大小,初始化之时为cache设置size大小。 支持多种缓存的策略:Simple、LRU、LFU、ARC Simple:最普通的缓存策略,根据先存入的先淘汰。 LUR:Least Recently Used,意思是最近最少使用。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。 LFU:Least Frequently Used ,意思是最近最不常用。LFU Cache先淘汰一定时间内被访问次...

  • Go 编程: 那些奇怪的注释

    自从上篇总结了一下Go 编程: 交叉编译 vs 条件编译之后,觉得有必要对于类似条件编译标签此类的特殊注释做一次简单收集。 1. 常规注释 每种开发语言都有自己的注释语法和格式,也大多类似。 Go 语言和市面上其它多种高级语言的注释语法也类似,主要有以下两种语法格式: 注释行 以符合 // 开头 注释块 以符号 /* 注释内容 */ 包括 通常情况下, 对外公开的包、函数、常量、变量均需要进行注释。代码是否注释完全,可以通过lint工具进行审查。不了解的话,可以参考像 Awesome-Go 一样...

  • 后端架构设计,如何扛住100亿次请求?

    1. 前言前几天,偶然看到了 《扛住100亿次请求——如何做一个“有把握”的春晚红包系统”》一文,看完以后,感慨良多,收益很多。正所谓他山之石,可以攻玉,虽然此文发表于2015年,我看到时已经过去良久,但是其中的思想仍然是可以为很多后端设计借鉴。同时作为一微信后端工程师,看完以后又会思考,学习了这样的文章以后,是否能给自己的工作带来一些实际的经验呢?所谓纸上得来终觉浅,绝知此事要躬行,能否自己实践一下100亿次红包请求呢?否则读完以后脑子里能剩下的东西 不过就是100亿 1400万QPS整流 这...

  • 如何用 Go 语言实现正向代理

    正向代理是处理一组内网客户端发往外部机器的网络请求的一种代理方式。 实际上,正向代理是你的应用和你所要连接的服务器之间的中间人。它在 HTTP(S) 协议上起作用,并且被部署在网络设施的边缘。 你通常可以在大型组织或大学中见到正向代理,它被用来进行授权管理或网络安全方面的控制。 我发现在使用容器或者动态的云环境工作时,正向代理很有用,因为你会面临一组服务器和外部网络的通信问题。 如果你在 AWS、AZure 之类的动态环境下工作,你会拥有一批数量不定的服务器和一批数量不定...

  • Go语言中的微服务

    # Go语言中的微服务 ## 摘要 我最近在墨尔本 Golang 聚会上就如何开发微服务和框架做了一次演讲。在本文中,我将与您分享我的想法(此外,它对我来说是一个很好的复习)。 在这里,我要介绍以下框架: * [Go Micro](https://micro.mu/) * [Go Kit](https://gokit.io/) * [Gizmo](https://github.com/NYTimes/gizmo) * [Kite](https://github.co...

  • Go组件学习——cron定时器

    1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了。 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎么启动这么慢,Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等,这些话在哪听过类似的??? “Go为什么要后置声明,多别扭啊” “Go里面为啥要定义这么多的struct,看的头晕” …… 其实,没有最好的语言,只有最适合的。 前面《Go语言学习》系列主要介绍了一些Go的基础知识和相较于...

  • 深入 Go 并发模型:Context

    介绍 在Go服务器中,每个传入请求都在其自己的goroutine中处理。 请求处理程序通常会启动其他goroutine来访问后端,例如数据库和RPC服务。 处理请求的goroutine集合通常需要访问特定于请求的值,例如最终用户的身份,授权令牌和请求的截止日期。 当请求被取消或超时时,处理该请求的所有goroutine都应该快速退出,以便系统可以回收他们正在使用的任何资源。 Context是专门用来简化对于处理单个请求,多个goroutine之间数据共享、取消信号、超时处理等相关操作。翻译自 G...

  • 使用 CGO 和 GoReleaser 进行跨平台编译

    我参与了一个开源项目 [Mailchain](https://github.com/mailchain/mailchain) ,该项目使用 Go 语言。我想使用 `CI\CD` 轻松的创建版本。 Golang 是一种允许以简单的方式编译代码,并在不同的操作系统上执行的语言。我发现了一个很棒的工具 [https://goreleaser.com/](https://goreleaser.com/) ,它可以用来构建,打包和发布二进制文件。 这是在 Mac 上构建的命令。 ```bash...

  • golang aes ecb 加密

    代码地址:https://github.com/FakerGit/go-tools 加密模式 AES ECB模式 PKCS7Padding填充 原理 整个明文分成若干段相同的小段,然后对每一小段进行加密。这个是不安全的,重复的原文块加密后会是重复的结果,很明显暴露明文的模式。 代码 func PKCS7Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSiz...

  • 细说Golang的JSON解析

    之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象。Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据。生成JSON场景相对简单一些,json.Marshal()会根据传入的结构体生成JSON数据。解析JSON会把数据解析到结构体中,由于JSON格式的自由组合的特点,尤其是那些结构复杂的JSON数据对新手来说声明接受JSON数据的结构体类型就会陷入不知从何下手的困扰。 最近工作中由于要解析JS和PHP程序持久化的JSON数据...

  • 如何用 Go 实现热重启

    热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务。 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socket 描述符给子进程 子进程接收并监听父进程传递的 socket 描述符 在子进程启动成功之后,父进程停止接收新连接,同时等待旧连接处理完成(或超时) 父进程退出,热重启完成 实现 package main import ( "context" "errors" "flag" "log" "net" ...

  • Go 逃逸分析

    原文地址:Go 逃逸分析 什么是逃逸分析 堆和栈 要理解什么是逃逸分析会涉及堆和栈的一些基本知识,如果忘记的同学我们可以简单的回顾一下: 堆(Heap):一般来讲是人为手动进行管理,手动申请、分配、释放。堆适合不可预知大小的内存分配,这也意味着为此付出的代价是分配速度较慢,而且会形成内存碎片。 栈(Stack):由编译器进行管理,自动申请、分配、释放。一般不会太大,因此栈的分配和回收速度非常快;我们常见的函数参数(不同平台允许存放的数量不同),局部变量等都会存放在栈上。 栈分配内存只需要两个CP...