Go module使用学习

Go module使用学习

Go 1.11 前天已经正式发布了,这个版本包含了两个最重要的feature就是moduleweb assembly。虽然也有一些简单的教程介绍了go module的特性,但是基本上都是hello world的例子,在实践的过程中, 很多人都在“拼命的挣扎”,包括我自己, 从一些qq群、github的issue, twitter上都可以看到大家茫然或者抱怨的语句。

虽然有三个帮助文件go help modgo help modulesgo help module-get可以了解一些go module的用法,但是感觉Go开发组对module这一特性还是没有很好的做一个全面的介绍,很多情况还得靠大家看源代码或者去猜,比如module下载的文件夹、版本格式的完整声明,module的最佳实践等,并且当前Go 1.11的实现中还有一些bug,给大家在使用的过程中带来了很大的困难。

我也在摸索中前行, 记录了摸索过程中的一些总结,希望能给还在挣扎中的Gopher一些帮助。

Introduction to Go Modules 是一篇很好的go module 入门介绍, 如果你仔细阅读了它,应该就不需要看本文了。

GO111MODUL

要使用go module,首先要设置GO111MODULE=on,这没什么可说的,如果没设置,执行命令的时候会有提示,这个大家应该都了解了。

既有项目

假设你已经有了一个go 项目, 比如在$GOPATH/github.com/smallnest/rpcx下, 你可以使用go mod init github.com/smallnest/rpcx在这个文件夹下创建一个空的go.mod (只有第一行 module github.com/smallnest/rpcx)。

然后你可以通过go get ./...让它查找依赖,并记录在go.mod文件中(你还可以指定 -tags,这样可以把tags的依赖都查找到)。

通过go mod tidy也可以用来为go.mod增加丢失的依赖,删除不需要的依赖,但是我不确定它怎么处理tags

执行上面的命令会把go.modlatest版本换成实际的最新的版本,并且会生成一个go.sum记录每个依赖库的版本和哈希值。

新的项目

你可以在GOPATH之外创建新的项目。

go mod init packagename可以创建一个空的go.mod,然后你可以在其中增加require github.com/smallnest/rpcx latest依赖,或者像上面一样让go自动发现和维护。

go mod download可以下载所需要的依赖,但是依赖并不是下载到$GOPATH中,而是$GOPATH/pkg/mod中,多个项目可以共享缓存的module。

go mod 命令

download    download modules to local cacheedit        edit go.mod from tools or scriptsgraph       print module requirement graphinit        initialize new module in current directorytidy        add missing and remove unused modulesvendor      make vendored copy of dependenciesverify      verify dependencies have expected contentwhy         explain why packages or modules are needed

有些命令还有bug, 比如go mod download -dir:

go mod download -dir /tmpflag provided but not defined: -dirusage: go mod download [-dir] [-json] [modules]Run 'go help mod download' for details.

帮助里明明说可以设置dir,但是实际却不支持dir参数。

看这些命令的帮助已经比较容易了解命令的功能。

翻墙

在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

replace (golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dacgolang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638dgolang.org/x/text v0.3.0 => github.com/golang/text v0.3.05)

依赖库中的replace对你的主go.mod不起作用,比如github.com/smallnest/rpcxgo.mod已经增加了replace,但是你的go.mod虽然requirerpcx的库,但是没有设置replace的话, go get还是会访问golang.org/x

所以如果想编译那个项目,就在哪个项目中增加replace

版本格式

下面的版本都是合法的

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7gopkg.in/vmihailenco/msgpack.v2 v2.9.1gopkg.in/yaml.v2 <=v2.2.1github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3elatest

go get升级

  • 运行go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch 将会升级到最新的修订版本
  • 运行go get package@version 将会升级到指定的版本号version

go mod vendo

go mod vendor 会复制modules下载到vendor中, 貌似只会下载你代码中引用的库,而不是go.mod中定义全部的module。

go module,vendor和travis C

https://arslan.io/2018/08/26/using-go-modules-with-vendor-support-on-travis-ci/

阅读全文
golang api中避免内存泄露

golang api中避免内存泄露

你有必要在把golang api投入生产环境前阅读下这篇文章,基于我们的真实经历,因为没有使用正确的方法,我们在每个release都很遇到困难和挣扎。

就在几周之前,我们刚刚修复了一个奇怪的未发现的bug,我们试了很多方法去debug和修复它。这个bug并不是业务逻辑上的问题,因为它已经在生产环境跑了几周了,那是因为我们的自动释放机制,隐藏了这个问题,所以它看上去是正常。

直到最近,我们发现这个问题是因为代码并没有处理好。

架构

首先说下,我们在架构中使用了微服务模式。我们有一个gateway API - 我们叫“main API”,它服务于我们的用户(手机客户端和web页面)。由于它的角色很像API Gateway,所以它的任务就只是处理用户的请求,然后再请求道对应的服务上,然后将reponse返回给用户。这个“main API”完全是使用Golang开发的。为什么选择golang在这里就不详细介绍了。

我们系统的架构图大概如下

问题

我们被main API困扰了好久,他经常down掉,并且返回给...

阅读全文
康威定律与技术之痛

康威定律与技术之痛

今天看了一篇技术博客,里面提到了“康威定律”,很好奇就去google了一下,下面来分享一下我的收获。

所谓康威定律,就是一个叫康威的人提出的一个技术观点

设计系统的企业受限于生产设计,这些设计是企业沟通结构的副本——Melvin Conway(1967)。

这意味着设计系统的企业,它们生产的设计等同于企业内的沟通结构。下图说明了此概念

konway's la
阅读全文
如何在PC端-开发机访问云服务器内网的mysql数据库

如何在PC端-开发机访问云服务器内网的mysql数据库

出于安全策略限制,云服务器上通常禁止直接使用PC机或者开发机直接访问数据库。但是对于一些习惯使用MySQL图形化界面访问数据库的童鞋,如何在自己的PC机上实现访问数据库呢?今天就介绍一种SSH通道的实现方式。
  • 跳板机
这是一台已经授权可以使用mysql协议访问数据库的服务器,比如机房前端机
  • 数据库:DBIP : DBPOR
这是数据库给出的连接地址
  • 影子机
我们还需要一台Linux服务器,它具备两个属性1、它可以通过ssh访问跳板机2、诸多PC机可以访问它的特定端口接下来就是在“影子机-跳板机-数据库”之间建立一个“SSH隧道”,实现把数据库的IP和端口映射到影子机的指定端口上,之后诸多PC机就可以通过访问影子机的IP和指定端口来访问数据库了1、登录影子机2、启动一个ssh进程:ssh -g -f -NL 影子机IP:影子机指定端口:数据库IP:数据库端口 SSH登录跳板机的用户名@跳板机IP;那么PC端如何配置呢,其实这个已经很简单了,对于PC机来说,可以认为“影子机IP : 影子机指定端口...阅读全文
Linux下两台机器scp无需密码传输

Linux下两台机器scp无需密码传输

前言

在工作中,经常需要发布代码到服务器,之前使用rz的方式上传zip的压缩包,可还是有些不智能,于是想到怎么通过scp的方式上传到服务器。于是我就想到使用git bash的scp方法来操作,使用过scp的都知道需要指定远端服务器的帐号并手动输入密码,下面就讲一下如何避免每次都需要输入密码这个操作。

建立ssh的信任关系

在这里先介绍两个概念:SSH公钥(~/.ssh/id_rsa.pub)和公钥授权文件(~/.ssh/authorized_keys),这两个文件的作用具体可以参考ssh的man手册
~/.ssh/id_rsa.pub        Contains the public key for authentication.  These files are not sensitive and can (but need not) be readable by anyone.​~/.ssh/authorized_keys        Lists the public keys (DSA/ECDSA/RSA) that can be used for logging in as this user.  The format of this file is described in the sshd(8) manual page.  This file is not highly sensitive, but the recommended permissions are read/write for the user, and not accessible by others.
从描述中我们可以知道,~/.ssh/id_rsa.pub文件中包含了认证的公钥信息,而且该文件可以被任何人读取;而~/.ssh/authorized_keys文件中则列举了登录用户的公钥信息(换句话说就是使用这些公钥信息可以登录当前设备),而为了安全考虑,该文件一般建议只有本用户可以有读写权限(这条信息很关键,后面会讲)。

公钥和私钥

提到公钥对应的就会有私钥,在谈这两个概念之前我们先了解另外一组概念...阅读全文
通过nginx防止xmlrpc.php攻击

通过nginx防止xmlrpc.php攻击

最近在博客后台发现有一些ip的访问量特别大,排查nginx日志发现基本都是xmlrpc攻击xmlrpc.php攻击可以绕过使用用户名登陆限制,进行暴力破解。在不想修改wordpress代码的情况下,使用nginx限制是最好的办法。不建议删除xmlrpc.php文件,因为可能造成莫名其妙的错误
  • 方法
nginx直接禁止访问该文件
locatio* /xmlrpc.phdenall;
  • 方法
通过跳转或重定向转移流量,这样可以引流到你希望引流到目标的网址或者i
locatio* /xmlrpc.phproxy_pashttps://www.baidu.com;
阅读全文
pip 安装以及使用

pip 安装以及使用

pip官网https://pypi.python.org/pypi/pippip有点类似RedHat里面的yum,安装Python包非常方便。本节详细介绍pip的安装、以及使用方法。

安装

linu

执行下列命令
wgehttps://bootstrap.pypa.io/get-pip.ppython get-pip.p

window

  1. 确定python已经配置到环境变量
  2. 在官网下载 get-pip.p
  3. 在命令行输入 python get-pip.p
更详细的介绍,请在官网查阅

使用

通过pip help可以很清楚的看到使用方法
[gaoxuan@AY140416102243006a45Z ~]$ pip help​Usage:pip <command> [options]​Commands:install                     Install packages.uninstall                   Uninstall packages.freeze                      Output installed packages in requirements format.list                        List installed packages.show                        Show information about installed packages.search                      Search PyPI for packages.wheel                       Build wheels from your requirements.help                        Show help for commands.​General Options:-h, --help                  Show help.--isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.-v, --verbose               Give more output. Option is additive, and can be used up to 3 times.-V, --version               Show version and exit.-q, --quiet                 Give less output.--log <path>                Path to a verbose appending log.--proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.--retries <retries>         Maximum number of retries each connection should attempt (default 5 times).--timeout <sec>             Set the socket timeout (default 15 seconds).--exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.--trusted-host <hostname>   Mark this host as trusted, even though it does not have valid or any HTTPS.--cert <path>               Path to alternate CA bundle.--client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.--cache-dir <dir>           Store the cache data in <dir>.--no-cache-dir              Disable the cache.--disable-pip-version-check                             Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.
阅读全文
【Chris Richardson 微服务系列】使用微服务重构单体应用

【Chris Richardson 微服务系列】使用微服务重构单体应用

编者的话 本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的最后一篇。第一篇介绍了微服务架构模块,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务的不同方面,包括使用 API 网关、进程间通讯、服务发现、事件驱动的数据管理,以及部署微服务。本篇将讨论从单体应用迁移到微服务的策略。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2.构建微服务架构:使用 API Gateway3.深入微服务架构的进程间通信4.服务发现的可行方案以及实践案例5.微服务的事件驱动数据管理6.选择微服务部署策略7. 将单体应用改造为微服务(本篇文章

使用微服务重构概述

将单体应用转变为微服务的过程也是将应用现代化的过程,数十年来开发者们一直致力于此。因此,当把应用重构为微服务的时候...阅读全文
【Chris Richardson 微服务系列】选择微服务部署策略

【Chris Richardson 微服务系列】选择微服务部署策略

编者的话 本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第六篇文章。第一篇介绍了微服务架构模式,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务的不同方面,包括使用 API 网关、进程间通讯、服务发现和事件驱动的数据管理。这篇文章将深入讨论部署微服务的策略。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2.构建微服务架构:使用 API Gateway3.深入微服务架构的进程间通信4.服务发现的可行方案以及实践案例5.微服务的事件驱动数据管理6. 选择微服务部署策略(本篇文章7.将单体应用改造为微服务

诱因

部署单体应用意味着运行大型应用的多个相同副本,通常提供若干台(N)服务器(物理机或虚拟机),在每台服务器上运行若干个(M)应用实例。部署单体应用并不总...阅读全文
【Chris Richardson 微服务系列】事件驱动的数据管理

【Chris Richardson 微服务系列】事件驱动的数据管理

编者的话 本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章。第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点;第二和第三篇描述了微服务架构模块间通讯的不同方面;第四篇研究了服务发现中的问题。本篇研究微服务架构带来的分布式数据管理问题
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2.构建微服务架构:使用 API Gateway3.深入微服务架构的进程间通信4.服务发现的可行方案以及实践案例5. 微服务的事件驱动数据管理(本篇文章6.选择微服务部署策略7.将单体应用改造为微服务

微服务以及分布式数据管理中存在的问题

单体应用通常使用单个关系型数据库,由此带来的好处在于应用能够使用 ACID 事务,后者提供了重要的操作特性
  • 原子化:原子粒度的更改...
阅读全文