Go语言中文网 为您找到相关结果 83

Goroutine + Channel 实践

背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及channel所提供的语言层级的特性,正好可以满足这方面的需要。 goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine的调度是有Golang运行时进行管理的。启动thread虽然比process所需的资源要少,但是多个thread之间...阅读全文

博文 2015-02-25 12:37:01 Qu Xiao

基于go语言的消息推送系统架构分析

本系统是猎豹移动基于go语言开发的一套消息推送系统,源码地址:https://github.com/Terry-Mao/goim 一、架构图 二、功能简介 1.comet 长连接服务器,支持长轮训、tcp、websocket连接,有超时机制 2.logic 逻辑处理服务器,消息推送入口,通过userId在router服务器中查找对应的comet服务器,将serverId和消息一起保存到kafka队列,logic是无状态服务器,可以随意增删,因为comet需要连接logic,所以在comet服务器中需要连接logic的通过LVS的虚IP,LVS加了real server后不会断开,所以需要在comet服务触发SIGHUP,重新load配置文件。 3.router 路由服务器,保存userId和...阅读全文

博文 2015-10-24 19:00:05 qinyongbo

golang 使用 gomail 发送邮件

下面以阿里云邮箱为例, 如果使用的是qq邮箱的话需要把mailConn里面的host改成'smpt.qq.com',user 填写qq邮箱地址, pass需要填写你在qq邮箱设置里面获取到的授权码,qq邮箱需要先去邮箱设置里面开通smtp支持,然后获取授权码。然后就可以用qq邮箱发送了。 安装gomail go get gopkg.in/gomail.v2 package main import ( "gopkg.in/gomail.v2" "strconv" ) func SendMail(mailTo []string,subject string, body string ) error { //定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码 mailConn...阅读全文

博文 2018-11-06 18:35:49 woahjknes

Golang实现一个微信抽奖小程序后台

一、后台整体架构小程序和后台间使用https通信,保证安全性,这也是为了满足小程序官方的硬性规定。腾讯负载均衡作为后台入口有几个好处:帮助处理https的流量,然后解密后再将请求通过http转发给后端的服务器,简化了逻辑,减少了https对后台服务的性能影响,同时还能配置进行动态的伸缩。负载均衡将请求通过http转发给cvm进行处理。nginx做了个反向代理,go服务端跑在本地。使用腾讯云的redis和mysql数据库。redis用于频繁的用户鉴权等,mysql保存常规数据。这样的设计在抽奖这种情境下,已经能保证足够的并发和流量了。如果想提高并发量,可以通过配置负载均衡来进行动态伸缩,然后增加云数据库的处理能力。有时间再写下怎么进行性能评测和相应的提高并发量的升级。更多go语言内容请关注:h...阅读全文

博文 2019-07-05 19:32:51 CC_ab48

[golang]为什么Response.Body需要被关闭

Body io.ReadCloser The http Client and Transport guarantee that Body is always non-nil, even on responses without a body or responses with a zero-length body. It is the caller's responsibility to close Body. The default HTTP client's Transport does not attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections ("keep-alive") unless the Body is read to c...阅读全文

博文 2017-05-28 16:07:41 一桶冷水

Golang动手写一个Http Proxy

本文主要使用Golang实现一个可用但不够标准,支持basic authentication的http代理服务。 为何说不够标准,在HTTP/1.1 RFC中,有些关于代理实现标准的条目在本文中不考虑。 Http Proxy是如何代理我们的请求 Http 请求的代理如下图,Http Proxy只需要将接收到的请求转发给服务器,然后把服务器的响应,转发给客户端即可。 Https 请求的代理如下图,客户端首先需要发送一个Http CONNECT请求到Http Proxy,Http Proxy建立一条TCP连接到指定的服务器,然后响应200告诉客户端连接建立完成,之后客户端就可以与服务器进行SSL握手和传输加密的Http数据了。 为何需要CONNECT请求? 因为Http Proxy不是真正的服务...阅读全文

博文 2017-09-17 13:11:26 杨锡坤

webhook 是什么以及如何创建

我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/webhook/1.png) 那么,webhook 究竟是什么呢?webhook 是应用给其它应用提供实时信息的一种方式。信息一产生,webhook 就会把它发送给已经注册的应用,这就意味着你能实时得到数据。不像传统的 APIs 方式,你需要用轮询的方式来获得尽可能实时的数据。这一点使得 webhook 不管是在发送端还是接收端都非常高效。由...阅读全文

博文 2018-09-25 10:05:16 jettyhan

人工智能聊天机器人Olivia

Olivia 是带有人工神经网络的人工智能聊天机器人。 ![image](https://static.oschina.net/uploads/space/2019/0617/141938_28Mx_4105562.png) ### 使用 要使用 REST Api,必须使用两个参数建立对 `/api/response` 的 `POST` 请求: * `sentence` 这是要发送给 Olivia 的消息 * `authorId` 这是一个任意 ID,用于标识用户进行上下文聊天 ### 示例

curl -X POST 'https://olivia-api.herokuapp.com/api/response' --data "...阅读全文

Go http.StripPrefix在File Server中的用途

一. 保持代码的整洁和进行合理的分流 http.StripPrefix函数的作用之一,就是在将请求定向到你通过参数指定的请求处理处之前,将特定的prefix从URL中过滤出去。下面是一个浏览器或HTTP客户端请求资源的例子: /static/example.txt StripPrefix 函数将会过滤掉/static/,并将修改过的请求定向到http.FileServer所返回的Handler中去,因此请求的资源将会是: /example.txt http.FileServer 返回的Handler将会进行查找,并将与文件夹或文件系统有关的内容以参数的形式返回给你(在这里你将"static"作为静态文件的根目录)。因为你的"example.txt"文件在静态目录中,你必须定义一个相对路径去获...阅读全文

博文 2016-12-23 10:00:01 吃一堑消化不良

go语言捕获panic异常并转化为error

package main import ( "fmt" "errors" ) func testPanic2Error() (err error) { //捕获 and 恢复 panic. /*注意defer延迟执行的函数可以修改外围函数“testPanic2Error”的命名返回值. *通过调用recover捕获panic并转化为error. 也许有人打算在main函数中放一个下面这个defer语句,用于捕获程序中的一切panic异常, *建立最后一道防火墙,从而使程序避免崩溃运行下去, 但很不幸, 当main函数的defer延迟函数被执行时,也就意味着main函数要退出了, *此时再捕获panic恢复程序,意义还有多大呢;不过我们有办法克服, 建立一个像“testPanic2Error”...阅读全文

博文 2016-03-27 10:00:04 htyu_0203_39

golang 支付宝SHA1withRSA加密

SHA1大家用的挺多,RSA不多但用的也有,但像支付宝这样要求 SHA1 + RSA的恐怕就没几个了,写起来实在痛苦。而且一搜一片,却没几个能跑起来的。 刚才有个人在QQ上加我,问之前在支付宝集成的帖子里的SHA1withRSA是咋解决的。说实话,不是专门研究加密的,鬼知道报的错是什么玩意,比如这个: signature, err := rsa.SignPKCS1v15(rand.Reader, this.privateKey, crypto.SHA1, hashed) //ParsePKCS8PrivateKey err asn1: structure error: tags don't match (16 vs {class:0 tag:2 length:129 isCompound:f...阅读全文

博文 2016-11-29 01:00:02 u012210379

golang复用http.request.body

问题及场景 业务当中有需要分发http.request.body的场景。比如微信回调消息只能指定一个地址,所以期望可以复制一份消息发给其他服务。由服务B和接收微信回调的服务A一起处理微信回调信息。 解决思路 最开始考虑的是直接转发http.request。使用ReverseProxy直接将http.request由服务A转发给服务B。但是微信涉及到验证等问题,完全调整好非常麻烦。所以转换思路,打算将http.request.body的内容直接post给服务B。 可是http.request是readcloser。我们将http.request readAll的时候讲无法再次读取http.request里面的信息。 如何才能将http.request.body复制使用呢? 其中c表示的是htt...阅读全文

博文 2018-10-20 18:34:42 ppmoon

征集令 | “云原生技术实践黑客松”即将开战,赛题由你定!

9月,坐标北京。CNBPA(云原生技术实践联盟)与灵雀云要一起搞事情了! 9月6-8日,由CNBPA(云原生技术实践联盟)与灵雀云共同发起的“2019云原生技术实践黑客松编程比赛”将在北京开战!我们希望通过一场以“云原生技术实践”为主题的黑客松活动,为当今云原生领域相关的技术热点、企业转型升级中遇到的迫切需求,寻找新的创意和算法,帮助解决技术落地过程中遇到的实际问题! 赛制说明 7月9日--8月8日 项目征集 本次活动欢迎云原生技术相关领域厂商、互联网厂商、各行业软件开发商、云原生技术终端用户共同参与,进行大赛的项目命题并提供环境、相关场景、专家资源的支持。参与企业将作为本次黑客松大赛的战略合作伙伴! 7月15日-8月15日 选手报名 选手可关注“云原生技术社区”公众号,后续公众号会发布“黑...阅读全文

Go 后台开发常用工具

go 常用包 dlv 远程调试 https://github.com/derekparke... dogo 文件监控 https://github.com/liudng/dog... Goland 优点: 可以配置项目级的 gopath 可以run单个文件,同一个文件夹下可以有多个入口文件 常用功能 自动上传到服务器。在setting中找到Deployment,设置远程服务器的ip和端口,用户名与密码,还有对应的路径。在tools中设置保存后自动上传。 远程断点调试。IDE右上角Edit Configurations...,新建一个go remote,远程服务按照提示启动,在本机打断点就可以调试远程的服务了。 如果有跳板机的话,则需要额外设置一下。 常用插件 Remote Hosts Acc...阅读全文

博文 2018-11-25 19:34:39 西山雨

golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网页作为用户页面

golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网页作为用户页面 1.整个工程结构如图: 其中:mainup.go是监听本地等待用户接入实现上传的服务端程序,mainup.exe是相应的可执行文件。 maindown.go是监听本地等待开发者接入实现查看所有上传的文件并且下载删除的服务端程序。 indexup.html是呈献给用户上传文件的网页,indexdown.html是查看所有上传的文件,进行删除下载的服务端程序。 static文件夹里面包含了引用的库 files文件夹存放上传的文档。 2.源码 mainup.go和maindown.go文件都引用了gin包,我这里已经从github上下载到本地了。下载源码后用户记得自己设置下载gin包。 github一直传不上,...阅读全文

博文 2016-06-26 20:00:01 su_sai

gopush-cluster 架构

前言 gopush-cluster是一套golang开发的实时消息推送集群,主要分享一下开发这套系统的想法和思路。 架构 主要分为三个模块来开发,comet/web/message。 comet 主要负责消息排队、消息推送以及和客户端的连接维护;整套系统依据是消息ID顺序原则获取消息(客户端本地获取最大的消息是1,那么之后获取的消息就是大于1的,获取离线消息的时候也要从上次最大消息ID来获取),因此消息推送以后需要在comet中排队然后发起RPC给message实现存储。 message 主要负责消息的存储和读写;接受来自comet模块的消息进行持久化,或者接受web模块的读取消息请求获取离线消息。message是可以部署多个节点来负载来自大量comet的推送压力,比如不同的comet使用不...阅读全文

博文 2014-10-04 19:26:28 bhtfg538

服务发现之Consul

consul是一个可以提供服务发现,健康检查,多数据中心,Key/Value存储等功能的分布式服务框架 用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、Windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。 Consul 的使用场景 docker 实例的注册与配置共享 coreos 实例的注册与配置共享 vitess 集群 SaaS 应用的配置共享 ...阅读全文

博文 2018-10-12 18:34:40 Kernel_Panic

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-23 18:00:07 sheepbao

Mesos 架构以及源码浅析

Mesos 按照官方的介绍,是分布式操作系统的内核。目标是 ”Program against your datacenter like it’s a single pool of resources”,即可以将整个数据中心当做一台电脑一样使用。可以说这个目标是所有宣称自己是DCOS的系统的共同目标,本文从架构和源码层面分析Mesos以及周边框架,看看Mesos是如何实现这个目标的,当前距这个目标还有多大差距。最后比较了一下Mesos和Kubernetes这两个都受Google的Borg影响的系统的异同。 阅读对象:对Mesos或者分布式系统感兴趣的技术人 设计理念以及架构 引用Mesos paper里的一句话,来说明Mesos的设计理念: define a minimal interface...阅读全文

博文 2017-02-09 19:54:11 jolestar

Go中的系统Signal处理

Go中的系统Signal处理 九 21 bigwhite技术志 Blog, Blogger, C, Daemon, Debian, Go, Golang, Google, Interface, Linux, map, Opensource, Programmer, Redhat, Signal, Slice, Ubuntu, Unix, 信号, 切片, 博客, 开源, 接口, 程序员, 结构体, 编程,语言 2 Comments 我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出,即kill pragram-pid。我们在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清...阅读全文

博文 2014-11-29 09:36:42 bigwhite

关于session,求帮忙找找错

登陆时进入loginin,密码正确后创建session,返回true。网页端拿到true后跳转到第二张页面,验证session,此时从firebug上就看不到请求,拿到的session也为空,很奇怪,不知道哪里错了。想请大家帮忙看看 func sessionCreate(w http.ResponseWriter, r *http.Request, username string) { //创建session state := string(random.NewRandomEx()) //生成服务器端随机数 fmt.Println("state:", state) sidBytes, err := id.NewSessionId() //生成客户端随机数 if err ...阅读全文

Go 语言的缓冲通道:提示和技巧

Mahadevan Ramachandran • January 15 通道和 goroutine 是 Go 语言基于 CSP( communicating sequential processes ,通信顺序进程)并发机制的核心部分。阅读本文可以学到一些关于channel的提示和技巧,尤其是“缓冲” channel ,在 “生产者-消费者” 情境中广泛使用了缓冲通道作为队列。 ## 缓冲通道 = 队列 缓冲通道是固定容量的先进先出(FIFO)队列。容量在队列创建的时候就已经固定——其大小不能在运行时更改。 ```go queue := make(chan Item, 10) // queue 的容量是 10 ``` queue 中的一个元素最大可高达 64 KiB , 而且 queue 可...阅读全文

博文 2018-02-13 10:56:07 polaris

分布式弹幕服务架构

今天简单记录一下弹幕服务器的设计思路,希望对大家有所帮助。 业务特点 弹幕典型的进少出多场景,一个房间如果有10W观众,每秒提交的弹幕也许只有1000次,但是广播弹幕给所有观众需要1000 * 10W次。 单机模型 为了推送消息,长连接几乎是必然的选择。 每个房间有若干观众,所有房间的观众都连接在1个服务进程上。 当弹幕提交上来,根据房间找出所有房间内的在线用户,循环将弹幕推送给他们。 假设1个服务进程的消息网络吞吐能力是50万次/秒,那么一个10万观众的房间,每秒提交5次弹幕就会达到服务端极限性能。 多机模型 假设一个直播间仍旧有10万人在线,希望解决每秒5次弹幕就达到性能瓶颈的问题,很容易想到能否横向扩展解决。 假设现在有2台服务器,10万人均匀连接在2台服务器上,也就是一台有5万人在线...阅读全文

博文 2017-11-22 02:30:07 鱼儿的博客

gopush-cluster 架构

前言 gopush-cluster是一套golang开发的实时消息推送集群,主要分享一下开发这套系统的想法和思路。 架构 主要分为三个模块来开发,comet/web/message。 comet 主要负责消息排队、消息推送以及和客户端的连接维护;整套系统依据是消息ID顺序原则获取消息(客户端本地获取最大的消息是1,那么之后获取的消息就是大于1的,获取离线消息的时候也要从上次最大消息ID来获取),因此消息推送以后需要在comet中排队然后发起RPC给message实现存储。 message 主要负责消息的存储和读写;接受来自comet模块的消息进行持久化,或者接受web模块的读取消息请求获取离线消息。message是可以部署多个节点来负载来自大量comet的推送压力,比如不同的comet使用不...阅读全文

博文 2015-08-04 03:00:01 hezhixiong

Rboot 文档--简介

Rboot 助手机器人 =================================================================== * ________ ____ ____ ____ ______ ________ ____ ______ * * ___/ __ \/ __ )/ __ \/ __ \/_ __/ ___/ __ )/ __ \/_ __/ * * __/ /_/ / __ / / / / / / / / / __/ __ / / / / / / * * _/ _ _/ /_/ / /_/ / /_/ / / / _/ /_/ / /_/ / / / * * /_/ |_/_____/\____/\____/ /_/ /_____/\____/ /...阅读全文

博文 2020-01-19 23:32:44 chca

lighttpd 集成 golang

lighttpd 集成 golang Author: nullchen Email: 526624974@qq.com 简介: 我们业务用fastcgi做接入,抽空研究了下fcgi如何运行在httpserver之上,主要是fcgi与httpserver的通信,在这里简单的记录一下。由于qzhttp是非开源的,这里以lighttpd位对象,进行学习。本文分两部分,第一部分简单的分析lighttpd如何与fastcgi应用通信,在此基础上,第二部分位了对第一部分的结论进行验证,简单的将golang用fastcgi的方式集成到lighttpd中,让lighttpd管理golang进程,从而实现 多进程+多线程+多协程 的模式。 第一部分 为了描述清楚,我们首先按照功能进行角色划分如下: fastc...阅读全文

博文 2014-10-04 19:26:53 dadada110

如何深入的理解gorountine的执行效率问题?

执行环境:window7/64 , go1.4 在学习go的gorountine时执行的例子: ``` package main import "fmt" func sum(values [] int, resultChan chan int) { sum := 0 for _, value := range values { sum += value } resultChan <- sum // 将计算结果发送到channel中 } func main() { values := [] int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} resultChan := make(chan int, 2) ...阅读全文

并发编程

抛砖引玉,同大家一起交流;可能会从两个大方向上来开始:一是来看看为什么并发编程难,包括涉及的一些基础硬件和操作系统相关的一点知识;二是一起来分析一下常同的并发模型,我们怎么通一个简单高效的并发模型来写出简单的并发实现(如线程与锁/actor/csp/);并发与并行并发:是逻辑上发生的同时;如一个处理器同时处理多个任务,CPU时间片发生切换并行:是物理上发生的同时;是多核处理器同时处理多个任务; 系统硬件体系架构 这里做一个假设,如果CPU1在对一个变量执行一个CAS的操作,而该变量的缓存行是在CPU7的高速缓存里面,那么可能的执行顺序可能是:CPU1检查本地高速缓存,没有找到缓存行;请求转发到CPU0与CPU1的互联模块,检查CPU0的本地高速缓存,没有找到缓存行;请求转发到系统互联模块,检...阅读全文

博文 2018-09-04 13:36:10 Jimmy_查查

golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网页作为用户页面

golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网页作为用户页面 1.整个工程结构如图: 其中:mainup.go是监听本地等待用户接入实现上传的服务端程序,mainup.exe是相应的可执行文件。 maindown.go是监听本地等待开发者接入实现查看所有上传的文件并且下载删除的服务端程序。 indexup.html是呈献给用户上传文件的网页,indexdown.html是查看所有上传的文件,进行删除下载的服务端程序。 static文件夹里面包含了引用的库 files文件夹存放上传的文档。 2.源码 mainup.go和maindown.go文件都引用了gin包,我这里已经从github上下载到本地了。下载源码后用户记得自己设置下载gin包。 github一直传不上,...阅读全文

博文 2016-08-24 14:00:03 su_sai

Golang -- Signal处理

我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出,即kill pragram-pid。我们在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清理程序或通知各个子进程做自清理。kill -9强制杀掉程序是不能被接受的,那样会导致某些处理过程被强制中断,留下无法恢复的现场,导致消息被破坏,影响下次系统启动运行。 最近用Golang实现的一个代理程序也需要优雅退出,因此我尝试了解了一下Golang中对系统Signal的处理方式,这里和大家分享。Golang 的系统信号处理主要涉及os包、os.signal包以及syscall包。其中最主要的函数是signal包中的Notify...阅读全文

博文 2017-07-20 04:00:03 logo-fox

grom源码分析

gorm是用golang写的数据库orm库,目前golang写的orm库也有很多,例如xorm,beego orm,gomybatis等,各有各的优势特点,看一下gorm对golang基础框架中数据库相关接口是如何封装的。gorm一般的初始化方式db,err:=gorm.Open("mysql","user:password@/dbname?charset=utf8&parseTime=True&loc=Local")iferr!=nil{ log.Errorf("init error!")}gorm中DB结构体的定义:// DB的结构体typeDBstruct{ sync.RWMutex// 锁 Valueinterface{}// 一般传入实际操作的表所对应的结构体 Errorerror...阅读全文

博文 2019-05-10 19:35:04 一只努力的微服务

用Go实现Redis之五持久化

写在前面 本文实现的Godis代码版本为:v0.1 Redis持久化方式 RDB持久化 BGSAVE和SAVE命令生成RDB文件,存储数据库信息。当服务器启动,RDB文件也会作为原始数据,加载近服务内存。这里存在一个优先级问题——当AOF持久化是打开状态,优先从AOF文件加载数据、还原数据库状态。 SAVE命令会阻塞服务,而BGSAVE派生独立进程,不会阻塞。同时可以通过选项配置自动执行RDB持久化的周期。 Redis服务端通过记录几个参数(如第一篇提到的server.dirty字段记录了上一次SAVE后经历了多少次数据库修改)维护数据库的修改情况。当周期性的后台操作serverCon执行时,会检查数据库的更新状态是否满足RDB持久化条件,依此保存数据库状态。注意:RDB的文件对数据库数据的...阅读全文

博文 2018-06-18 19:34:37 alphali

Golang RabbitMQ学习笔记(2 : 实现工作队列)

***生产者*** ```go package main import ( "github.com/streadway/amqp" "log" ) func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } func main() { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") failOnError(err, "连接RabbitMQ失败") defer conn.Close() ch, err := conn.Channe...阅读全文

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-24 13:00:03 sheepbao

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-22 23:00:04 sheepbao

SOFAMosn 无损重启/升级

说明,本文档基于 SOFAMosn 0.4.0 版本编写 前言 SOFAMosn 是一款采用 GoLang 开发的 Service Mesh 数据平面代理,由蚂蚁金服系统部网络团队、蚂蚁金服中间件团队、UC 大文娱团队共同开发,功能和定位类似 Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力;她通过模块化,分层解耦的设计,提供了可编程,事件机制,扩展性,高吞吐量的能力。 ——摘自《 SOFAMosn 的诞生和特性》 概述 总体上看,连接迁移的流程如下图: MOSN 通过 forkexec 生成 New MOSN MOSN 通过 domain socket 把 TCP fd 和请求数据发送给 New MOSN New MOSN 转发请求到后端(PUB2) 后端 回复响应到 New ...阅读全文

博文 2019-02-17 21:34:41 coordinate35

用 RoadRunner 加速 Laravel 应用

RoadRunner是一个用Go语言实现的高性能PSR-7服务器,你没看错,是Go语言实现的。 RoadRunner首先用Go实现了一个高性能的服务器,然后通过goridge IPC把请求转发给多个PHP CLI Worker,Worker会把请求重新封装成PSR-7 Request交给框架进行处理。 娱乐测试 使用siege测试Laravel的Welcome页面,250个并发用户,持续30秒,对比Nginx + FPM和RoadRunner。 Nginx + FPM: $ siege --no-parser -c 250 -t 30s http://127.0.0.1:3000/ > /dev/null ** SIEGE 4.0.4 ** Preparing 250 concurrent ...阅读全文

博文 2018-06-20 16:34:46 oraoto

RabbitMQ教程(译)-Publish/Subscribe

## 发布/订阅 **(使用Go客户端)** 在[上篇教程](https://bingjian-zhu.github.io/2019/09/01/RabbitMQ%E6%95%99%E7%A8%8B%EF%BC%88%E8%AF%91%EF%BC%89-Work-queues/)中,我们搭建了一个工作队列,每个任务只分发给一个工作者(worker)。在本篇教程中,我们要做的跟之前完全不一样 —— 分发一个消息给多个消费者(consumers)。这种模式被称为“发布/订阅”。 为了描述这种模式,我们将会构建一个简单的日志系统。它包括两个程序——第一个程序负责发送日志消息,第二个程序负责获取消息并输出内容。 在我们的这个日志系统中,所有正在运行的接收方程序都会接受消息。我...阅读全文

博文 2019-09-05 16:51:44 939496716

IRISnet发起币安DEX上币提案,助力赢50,000 IRIS大奖!

​ 致IRISnet社区成员:我们很高兴地宣布IRISnet(IRIS)现已正式在币安DEX提案并已生效。希望大家来支持本次的上币提案!IRIS Hub 是一个跨链服务枢纽,目前我们已经发布了链接IRIS Hub与币安链(DEX)的网关,并即将在Rainbow 钱包支持通过这个网关的实现双向转账。未来当在IBC(跨链通信协议)启动后,我们计划将此网关转变为IBC的中继。我们相信,IRIS Hub与DEX的整合可以为跨链生态系统带来许多创新机会。详情请看:我们为什么要链接IRIS Hub和币安DEX?但现在目前仅仅是进行了提案,所以我们需要你的帮助!下一步币安链的验证人将对提案进行投票。IRISnet和币安链的验证人们都期待看到我们社区在币安提案贴下的活跃参与,他们尤其关注投票数、回复和浏览量...阅读全文

博文 2019-10-18 10:33:02 aside section ._1OhGeD

go的websocket实现

websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接 RFC协议文档在:http://tools.ietf.org/html/rfc6455 握手阶段 握手阶段就是普通的HTTP 客户端发送消息: 1 2 3 4 5 6 7 GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Version: 13 服务端返回消息: 1 2 3 4 HTTP/1.1 101 Switching P...阅读全文

博文 2016-04-21 21:00:01 Decadent_2014

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-09-11 14:00:01 sheepbao

Go并发模式:管道和取消

地址:http://air.googol.im/2014/03/15/go-concurrency-patterns-pipelines-and-cancellation.html 译自http://blog.golang.org/pipelines。 这是Go官方blog的一篇文章,介绍了如何使用Go来编写并发程序,并按照程序的演化顺序,介绍了不同模式遇到的问题以及解决的问题。主要解释了用管道模式链接不同的线程,以及如何在某个线程取消工作时,保证所有线程以及管道资源的正常回收。 Go并发模式:管道和取消 作者:Sameer Ajmani,blog.golang.org,写于2014年3月13日。 介绍 Go本身提供的并发特性,可以轻松构建用于处理流数据的管道,从而高效利用I/O和多核CPU...阅读全文

博文 2017-02-09 13:30:46 googollee

GoLang SMTP Send Mail 发送邮件

发送邮件可以用smtp,也可以用gomail,下面是代码 1、SMTP package main import ( "fmt" "net/smtp" ) func main() { mailConn := map[string]string{ "user": "it@go.com", "pass": "password", "host": "smtp.go.com", "port": "25", } mailTo:="***@gmail.com" auth := smtp.PlainAuth("", mailConn["user"], mailConn["pass"], mailConn["host"]) err := smtp.SendMail(mailConn["host"]+":" +...阅读全文

golang实现RPC调用

RPC远程调用 RPC通信过程 调用者(客户端Client)以本地调用的方式发起调用 Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体; Client stub将消息体通过网络发送给服务端; Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数; Server stub根据方法名和参数进行本地调用; 被调用者(Server)本地调用执行后将结果返回给server stub; Server stub将返回值打包编码成消息 通过网络发送给客户端 Client stub收到消息后,进行拆包解码,返回给Client; Client得到本次RPC调用的最终结果. RPC实现 serv...阅读全文

博文 2020-02-22 19:32:47 JN_golang

Golang使用gomail发送邮件

使用gomail发送邮件 下载gomail包:go get gopkg.in/gomail.v2 import ( "gopkg.in/gomail.v2" ) const ( // 邮件服务器地址 MAIL_HOST = "smtp.126.com" // 端口 MAIL_PORT = 465 // 发送邮件用户账号 MAIL_USER = "username@126.com" // 授权密码 MAIL_PWD = "" ) func SendMail(mailAddress []string, subject string, body string) error { m := gomail.NewMessage() // 这种方式可以添加别名,即“126 mail”, 也可以直接用阅读全文

博文 2020-04-07 15:32:45 是个懒人

ETCD探索-Watch

ETCD探索-Watch 梗概 watch是mvcc包中的一个功能,之所以拿出来说,是因为它确实有很重的逻辑。watch是监听一个或一组key,key的任何变化都会发出消息。某种意义上讲,这就是发布订阅模式。 对比 既然Watch机制就是发布订阅模式,我们通过对比Kafka,来更深入了解Watch。首先说明结论: ETCD没有消费者组的概念,所以不能代替Kafka 对比其他方面呢: ETCD Kafka 消费方式 监听一个Key 订阅一个Topic 生产方式 Put(Key, Value) Produce(Topic, Message) 历史消息是否保留 保留 保留 能否从指定位置消费 可以从指定Revision消费 可以从指定offset消费 能否保证消息不重放 不能 消费者会主动上报of...阅读全文

博文 2020-02-19 17:32:44 HammerMax

golang(os/signal)阅读

golang(os/signal)阅读信号和信号函数在unix-like系统中,我们要经常用到信号和信号处理函数。我们在linux编程中,经常要处理程序接收到的函数。比如: signal(SIGINT, SignalHandler)上面的函数注册SIGINT的信号处理函数SignalHandler,当程序运行中,当收到SIGINT信号,程序相应的执行SignalHandler函数。 信号的分类特殊信号SIGKILL和SIGSTOP不能被程序修改。 SIGKILL 杀死一个程序SIGSTOP 暂停一个程序//运行一个程序for { time.Sleep(1 * time.Second) } //程序是个死循环// 使用SIGINT 退出^Csignal: interrupt// 程序退出// ...阅读全文

博文 2019-04-29 10:34:45 今生路人甲