database/sql包连接池解读
连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文
连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文
在之前的一篇文章《WebAssembly的过去,现在和未来》,简单的介绍了WASM的历史,现状以及即将带来的特性。这篇文章,将会简单的使用Go的API来生成WASM,通过与JS的交互来实现WASM的加载和执行。使用Go的原因也是个人的爱好,其非常简洁,拥有静态语言的可维护性及性能,同时还拥有动态语言的开发效率,灵活性(这篇文章要求你对Go有一定的了解,以后有机会也会写一些Go的入门文章)。Hello world1、首先需要安装Go1.11+的版本,WebAssembly在Go1.11得到支持2、在Go编译时需要指定OS参数为js,ARCH参数为wasm,就像这样:GOARCH=wasm GOOS=js go build -o lib.wasm main.go 编译完成会在当前目录下生成lib...阅读全文
16位的端口号数量有限,如果每次后端交互都需要新建连接,理论上来说,同时请求后端Service的Goroutine数量无法超过65535这个硬性限制,在如今这个动辄“十万”“百万”高并发时代,最高6w并发貌似不太拿得出...阅读全文
[TOC] 环境 OSX 10.10.5 jdk1.8.0_92 golang 1.7 Android SDK 25.1.7 Andorid-NDK-r12b Andorid Studio 1.5.1 xcode 7.2.1 swift 2.1.1 目前golang bind 支持的类型说明 https://godoc.org/golang.org/x/mobile/cmd/gobind 安装 gomobile go get -u -v golang.org/x/mobile 会报告一个错误 package golang.org/x/mobile: no buildable Go source files in /Users/sinlov/go/src/golang.org/x/mobile...阅读全文
- 本文由博客一文多发平台 OpenWrite 发布...阅读全文
在游戏服务器中,处理玩家登陆需要向数据库查询玩家的账号和密码,玩家上线和下线需要对玩家的角色数据从数据库中读取和保存。可以说,相对于游戏逻辑处理来说,数据库操作是一种相对很慢的操作,即便你通过使用多个线程多个数据库连接来提高数据库操作的处理能力,但是,在高并发高负载的服务器应用中,这样仍然会是相当的负载瓶颈。设想这样一种设计方案,见下图: image 在大量玩家登陆游戏服务器时,由于有大量的数据库访问请求,即便是有自己实现的CACHE机制,还是会导致服务器耗尽所有的逻辑线程资源,服务器的处理能力将降低成DBMS的处理能力。 为了不阻塞逻辑线程,可以采用异步数据库访问的方式,即数据库操作请求提交给专门的数据库处理线程池,然后逻辑线程不再等待数据库处理结果,继续处理其他,不再阻塞在这里。 抽象的...阅读全文
最近碰到群里网友问如果检查网络连接的Timeout,联想最近看到的另一个问题, 在这篇文章统一记录一下。 如果检查一个网络错误是Timeout导致的? 自 Go 1.6开始, 所有的超时导致的网络错误都可以通过net.Error的Timeout()方法检查。 123if err, ok := err.(net.Error); ok && err.Timeout() { ……} 更早版本的Go并没有专门的检查Timeout方法。 可以参考: https://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error 产品中一定不要使用默认的http.Get 如果你觉得方便,直接使用http.Get或者类似的...阅读全文
写在前面 之前的序言发出来之后,很多热心小伙伴给我留言和私信,给我提供了各种各样的想法。让我产生了一些想法,所以重新思考开这个坑的目的。结合我自身的情况,理论结合实际。做一次更完善的技术选型。并且把这周来踩过的坑总结一下,希望能对后来的小伙伴有帮助。 这篇文章的视频版在这里: 【MMORPG开发日志】004复刻魔兽世界,KBEngine服务器框架选择,安装和启动! 交流QQ群:872537977 项目地址github:https://github.com/Liweimin0512/uRPG 不得不吐槽一下,视频形式的开发日志所要付出的时间真的比写文章多得多啊。 开发目的 我在上篇文章中说我做这个项目是为了蹭魔兽世界怀旧服的热度其实是开了个玩笑。 真实的原因是我想涉猎自己从未接触过的游戏服务器...阅读全文
创翻译文章,转载请注明出处:服务器非业余研究-sunface 简介 Go1.1更新中最重要的特性之一就是由Dmitry Vyukov开发的全新的调度器。新的调度器能极大的提高Go并行程序的性能并且不需要对程序进行修改,因此我认为应该写一篇文章为大家介绍下新版的调度器特性。 这篇文章所写的绝大部分内容都可以在original design doc找到 ——这是篇很有技术含量而且很通俗易懂的文章,你所需要的知识都可以从这篇文章中获取,而且由于插入了配图,因此相对来说更清晰易读。 Go运行时系统需要用调度器来做什么? 首先我们需要了解下为什么需要新的调度器?为什么在操作系统能对线程进行调度的情况下还要创建一个用户空间的调度器? 对现存的Unix进程模型来说,POSIX线程API是一种逻辑上扩展,线...阅读全文
这篇文章对于想在go中使用c语言的朋友应该很有帮助,一步步讲解了怎么做。 另外,按照文章一步步做,需要安装 libspotify 库,可以到这里下载,各大平台都支持:http://developer.spotify.com/technologies/libspotify/ 文章链接:http://codegangsta.io/blog/2013/07/08/c-bindings-in-go-a-practical-example/ (其实点击标题也会跳转到原文...阅读全文
最近在研究Docker的源码时,读到libContainerd部分时,发现它用到了grpc.而此前只知道只是一个用于分布式系统中RPC的库.就借着这个机会,学习一下这个工具. 写过Java中的WSDL的朋友,会觉得其实它们的使用非常相似. 安装ProtoBuf 3 因为grpc依赖ProtoBuf,将我们写的服务定义转换成Go文件.所以我们需要安装ProtoBuf. 那为什么要安装ProtoBuf 3这个新出的,各个方面都还不是很完善的版本呢?官网上建议采用这个版本,就安装这个版本喽.如果我们安装ProtoBuf2,以后很可能会有兼容问题. 那如何安装呢? 首先,去ProtoBuf的Github主页下载最新版的ProtoBuf的包.在我写这篇文章时,最新版的是3.0.2.这里因为我们是为Go...阅读全文
- 第一部分:https://studygolang.com/articles/14118 - 第二部分:https://studygolang.com/articles/14478 ## mutex 和 sync.Once 介绍  假设你的程序中有一个需要某种初始化的功能。该 Bootstrap 程序成本很高,因此将其推迟到实际使用功能的那一刻是有意义的。这样,当功能未激活时,就不会浪费 CPU 周期。 这在 Go 中如何完成? ```go package main import "fmt...阅读全文
简评:对于Go来说一直以来依赖包的版本控制上没有一个好的方案,尽管社区诞生了不下十余个解决该问题的工具,但一直以来没有一个官方的支持。这个提案有望在Go的下个版本中看到官方的包版本控制了,去除了GOPATH依赖,同时还引入了module 的概念,真正意义上实现了重编译,可谓一次大的变更编译:缪斯的情人 是时候为 Go 添加包版本控制了! 更确切地说,我们需要把包版本的概念普及到Go 开发者和工具常用词汇中,以便在后续的相互沟通时能准确一致的表达哪些程序代码需要编译、运行和解析。同样,go 命令也需要准确的告诉开发者在编译中使用了哪个包的哪个版本。 版本控制可以让我们能够实现重编译。当我让你试用我程序最新版本时,我清楚的知道你不仅仅获取到的是我最新程序的代码,还包括我代码所依赖的相同版本的包,...阅读全文
https://draveness.me/golang...阅读全文
在我们之前的C++文章“利用rating-input PreviewWidget来对事物进行评价及打分”,我们已经展示了如何使用C++来在Scope中的Preview中对事物进行评价或打分。在今天的这篇文章中,我们将介绍如何在Go Scope中来做同样的事。我们可以通过这个例子来展示如何捕获在Go Preview中的按钮并得到它们的action id以进行分别的处理。 在Go文件中的Preview方法中: unc (s *MyScope) Preview(result *scopes.Result, metadata *scopes.ActionMetadata, reply *scopes.PreviewReply, cancelled <-chan bool) error { layou...阅读全文
如果你已经阅读了前2篇文章:《调度起源》和《宏观看调度器》,你对G、P、M肯定已经不再陌生,我们这篇文章就介绍Go调度器的基本原理,本文总结了12个主要的场景,覆盖了以下内容: G的创建和分配。 P的本地队列和全局队列的负载均衡。 M如何寻找G。 M如何从G1切换到G2。 work stealing,M如何去偷G。 为何需要自旋线程。 G进行系统调用,如何保证P的其他G'可以被执行,而不是饿死。 Go调度器的抢占。 12场景 提示:图在前,场景描述在后。 上图中三角形、正方形、圆形分别代表了M、P、G,正方形连接的绿色长方形代表了P的本地队列。 场景1:p1拥有g1,m1获取p1后开始运行g1,g1使用go func()创建了g2,为了局部性g2优先加入到p1的本地队列。 场景2:g1运行完...阅读全文
参考这篇文章 https://studygolang.com/articles/6934 package main import "fmt" type Printer interface{ Print() } type CanonPrinter struct{ Printname string } // 若不实现此方法则下面的赋值会报错 func (printer CanonPrinter) Print(){ fmt.Println("AAA") } type PrintWorker struct{ Printer // 内嵌了一个接口 name string age int } // 实现 xxx func (printworker PrintWorker) Print(){ fmt.Pr...阅读全文
之前一直在用qiniu的存储服务,生成图片的缩略图,模糊图,视频的webp,现在需要把存储移到s3上,那么这些图片,视频处理就要自己动手写了,本文梳理一下大致的思路。 分析需求 先看一下qiniu的接口是如何处理图片的,例如先截取视频第一秒的图片,再把图片缩略,最后存储到一个新的key,命令可以这么写 vframe/jpg/offset/1|imageMogr2/thumbnail/400x|saveas/xxx, 可以看到三个操作之间用 | 符号分割,类似unix 的 pipe 操作。 上面的操作算作一个cmd, 一次API请求可以同时处理多个cmd,cmd之间用分号分割, 处理完毕后,在回调中把处理结果返回,例如 { "id": "xxxxx", "pipeline": "xxx", "...阅读全文
文:https://blog.csdn.net/Gy__My/article/details/78790280 背景:当系统面临大量用户访问,负载过高的时候,通常会使用增加服务器数量来进行横向扩展,使用集群和负载均衡提高整个系统的处理能力。 在此先感谢两位作者: 1.作者:知乎用户 链接:https://www.zhihu.com/question/22610352/answer/138542422 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处 2.作者:GiraffeLin 链接:https://www.douban.com/note/325866291/?type=like 来源:豆瓣 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处 ...阅读全文
【MMORPG开发日志010】漫谈一些有的没的 写在前面 首先是祝愿所有看到这篇文章的小伙伴新年快乐健康! 目前关于这个项目的文字版开发日志已经很久没更新了,这段时间我更新了很多视频形式的开发日志,感兴趣的可以访问我的B站主页:玩物不丧志的老李 游戏研发过程中,总是产生各种想法,这些想法纠结着我。 这篇文章可能很乱,因为我在打算写这篇文章的时候依然没有清晰的中心思想 换句话说,这篇文章只是我自言自语的对于这段时间独立开发的一个复盘 如果能对你有帮助,自然是最好的了。 这个项目的意义 事到如今,我不得不重新思考这个项目存在的意义。 诚然,在最开始,这个项目的存在仅仅是为了“学习”,学习什么?学习网络游戏的开发,特别是MMORPG游戏的开发。 所以我们的目标自然不是“创新”,而应该是“复刻”。 ...阅读全文
之前写了原理篇,在原理篇里简单的介绍了一下DHT,但是还不够详细。今天我们就专门详细的讲一下嗅探器的核心-DHT,这里默认原理篇你已经读了。 背景知识 DHT全称 Distributed Hash Table,中文翻译过来就是分布式哈希表。它是一种去中心化的分布式系统,特点主要有自动去中心化,强大的容错能力,支持扩展。另外它规定了自己的架构,包括keyspace和overlay network(覆盖网络)两部分。但是他没有规定具体的算法细节,所以出现了很多不同的实现方式,比如Chord,Pastry,Kademlia等。BitTorrent中的DHT是基于Kademlia的一种变形,它的官方名称叫做 Mainline DHT。 DHT人如其名,把它看成一个整体,从远处看它,它就是一张哈希表,...阅读全文
授人予鱼而不如授人予渔,本系列专题(上篇)为大家推荐了31篇好文,希望可以帮到大家! “出诊”:RDS SQL Server死锁(Deadlock) 1. RDS SQL Server死锁(Deadlock)系列之一使用DBCC捕获死锁 经常会被客户问道:“应用程序被死锁报错啦?影响很大,到底是哪个进程导致了死锁发生的啊?怎么解决啊?怎么办呀?”。如何解决呢? 点击阅读详情 https://yq.aliyun.com/articles/73856?utm_content=m_28061 2. RDS SQL Server死锁(Deadlock)系列之二使用Profiler捕获死锁 不管是RDS SQL Server还是自建,死锁的确是一个非常头疼的问题。这...阅读全文
Session存储 我们在上篇文章中介绍了一个简单的Session管理器的工作原理,除此之外,我们还定义了一个Session存储接口。在本次分享中,我将展示一个实现此接口的基于内存的会话存储引擎的示例。您也可以将其定制为其他形式的Session存储。 package memory import ( "container/list" "sync" "time" "github.com/durban89/wiki/session" ) // Store 存储 type Store struct { sid string // unique session is lastTime time.Time // last save time value map[interface{}]interface...阅读全文
go-callvis 发现这个不错的工具,然后尝试用了一下,还有很多的问题,这篇文章,主要是讲解怎么使用。 go-callvis 是一个开发工具,其目的是通过使用来自函数调用关系图的数据及其与包和类型的关系来对程序进行可视概览。 这在你只是试图理解别人的代码结构,或在代码复杂性增加的大型项目中特别有用。 [TOC] 缺点 github项目上的文档写的不是很清晰,我尝试了一下,没用 图画的很乱,有时候完全摸不到头绪 官方示例 用法 github上的图例 三个例子 docker 使用 go-callvis github.com/项目具体路径 | dot -Tpng -o syncthing.png 解析的是main包 go-callvis -group pkg,type -focus [想要分析...阅读全文
概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可。 这篇文章咱们分享:路由中间件 - 日志记录。 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中。 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - request_proto - request_ua - request_referer - request_post_data - request_client_ip - response 返回数据 ...阅读全文
最近在学习golang 发现程序panic使用recover捕获,返回值被坑了。 在网上看到篇文章:https://studygolang.com/articles/4809 两个结论: 多个defer的执行顺序为“后进先出”; defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出...阅读全文
概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 捕获异常,这篇文章咱们分享:路由中间件 - Jaeger 链路追踪。 啥是链路追踪? 我理解链路追踪其实是为微服务架构提供服务的,当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。 咱们先看一张图: 这张图的调用链还比较清晰,咱们想象一下,随着服务的越来越多,服务与服务之间调用关系也越来越多,可能就会发展成下图的情况。 这调用关系真的是... 看到这,我的内心是崩溃的。 那么问题来了,这种情况下怎么快速定位问题? 如何设计日志记录? 我们自己也可以设计一个链路追踪,比如当发生一个请求,咱们记录它的: 请求的唯一标识 请求了哪些服务? 请求的服务依次顺序? 请求的 Reque...阅读全文
最近在学redis,本人菜鸟.代码是过程式的,没考虑优化.就是发篇文章记录一下.感觉redis还是很强大的. 规则 评分 = 支持票数*(86400/200)+时间戳, 文章获得为200票就可以在首页展示一天,随着时间的流逝,当分数小于当前时间戳的时候,就从首页撤下. 使用hash记录文章的标题,链接,作者,文章发布时间,文章得到的投票数量. 使用两个有序集合来有序的存储文章:第一个有序集合的成员为文章ID,分值为文章的发布时间;第二个有序集合的成员同样为文章ID,分值为文章的评分.通过这两个有序集合,网站既可以根据文章发布的时间来展示文章,也可以根据文章评分的高低来展示文章. 为了防止用户对同一篇文章进行多次投票,网站需要为每篇文章记录一个已投票用户名单,为此,程序将为每篇文章创建一个集合...阅读全文
本文的作者:Russ Cox Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言。 最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年。这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言。如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的“Go语言半小时速成教程”,不妨一看。 下面是译文内容: 最近,由于一篇“为什么我不会舍弃Python投奔Go语言(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。 在Go语言中,规定的方式是,函数返...阅读全文
ETCD探索 梗概 这篇文章旨在从源码角度分析ETCD MVCC、Lease、Watch的实现,帮助我们更好的使用ETCD。 ETCD是什么? 这是ETCD官网给出的解释,ETCD是一个KV存储。现在有太多的KV存储中间件,我们为什么要选择ETCD呢?原因就是这句话:"distributed", "reliable",ETCD是一个分布式的、可靠的KV存储。相比于Redis,ETDC不够快,但足够安全,可靠。每一个中间件都有自己的特点,我选择ETCD有两个原因: ETCD是GO写的,所以GO用起来很方便。(不用ZK的原因) 扩容方便。 在讨论之前,我们先看下ETCD的目录结构 auth 访问权限 client/clientv3 GO客户端SDK contrib 里面放着raftexample...阅读全文
理解 Docker 中的 Volumes Why 本文翻译自 Understanding Volumes in Docker,和原文作者一样,我在刚接触 Docker 的时候,对 Docker 中 Volumes 的概念也有些困惑,docker run -it -v /some/dir:/another/dir someImage:someTag 中的 -v 选项和 Dockerfile 中定义的 VOLUME 能达到相同的效果吗?看完这篇文章后才豁然开朗,所以翻译过来一方面巩固理解,另一方面分享一下。 译文 从 Docker IRC Channel (Ross:用了一下这里提到的 Docker IRC Channel,顺便看了关于 Python 和 C++ 的聊天室,原来网络上还有一群人在...阅读全文
趁着元旦休假+春节,尝试把2018年期间让我受益的一些文章、问答,翻译一下。欢迎指正、讨论,希望对你也有所帮助。原文链接:Go: Are pointers a performance optimization? 以下,开始正文 过去几周时间,我回答了许多关于使用指针优化性能的问题。似乎很多人在这方面都感到困惑。这也可以理解,指针确实是个复杂的话题。 希望这篇文章对你有所帮助。 简而言之:不是使用指针就一定代表着性能优化。 如果要彻底解释这篇文章涉及的所有细节,那篇幅可能会长到没人愿意看。所以,我精简了一下,试图用中等篇幅也能涵盖想说明的高级概念。 阅读时需要说明一点:本文讨论的是微优化,性能优化都是极其细微的。在进行微优化之前,需先进行基准测试,否则很可能看不到明显的效果。代码易读性才是第一...阅读全文
文地址:dave.cheney.net/2016/03/19/… 原文作者:Dave Cheney 译文地址:github.com/watermelo/d… 译者:咔叽咔叽 译者水平有限,如有翻译或理解谬误,烦请帮忙指出 这篇文章是我几天前在 Twitter 上提出的建议的延续。 在 Go 中,对于任何类型 T 都存在类型 *T,表示获取 T 类型(T 表示你声明的类型)变量的地址。例如: type T struct { a int; b bool } var t T // t's type is T var p = &t // p's type is *T 复制代码这两种类型,T 和 *T 是不同的,*T 不能替代 T(此规则是递归的,**T 会返回 *T 地址指向的值)。 你可以在任何类...阅读全文
最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。 前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。 nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入通道都关闭后才退出的例子,就使用了这个特性。 func combine(inCh1, inCh2 <-chan ...阅读全文
上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图: max-booms.png 这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特殊情况,我们已经做了处理--不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况: min-booms.png min-booms2.png 把规律描述一下就...阅读全文
这篇文章介绍了关于 Go 语言中方法的剩余部分。强烈建议先阅读[第一部分](https://studygolang.com/articles/14061) 的介绍部分。 ## 方法表达式 如果有这样一个类型 T,它的方法集中包含方法 M,则 T.M 会生成一个与方法 M 几乎相同且带有签名的方法,这称为 *方法表达式*。不同之处在于,它额外附带的第一个参数与 M 的接收者类型相等。 ```go package main import ( "fmt" "reflect" ) func PrintFunction(val interface{}) { t := reflect.TypeOf(val) fmt.Printf("Is variadic: %v\n", t.IsVariadic()) ...阅读全文
在之前的文章中,我们介绍了一些持久化数据结构实现的基本原理和 Vector Trie 这一数据结构在 Golang 下的实现过程。 这篇文章终于来到了实现持久化 List 的最后一步: 实现 Transient 和持久化的功能。 这篇文章是系列文章的一部分,如果还没有浏览过文章的其它部分请参考: 持久化数据结构简介 Vector Trie 的实现 Transient 及持久化 (本文) 在之前的文章中,我们已经看到了如何实现一个 Vector Trie,也知道如何使用 Vector Trie 来实现共享数据结构的持久化 List: 在每次修改时,我们复制从根节点到被修改节点路径上的所有节点,并使用得到的新的 Root 节点构造一个新的 List 的 HEAD 数据结构。这样通过新的 HEAD...阅读全文
just do it 最近在写一个web IM 项目,虽然本人主打golang后端,但是部分前端还是需要自己解决。因为这是一个IM系统,所以不考虑使用json来传送数据,改用protocol buffers ,优点见官网。由于前端不太熟练,经常被Angular坑,包括这次,花费我一个下午时间来解决Angular2+ 使用 Protocol Buffers的问题。 灵感来源:Using protocol buffers with Node.js + Swagger + Angular 进入正题,本机环境 Linux ubuntu 1. 定义一个简单的 .proto 文件 具体的protocol buffers 的.proto文件定义见官网,下面展现一个简单的小例子: // Protocol.p...阅读全文
通过椭圆曲线算法生成公钥 对公钥进行sha256散列和ripemd160散列,获得publickeyHash 在publickeyHash前面加上version(版本)字节数组获得versionPublickeyHash 对versionPublickeyHash进行两次sha256散列并取前4位字节,获得tailfHash 将tailfHash拼接到versionPublickeyHash后面,获得公钥的最终Hash即finalHash 最后将finalHash进行Base58编码(一种可视化工具)得到比特币地址 曾经有个疑问,为何比特币生成地址要这么麻烦,既然非对称加密只拥有公钥是无法倒推出私钥的,为何不直接使用公钥当地址,而是对公钥进行hash多次来取得地址,直到最近看了篇文章才明白,...阅读全文
BestGolanger 一.开篇: 首先现在Web端大多数都是采用前后端分离,包括移动端更是不必多用说,网站弄个Vue或者Angular,后端使用Java或者Go或者是Nodejs或者Python等等 前端呢就是展示数据渲染出一个效果,可以理解为后端是盖楼,前端就是装修,对于用户来说,都是必要的二者也是密不可分,后端呢如果往白话来讲,就是数据的存取、计算、应对前端传过来的指令进行相应的存取、计算等作出回馈返还给前端。后端最基本的构造是什么呢,首先后端服务就像一个饭店,里面都是服务员,时刻等待着接收指令,前端就是顾客,前端说,服务员给我注册个账号,服务员说马上到,卡卡几下就告诉顾客,先生您要注册的账号注册好了,吧啦吧啦...二.翠花上酸菜 说点干货最基本的web服务需要具备以下东西:1.Ro...阅读全文
这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。 在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。 channel的使用场景 把channel用在数据流动的地方: 消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ... channel的基本操作和注意事项 channel存在3种状态: nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭channel后,channel的值是nil channel可进行3种操作: 读 写 关闭 把这3种操...阅读全文
严格来说,在 Golang 中并不支持泛型编程。在 C++ 等高级语言中使用泛型编程非常的简单,所以泛型编程一直是 Golang 诟病最多的地方。但是使用 interface 我们可以实现泛型编程,我这里简单说一下,具体可以参考我前面给出来的那篇文章。比如我们现在要写一个泛型算法,形参定义采用 interface 就可以了,以标准库的 sort 为例。 package sort // A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of ...阅读全文
### 前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了`pick_first`和`round_robin`两种负载均衡策略,轮询法`round_robin`不能满足因服务器配置不同而承担不同负载量,这篇文章将介绍如何实现自定义负载均衡策略--`加权随机法`。 `加权随机法`可以根据服务器的处理能力而分配不同的权重,从而实现处理能力高的服务器可承担更多的请求,处理能力低的服务器少承担请求。 ### 自定义负载均衡策略 gRPC提供了`V2PickerBuilder`和`V2Picker`接口让我们实现自己的负载均衡策略。 ```go type V2PickerBuilder interface { Build(info PickerBuildInfo) balancer.V2...阅读全文
上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图: 这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特色情况,我们已经做了处理--不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况: 把规律描述一下就是,取出m和n之中的最小数min,min除以3,如果整除则是min/3,如果有余数,则...阅读全文
众所周知,软件项目成功必要因素很多,泛泛来说,下面几条也缺一不可。 1. 完备调研,项目需求分析完美契合用户或者客户所需所想 2. 开发实施:设计、Coding、测试、部署、运维,每一流程都达到或者超出预期目标 3. 市场推广:销售或市场人员对产品合理推广这篇文章将更多的集中在第二条开发实施这块,做一些常见的技术经验,希望对大家有一些借鉴。设计这块,请参考 “产品开发技术文档模板”这篇文章。Coding泛泛的模块化,SOA等等这些概念,这里不想赘述,这儿更多分享一些实战经验,不限开发语言。 1. 线程安全:Coding简单来说就是逻辑性的调用基本库API /开源库的API 及语言基本组成部分(语法、结构、变量、常量、语句、函数等),给定输入,输出预期输出,因此,编码者应本着对程序负责的态度,...阅读全文
Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢? 修改job-fail.yaml,故意引入一个错误: Never 如果将 restartPolicy 设置为 Never 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。 运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建: 直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed 当前 Completion 的数量为 0 查看 Pod 的状态:...阅读全文
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇文章中,我们试图理解比原是如何交易的,但是由于内容太多,我们把它分成了几个小问题,并在前一篇解决了“在dashboard中如何提交交易信息”,以及“比原后台是如何操作的”。 在本文我们继续研究下一个问题:在提交的交易成功完成后,前端会以列表的方式显示交易信息,它是如何拿到后台的数据的?也就是下图是如何实现的: 由于它同时涉及到了前端和后端,所以我们同样把它分成了两个小问题: 前端是如何获取交易数据并显示出来的? 后端是如何找到交易数据的? 下面依次解决。 前端是如何获取交易数据并显示出...阅读全文
Docker 使用中的一些最佳实践 本文将记录: 在使用 Docker 的过程中整理出来的最佳实践。 其他 Docker 使用者发布的(可能会是翻译过来的,全部附带原始链接)经过验证的最佳实践。 所以,本文将长期更新。 Docker 安装相关 如果安装完成后使用 docker 时出现下面的错误: > Cannot connect to the Docker daemon. Is 'docker -d' running on this host? 参考这里的内容,我们需要执行下面的命令来安装 apparmor: sudo apt-get install apparmor Docker 使用相关 使用 Bash Aliases 简化 Docker 使用命令,灵感来自于一篇很好的文章(发布这篇文章...阅读全文