如何使用 frp 实现内网穿透

背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了。但是局域网的设备怎么被外网访问呢?这就靠内网穿透来实现了。 内网穿透又叫 NAT 穿透,常用的工具有很多,比如 ngrok、花生壳、frp等,因为我使用的是 frp,这也是本篇文章的主题。 NAT 是在 IP 数据包通过路由器或防火墙的时候重写 IP 地址的技术。因为现在的公网 IP 数量有限,国家不能给每个设备分配一个公网 IP,所以只能多台计算机共用一个公...阅读全文

掘金 2020年05月15日 平也

[译] 如何写好 Go 代码

原文:scene-si.org/2018/07/24/… 我写了多年的 Go 微服务,并在写完两本关于 (API Foundations in Go 和 12 Factor Applications with Docker and Go) 主题的书之后,有了一些关于如何写好 Go 代码的想法 但首先,我想给阅读这篇文章的读者解释一点。好代码是主观的。你可能对于好代码这一点,有完全不同的想法,而我们可能只对其中一部分意见一致。另一方面,我们可能都没有错,只是我们从两个角度出发,从而选择了不同的方式...阅读全文

掘金 2020年05月18日 咔叽咔叽

Go语言学习历程——Go语言基础语法入门

GO语言特性开发者使用编程语言的三大分类(执行速度,简易程度,开发难度)1.执行速度快、编译速度慢(编译型):C,C++2.执行速度较慢,编译速度快(解释型):JAVA,.NET3.执行速度慢,开发难度小(动态脚本):Python,PHPGO语言在三个条件做了平衡:易于开发,快速编译,高效执行1.helloworldpackage mainimport "fmt"func main { fmt.Println("hello world")}注意: 1.如果需要将程序编译成二进制程序,要将包名写成...阅读全文

51CTO博客 2020-05-16 17:59:00 wujunqi1996

M的状态转换

声明 下面的分析均基于Golang1.14版本。 M的状态 M只有Running和Stop这2个状态,还有一个spinning中间态,当从Running转为Stop时,会先spinning寻找可运行的G,如果找不到则进入Stop。 M状态转换 主要流程 1.mstart,Go程序初始化时,第一个M是由mstart创建,新的物理线程创建时,调用的函数也是mstart。 2.startm,当有新的G创建或者有G从waiting进入running且还有空闲的P,此时会调用startm,获取一个M和空闲...阅读全文

简书 2020-05-16 23:32:46 不争_900c

API 网关 Kong

什么是 API 网关? 所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层。 为什么需要网关层?最初是单体服务时,客户端发起的所有请求都可以直接请求到该服务,但随着产品用户越来越多,单体应用存在显而易见的单点问题,除此之外,当单体应用大小升至几个 G 时,持续发布将会非常缓慢,所以服务的拆分成为了必然趋势。 当服务拆分为多个之后,我们不得不面临一个问题,就是如何控制用户请求到对应服务节点,于是网关层应运而生,它不仅可以负责负载均衡,还可以...阅读全文

Segmentfault 2020-05-22 13:32:40 平也

Golang笔记-单元测试test初探

为什么需要单元测试 其实在很长一段时间,包括现在,我都很不喜欢写单元测试。因为维护单元测试的成本很高。只有接口做了一点变更,那么单元测试就必须做相同的变更,否则会导致测试不通过。 那么反过来,只要每次在提交代码都去运行一次单元测试。这样可以很快的检查到你对代码更改是否影响了正常的业务逻辑,当然很大一部分是可能是别人写的那部分代码。因为你不确定本次的修改是否会影响到别人的那部分。所以单元测试还是很有必要的。 单元测试最基本的应用 go语言中单元测试是开箱即用的,官方提供了test包。不用像PHP中...阅读全文

Segmentfault 2020-05-22 07:32:34 旧梦发癫

emacs 中go的自动补全

之前一直使用的是 gocode (https://github.com/nsf/gocode ), 后来项目不维护了让用 https://github.com/mdempsky/gocode, 然后这个项目又不维护了,让用 https://github.com/stamblerre/gocode, 然后这个项目也不维护了,都一齐推荐使用 gopls. gopls 的介绍见 https://github.com/golang/tools/blob/master/gopls/README.md, 从...阅读全文

简书 2020-05-16 21:33:08 圣斗士皮皮

Golang 中 url.Values.Encode() 引发的问题

缘起是一个http签名方法,客户端对 http 的参数签名,然后服务器验证签名。然后突然测试出当提交的内容中含有空格时,服务器就验签失败。 查询了客户端签名的过程数据,然后和服务器的验签步骤查看了下,居然是客户端在签名前数据中的空格被格式化为了 "%20", 而 golang 服务器是用 url.Values.Encode() 方法导致空格变成了 "+" 号。 问题就是这儿了, 空格无论是哪种 escape, 似乎都有标准可依。两个标准,难分对错。而且golang 还提供了两种 escape 标...阅读全文

简书 2020-05-16 21:33:08 圣斗士皮皮

架构师小飞传第三弹 - Golang的原生RPC与Node.js通讯

背景 621589303026_.pic_hd.jpg 小飞休息的时候也喜欢搞一些自己的小项目。花了几天的时间,小飞搞出了一套系统门户网站。其中包括广告管理,新闻管理,用户中心,统一登录,图片PaaS服务。 image.png HTTP + RPC 小飞觉得,服务间通讯,Web和服务之间通讯都使用HTTP协议,未免觉得有点LOW。于是乎小飞决定WEB和服务间用HTTP通讯,而服务之间用Go的RPC协议通讯。这样写又面临着一个问题,一个服务要监听2个端口,一个是HTTP端口,另一个是RPC的端口。...阅读全文

简书 2020-05-16 21:33:08 L雷克斯

如何设计和实现微信公众号关注互动后48小时内定时给粉丝推送客服消息?

问题背景很多人可能会留意到, 关注了公众号之后,隔一段时间, 公众号会推送消息出来,打开消息后发现这些消息看起来不像人工发送的,应该是设计好的一套关注后的定时推送机制, 从而来达到获客转化的目的. 我司微星极光的一个重磅产品, 公众号激活宝, 目前就以第三方平台的形式给各个服务号公众号提供了这样的赋能.效果如下图 本文主要介绍如何实现这种推送机制的技术方案技术选型思路定时调度数据库轮询这种是很容易想到方案, 有点是简单粗暴, 缺点也同样明显, 效率低下, 适合在用户量很少的时候,顶一顶. 一般草...阅读全文

简书 2020-05-16 21:32:54 gorouting

Go语言学习-helloworld

之前学过一段时间的python,偶然的情况下接触到go语言。得知高性能,高并发,完美跨平台的优势,决定开始入手go语言学习。 首先,需要下载安装go。 https://golang.google.cn/dl/ 安装完成后,可以用命令查看是否安装成功。 打开终端,输入如下 go version // 查看版本 go env // 查看配置 接下来可以开始我们的第一个程序啦。 编写一个 hello world。需要注意文件名需要为 .go 结尾。 package main func main() {...阅读全文

简书 2020-05-16 21:32:50 阿巴砝特

Filbeat介绍

Filebeat 介绍 概要 Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。 Filebeat 的可靠性很强,可以保证日志 At least once 的上报,同时也考虑了日志搜集中的各类问题,例如日志断点续读、文件名更改、日志 Truncated 等。 Filebeat 并不依赖于 ElasticSearch,可以单独存...阅读全文

简书 2020-05-16 21:32:50 blankjee

Golang基础语法:字符与字符串(三)--十安辰

Golang基础语法:字符与字符串(三) 字符 字符基本介绍 ​ Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。这点不同于c和c++使用char来存储。 ​ Golang 使用的是UTF-8的Unicode编码,可以很方便地表示汉字,如果有小伙伴学过python就知道,python源代码上面总是有一行 \# -*- coding: UTF-8 -*-代码,这行代码就是引入了中文编码,这样你在控制台打印中文字符的时候才不会报错,而Golang是21世纪的新语...阅读全文

简书 2020-05-16 21:32:48 十安辰

Go语言的安装及配置 VScode环境

Windows 软件下载 https://studygolang.com/dl 安装 双击安装下一步下一步 创建 工作目录 例: 根目录新建Go_WorkSpace目录 Go_WorkSpace目录新建golang golang目录新建 bin,src,pkg三个目录 环境变量 计算机--->(右键--->属性)高级系统设置--->(高级 页面)环境变量 --->用户变量 新建 GOPATH D:\Go_WorkSpace\golang 安装VScode 自行安装 安装插件 1.打开VSCode...阅读全文

简书 2020-05-16 21:32:47 五帝星一

P的状态转换

声明 下面的分析均基于Golang1.14版本。 状态图 P状态图 主要流程 1.procresize创建,Go程序初始化时初始CPU数量个P。 2.acquirep进入运行状态。当有新的G创建或waiting状态的G变得可运行,并且有P空闲时,通过acquirep获取p来运行最新的G。 3.entersyscall,进入系统调用状态。当P绑定的M正在运行的G进入系统调用状态,P也随之进入系统调用状态。 4.exitsyscallfast,退出系统调用状态。如果G快速退出系统调用,此时P理应等待...阅读全文

简书 2020-05-16 15:32:44 不争_900c

用golang写一个简单的游戏(二)

上篇文章写到了,我已经打印出了一个从起点到终点的路径,并且这是受键盘事件控制的。今天我会继续给这个游戏添加一些东西,让它看起来像个“游戏”。 现在我要加上一个障碍,不是随便一条路径都可以从起点到终点,这个障碍就姑且叫它“炸弹”,我赋给它的规则是,它的上下左右(称之为陷阱)及它本身不能经过,必须绕着走。即如图: boom.png 添加这个道具,我有几个改动的地方,如下: 获取每个关卡的参数,增加了炸弹的位置和周围陷阱的位置,结构体变成了这样子: type RoundParams struct { ...阅读全文

简书 2020-05-16 11:32:45 onepunchgo

Golang Tips

Go的数组只能有固定的长度,传入变量作为数组长度时,只能创建为定义了size的切片 length := 5 array := [length]int // error: non-constant array bound length array := make([]int, length) Go没有内置的比较整数大笑的方法,需要自己实现 func max(a int, b int) int { if a >= b { return a } else { return b } } Go没有内置的判...阅读全文

简书 2020-05-16 02:32:43 Lyudmilalala