Golang服务程序daemon化踩坑记录

之前写习惯了C/CPP,都知道可以使用Linux上的daemon函数来方便的实现守护进程。最近切换到go上,想如法炮制,第一个想到的就是基于cgo直接调用,类似如下代码: //#include<unistd.h> import "C" func Daemon() { C.daemon(1,0) } 上面代码确实可以成功执行,可问题随之而来。测试的时候,我发现使用了上述代码片段的程序,测试时会随机出现程序无限假死的情况,google的大部分结果都说的是golang的Scheduler和Linux的...阅读全文

开源中国博客 2018-05-21 01:33:05 WangRichard

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述...阅读全文

开源中国博客 2018-05-21 00:33:05 大糊涂

Golang中你不可不知的各种永远阻塞的写法

Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。 可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。 使用sync.WaitGroup 一直等待直到WaitGroup等于0 package main import "sync" func main() { var wg sync.WaitGroup wg.Add(1) wg.Wait() } 空select select{}是一个没有任...阅读全文

开源中国博客 2018-05-21 00:33:04 大糊涂

如何使用 Golang 日志监控你的应用程序?

导读 你是否厌烦了那些使用复杂语言编写的、难以部署的、总是在不停构建的解决方案?Golang 是解决这些问题的好方法,它和 C 语言一样快,又和 Python 一样简单。 但是你是如何使用 Golang 日志监控你的应用程序的呢?Golang 没有异常,只有错误。因此你的第一印象可能就是开发 Golang 日志策略并不是一件简单的事情。不支持异常事实上并不是什么问题,异常在很多编程语言中已经失去了其异常性:它们过于被滥用以至于它们的作用都被忽视了。 在进一步深入之前,我们首先会介绍 Golang...阅读全文

开源中国博客 2018-05-19 23:33:05 问题终结者

在Golang中各种永远阻塞的姿势

在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。 可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。 使用sync.WaitGroup 一直等待直到WaitGroup等于0 package main import "sync" func main() { var wg sync.WaitGroup wg.Add(1) wg.Wait() } 空sel...阅读全文

sheepbao.github.io 2018-05-19 21:03 sheepbao.github 等

以C视角来理解Go内存逃逸

前言 相信很多有过 clang 开发经验的 gopher 都会很奇怪,go 里面到处都充斥着看似静态分配的局部变量却还能通过指针传递正常游走于各种函数的返回之间,这要在 clang 里面就是个教科书般典型的指针错误使用范例,这到 golang 这边就成了语言特性之一还被开发团队所推崇,这是为什么? 我们都知道在 clang 中所有静态内存的分配都是在 stack 上进行,函数体在执行结束出栈后所有在栈上分配的内存都将得到释放,如果此时直接返回当前作用域变量的指针,这在下层函数的寻址行为就会因为出...阅读全文

音風の部屋 2018-03-17 00:00 音風の部屋

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述...阅读全文

音風の部屋 2017-08-11 00:00 音風の部屋

基于go搭建微服务实践教程 (三)

原文地址转载请注明原文及翻译地址 在第三节,我们要让我们的accountservice做一些有用的事情。 声明一个 Account 结构 嵌入一个键值对的存储,用来存储Account结构 序列化结构为JSON,并且用于我们的accounts/{accountId} HTTP服务 源代码 这篇博客中的所有代码可以从分支p3中得到。 git checkout P3 声明一个Account结构 在我们的项目中,在accountservice文件夹中创建一个model文件夹 mkdir model 在m...阅读全文

Segmentfault 2018-05-19 20:33:23 瘦瘦鸭

基于go搭建微服务实践教程 (二)

原文地址转载请注明原文及翻译地址 第二部分,我们会: 建立go项目 写我们的第一个微服务 使用Gorilla组件为HTTP请求提供JSON应答 我们从微服务基础开始,之后会搭建在我们的docker swarm上 介绍 对于内部请求还是外部请求,通过HTTP提供JSON应答不是唯一的选择。但我们在这里会主要讲解这一方法。当内部请求或者外部请求也是一个系统时,用RPC和二进制信息格式作为请求方式也是一个不错的选择,例如protocol buffers。go有内置的RPC支持,gRPC值得研究一下。然...阅读全文

Segmentfault 2018-05-19 20:31:13 瘦瘦鸭

go标准库之flag包

命令行参数常用来为命令行程序指定选项。比如在 wc -l 命令中 -l 就是命令行参数。golang 提供了 flag 包来支持基本的命令行参数解析。 命令行语法 命令行语法如下: -flag -flag=x -flag x // non-boolean flags only 基本用法 定义 flag 参数 方法一:通过 flag.Xxx() 方法返回一个相应的指针,举几个栗子: wordPtr := flag.String("word", "foo", "a string") numbPtr ...阅读全文

Segmentfault 2018-05-19 18:34:39 happen

golang工具之present

Golang Present 是 Golang 社群开发出來的一个简单工具,通过简单的语法可以制作 ppt(语法近似于 Markdown)。 简介 Golang 相关的技术幻灯片有多种格式,以 .ppt, .pdf 和 .slide 为主。.slide 格式是随着 golang 诞生而出现的一种 present 格式,Go 核心开发成员似乎十分喜欢以这种格式分享 Go 语言。在Golang 官方,几乎所有技术会议的 talk 幻灯片 均是以 .slide 形式提供的。.slide文件通过 web...阅读全文

Segmentfault 2018-05-19 18:34:39 happen

Golang-Gui 第三方库andlabs/ui的使用和效果zh

github上有很多第三方GUI,本文以anblabs/ui库为例,支持跨平台,也比较容易上手,简单介绍下它的用法和最终展示效果。代码奉上,引包copy代码就直接可以运行起来,部分电脑可能需要下载gcc:package mainimport (    //"fmt"    "github.com/andlabs/ui")func main() {    err := ui.Main(func() {        input := ui.NewEntry()        input.SetTe...阅读全文

Go语言中文网 2018-05-19 17:42:09 yanyuxuan

深入解析 Go 中 Slice 底层实现

切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和减少。但是切片本身并不是动态数据或者数组指针。切片常见的操作有 reslice、append、copy。与此同时,切片还具有可索引,可迭代的优秀特性。 一. 切片和数组 关于切片和数组怎么选择?接下来好好讨论讨论这个问题。 在 Go 中,与 C 数组变量隐式作为指针使用不同,Go 数组是值类型,赋值和函数传参操作都会复制整个数组数据。 f...阅读全文

halfrost.com 2018-05-18 19:27 halfrost.com

使用golang 实现JSON-RPC2.0

本文同时发布于我的博客 yeqown.github.io 什么是RPC? 远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。 远程过程调用是一个分布式计算的客户端-服务器(Client/Server)的例子,它简单而又广受欢迎。远程过程调用总是由客户端对服务器发出一个执行...阅读全文

Segmentfault 2018-05-18 17:34:41 yeqown

基于go的微服务搭建(七) - 服务发现和负载均衡

第七节: 服务发现和负载均衡 原文地址 转载请注明原文及翻译地址 这篇文章将关注两个微服务架构的重要部分:服务发现和负载均衡.和他们是如何帮助我们2017年经常要求的横向扩展容量的 简介 负载均衡和出名.服务发现需要一些解释,从一个问题开始:"服务A如何请求服务B,如果不知道怎么找到B"换句话说,如果你有10个服务B在随机的集群节点上运行,有人要记录这些实例,所以当A需要和B联系时,至少一个IP地址或者主机名可以用(用户负载均衡),或者说,服务A必须能从第三方得到服务B的逻辑名字(服务器负载均衡...阅读全文

Segmentfault 2018-05-18 17:34:41 瘦瘦鸭

基于go的微服务搭建(六) - health check

第六节:health check原文地址转载请注明原文及翻译地址 当我们的微服务越来越复杂,让docker swarm知道我们的服务运行良好与否很重要.下面我们来看一下如何查看服务运行状况.例如,我们的accountservice服务将没用如果不能 服务http或者链接数据库.最好的办法就是提供一个healthcheck接入点.我们基于http,所以映射到/health,如果运行良好,返回http 200同事一些解释什么是良好的信息.如果有问题,非http 200返回,并解释哪里不好.有人认为都...阅读全文

Segmentfault 2018-05-18 17:34:40 瘦瘦鸭

基于go的微服务搭建(五) - 部署docker swarm

标题: 部署docker swarm 这部分,我们启动我们的accountservice,运行在本地的docker swarm集群中.同时讨论几个容器部署的重要概念这篇博客主要讲一下几点: docker swarm和容器部署 用docker作为容器运行accountservice 建立一个本地的docker swarm集群 将accountservice作为swarm服务部署 基测和结果 其实写完这一章,我发现这一章和go没有关系.但希望你喜欢. 什么是容器部署 在实践开始之前,一个容器部署的简...阅读全文

Segmentfault 2018-05-18 16:34:42 瘦瘦鸭

基于go的微服务搭建(四)- 用GoConvey做测试和mock

第四章:用GoConvey做测试和mock 我们应该怎样做微服务的测试?这有什么特别的挑战么.这节,我们将看下面几点: 单元测试 用Goconey写行为模式的单元测试 介绍mocking技巧 因为这章不会改变核心服务代码,所以没有基测 微服务测试简介 首先,你必须记住测试金字塔: 单元测试必须作为你集成,e2e的基础,验收测试更不容易开发和维护微服务有一些不同的测试难点,构建软件架构用到的准则和做测试一样.微服务的单元测试和传统的不太一样,我们会在这里讲一下.总之,我强调几点: 做正常地单元测试...阅读全文

Segmentfault 2018-05-18 16:34:41 瘦瘦鸭