goroutine与调度器
我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。 这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是M、G、P、Sched,...阅读全文
Etcd 架构与实现解析
前一段时间的项目里用到了 Etcd, 所以研究了一下它的源码以及实现。网上关于 Etcd 的使用介绍的文章不少,但分析具体架构实现的文章不多,同时 Etcd v3的文档也非常稀缺。本文通过分析 Etcd 的架构与实现,了解其优缺点以及瓶颈点,一方面可以学习分布式系统的架构,另外一方面也可以保证在业务中正确使用 Etcd,知其然同时知其所以然,避免误用。最后介绍 Etcd 周边的工具和一些使用注意事项。 阅读对象:分布式系统爱好者,正在或者打算在项目中使用Etcd的开发人员。 Etcd 按照官方介...阅读全文
golang编码规范
目录[-]golang编码规范gofmt注释命名控制结构函数(必须)错误处理panicimport缩写参数传递接受者 golang编码规范注:此文档参考官方指南Effective Golang和Golang Code Review Comments进行整理,力图与官方及社区编码风格保持一致。gofmt大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码一致的格式。正常情况下,采用Sublime编写go代码时,插件GoSublilme已经调用gofmt对代码实现了格...阅读全文
用Go语言进行ajax回传
一、后端部分 要想使用ajax,先要准备一个func (http.ResponseWriter, *http.Request)类型的函数来处理前端发过来的请求。 func OnAjax(res http.ResponseWriter, req *http.Request) { io.WriteString(res, "这是从后台发送的数据") } 接下来,要把一个网址和它对应起来,例如主页下的“/ajax”: http.HandleFunc("/ajax", OnAjax) 二、HTML部分 网...阅读全文
FlatBuffers使用记录(Golang)
试用了下FlatBuffers,把一些东东记录一下。 FlatBuffers 官网: http://google.github.io/flatbuffers/md__go_usage.html 它支持生成Go语言相关的东西,总的使用步骤如下: 1. 定义IDL 接口定义文件,通常命名为.fbs 参考: Writing a schema http://google.github.io/flatbuffers/md__schemas.html 2. 利用flatc 解析生成语言的文件 flatc 参...阅读全文
服务发现:Zookeeper vs etcd vs Consul
【编者的话】本文对比了Zookeeper、etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考。 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务监听同一个端口。管理一个拥挤的比方说被几百个服务所使用的所有端口的列表,本身就是一个挑战,添加到该列表后,这些服务需要的数据库和数量会日益增多。因此我们应该部署无需指定端口的服务,并且让Docker为我们分配一个随机的端口。唯一的问题是我们需要发现端口号,并且让别人知道。 当我们开始在一个分布式系统...阅读全文
设计模式-策略模式(Go语言描述)
好久没有更新博客了,最近也是在忙着充电,从今天这篇博客开始,我们来了解一下设计模式。 设计模式 那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧。 设计模式/软件设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 恩,大概的意思就是在撸码界由码神们总结的、能够解决软件设计中反复出现的问题的、由大多数人任何的设计方式,也可以说是一种编码规则。 初始编码我们总是...阅读全文
golang http2 client 和server 使用非TLS 模式(h2c)
研究了一下 golang 的http2 用法 这里先普及几个概念 h2,基于TLS之上构建的HTTP/2,作为ALPN的标识符,两个字节表示,0x68, 0x32,即https h2c,直接在TCP之上构建的HTTP/2,缺乏安全保证,即http在HTTP/2 RFC文档出现之前,以上版本字段需要添加上草案版本号,类似于h2-11,h2c-17 首先写了一个服务器的代码 import ( "fmt" "html" "net/http" "golang.org/x/net/http2" ) fun...阅读全文
GoLang邮件发送Demo(继上篇msmtp)
GoLang越来越被看好,流行只是时间的问题了,闲暇时间玩玩Go。 下面是发送邮件的demo,替换自己的邮箱,完全可以正常跑起来,用的是net/smtp包: package main import ( "fmt" "net/smtp" "strings" ) func SendToMail(user, password, host, to, subject, body, mailtype string) error { hp := strings.Split(host, ":") auth :=...阅读全文
go语言与c语言的相互调用
最近由于工作原因,需要实现go语言与c语言的相互调用。由于go语言与c语言有着千丝万缕的暧昧关系,两者之间的调用可以通过语言层面实现。下文是对此的总结。 go语言调用c语言 以下为一个简短的例子: package main // #include <stdio.h> // #include <stdlib.h> /* void print(char *str) { printf("%s\n", str); } */ import "C" import "unsafe" func main() {...阅读全文
10秒钟,让你的方法变为RPC服务
rpcx一个服务治理的Go RPC框架, 拥有非常多的特性,支持跨语言的服务调用。 众多的特性可以参考doc.rpcx.site。它的服务治理的特性深受阿里巴巴的Dubbo框架的启发。 在实际的产品应用中,用户使用两台服务器+8台日志搜集服务(Client),轻松处理每天几十亿的服务调用, 除了中间一个路由器硬件闪断, 整个系统平稳运行多半年。 相比较之前Java的实现, 服务器节省了一半。 用户使用rpcx框架重构后的系统每月为公司节省了几十万元的成本。 rpcx框架的一个设计哲学就是简单。不...阅读全文
protobuffer、gRPC、restful gRPC的相互转化
文档 grpc中文文档 grpc-gateway,restful和grpc转换库 protobuf 官网 protobuf Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。 优点 平台无关,语言无关,可扩展; 提供了友好的动态库,使用简单; 解析速度快,比对应的XML快约20-100倍; 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。 安装 参...阅读全文
基于go搭建微服务实践教程 (概览)
原文:Go Microservices blog翻译:秦伟格转载请注明原文及翻译。 译者按:公司转向重新做一套支付系统,并打算用golang的微服务来实现。于是上网上找一找教程,发现中文教程都不是很系统,于是找到了这一篇,自己实践下来,感觉深浅适中,讲解清晰,一步一步可以跟着做下来,之后能明白微服务大概的意思。所以用业余时间翻译了一下,献给大家。(笔者居住在国外,但第一次翻译技术文章,希望大家能指正不足) 这一系列博客会用go语言搭建一个为服务系统,这个过程中,我们会逐步加入新的东西,并且最后让...阅读全文
用go实现聊天室(WebSocket方式)
前言 刚入门go语言和beego框架,通过一个简单聊天室的实现,来趁热练习。 详细代码见github。 一、WebSocket协议 在实现之前,我们需要解决一个底层问题。 总所周知,HTTP协议是单向传输协议,只能由客户端主动向服务端发送信息,反之则不行。而在聊天室中,一个用户发送一条消息,服务器则需要将该条消息广播到聊天室中的所有用户,这想通过HTTP协议实现是不可能的。 除非,让每个用户每隔一段时间便请求一次服务器获取新消息。这种方式称为长轮询。但其缺点十分明显,非常消耗资源。 为了解决这个...阅读全文