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

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 是个懒人

GO错误

SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句,或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行,用 GO 来标识批处理的结束。 如果基于 DB-Library、ODBC 或 OLE DB APIs 的应用程序试图执行 GO 命令时会收到语法错误。SQL Server 实用工具永远不会向服务器发送 GO 命令...阅读全文

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 实现tcp转发代理

package main import ( "flag" "fmt" "io" "net" "os" "strings" "sync" ) var lock sync.Mutex var trueList []string var ip string var list string func main() { flag.StringVar(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口") flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开") flag.Parse() tr...阅读全文

博文 2016-08-22 22:00:02 fyxichen

如何优雅的关闭Go Channel【译】

*Channel关闭原则* 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生。 *暴力关闭channel的正确方法* 如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic而崩溃。 func SafeClose ( ch chan T ) ( justClosed bool ) { defer func () { if recover () != nil { justClosed ...阅读全文

博文 2018-02-27 15:04:03 钱文品

Golang的socket编程(二):简单client

一、概述上一篇介绍了基本的函数和结构类型,这里就可以开始写服务端和客户端通信小程序了,通信的基本的流程如下: 如果服务端使用Listen 来监听,那么可以不用ResolveTCPAddr 函数。 现在我们就来写一个server和client,实现功能:client发送数据到server,server将数据转成大写后返回。 二、服务端实现12345678910111213141516171819202122232425262728293031323334package mainimport ( "net" "fmt" "strings")func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //创建一...阅读全文

博文 2018-05-17 09:28:30 server | 马谦的博客

架构学习之路(四)-- IM系统初探

之前学习HTTP和TCP请求的时候经常看到一个名词就是长连接,之前一直很好奇怎么去实现,最近偶尔看到一篇文章写的IM系统,想转载学习一下。 IM系统,那么必然需要TCP长连接来维持,由于Golang本身的基础库和外部依赖库非常之多,我们可以简单引用基础net网络库,来建立TCP server。一般的TCP Server端的模型,可以有一个协程【或者线程】去独立执行accept,并且是for循环一直accept新的连接,如果有新连接过来,那么建立连接并且执行Connect,由于Golang里面协程的开销非常之小,因此,TCP server端还可以一个连接一个goroutine去循环读取各自连接链路上的数据并处理。当然, 这个在C++语言的TCP Server模型中,一般会通过EPoll模型来建...阅读全文

博文 2018-09-03 08:34:43 魔改谢馒头

golang 发送邮件(不带附件)

package main import ( "log" "net/smtp" "flag" "fmt" "strings" ) var ( subject = flag.String("s","","subject of the mail") body = flag.String("b", "", "body of email") reciMail = flag.String("m","","recipient mail address") ) func main(){ flag.Parse() sub := fmt.Sprintf("subject: %s\r\n\r\n",*subject) content := *body mailList := strings.Split(*reci...阅读全文

博文 2015-12-22 05:00:01 u011363248

golang的channel剖析

概述 为了并发的goroutines之间的通讯,golang使用了管道channel。你可以通过一个goroutines向channel发送数据,然后从另一个goroutine接收它 通常我们会使用make来创建channel ----- make(chan valType , [size])。 写入 channel c<- 读取channel <-c 分类 一 无缓冲 make创建时忽略第二个参数即可创建无缓冲channel实例如下: // csdnTest.go package main import ( "fmt" "time" ) func main() { messages := make(chan string) go func() { messages <- "hello" }...阅读全文

博文 2016-11-22 04:00:06 wslzwps00321

Golang 并发Groutine详解

概述 1、并行和并发 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行是两个队列同时使用两台咖啡机 并发是两个队列交替使用一台咖啡机 2、go并发优势 有人把Go比作21世纪的C语言,第一是因为Go语言设计简单;第二,21世纪最重要的就是并发程序设计,而Go从语言层面就支持了并发。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。 Go语言为并发编程而内置的上层API基于CSP(communication sequenti...阅读全文

博文 2018-08-02 12:30:01 liuzhongchao

【go网络编程】-Socket编程

什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文...阅读全文

博文 2018-09-25 15:34:45 jincheng828

绝妙的 channel

在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。 原文在此:http://dave.cheney.net/2013/04/30/curious-channels ————翻译分隔线———— 绝妙的 channel 在 Go 编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。 今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。 一个已经被关闭的 channel 永远都不会阻塞 第一个特性,我想谈一谈已经被关闭的 channel。当...阅读全文

博文 2015-06-17 20:15:59 Creak_Phone

go调用其它C库,若采用命令行方式,不支持重定向的输出解决;smp协议未打开,发送信息到对方,没人响应

很多时候要学会站在巨人的肩膀上,该用别人 现有的东东一定要用,只要是开源合法的 go调用其它C库,一般两种方式,1,查看是否有接口,采用cgo方式编写;2.采用命令行直接执行,前提必须被调用的C库已经安装运行在该机器上 为了高效处理gif文件,采用gifsicle工具 http://download.csdn.net/detail/u010026901/7711469 重定向符合 > 在代码中会出错,所以在代码中实现重定向代替命令行重定向 package main import ( // "encoding/json" // "fmt" "log" "os" "os/exec" ) func main() { f, _ := os.Create("out") cmd := exec.Comm...阅读全文

博文 2016-02-22 12:00:06 u010026901

GO语言学习--tcp服务器、客户机的通信

一、服务器设计 1. 注册端口; 2. 监听端口 —— ListenTCP( ); 3. 接收请求 —— Accept( ); 4. 接收数据 或 发送数据 —— Read( ) 或 Write( ); 二、客户端设计 1. 获取地址; 2. 发送请求; 3. 接收数据 或 发送数据 —— Read( ) 或 Write( ); 4. 关闭连接 —— Close( )...阅读全文

Go学习笔记- 如何优雅的关闭Go Channel【译】

通道关闭原则 不要在消费端关闭信道,不要在有多个并行的生产者时对信道执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭信道,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的信道发送数据的情况不可能发生。 暴力关闭信道的正确方法 如果想要在消费端关闭信道,或者在多个生产者端关闭信道,可以使用恢复机制来上个保险,避免程序因为恐慌而崩溃。 func SafeClose(ch chan T) (justClosed bool) { defer func() { if recover() != nil { justClosed = false } }() // assume ch != nil here. close(ch) // panic ...阅读全文

博文 2019-05-31 13:34:42 赵客缦胡缨v吴钩霜雪明

go tcp 编程

代码示例 服务端: package main import ( "fmt" "net" "strings" ) // 读取数据 func handleConnection(conn net.Conn) { for { buf := make([]byte, 1024) if _,err := conn.Read(buf);err == nil { result := strings.Replace(string(buf),"\n","",1) fmt.Println(result) }else{ fmt.Println(err) } } } func main() { /* Listen: 返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络: "t...阅读全文

博文 2019-08-01 20:32:39 战神悟空

16 Go语言并发2——Channel

Go语言并发2——Channel 1、什么是channel channel 是一种架设在goroutine之间进行 通信的管道,类似队列。channel是引用类型,类型为chan,可以通过make关键字进行创建指定类型的channel。channel存在的意义是让goroutine通过通信来共享内存,一个往通道发送数据,一个从通道获取数据,来实现数据同步。 2、channel的创建和传递 声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。 2.1 make关键字创建 ch:=make(chan int) //创建一个int类型的channel,所以这个channel只能发送接收int型的数据 ch1:=make(chan int ...阅读全文

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 今生路人甲

基于websocket单台机器支持百万连接分布式聊天(IM)系统

基于websocket单台机器支持百万连接分布式聊天(IM)系统 本文将介绍如何实现一个基于websocket分布式聊天(IM)系统。 使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。 本文内容比较长,如果直接想clone项目体验直接进入项目体验 goWebSocket项目下载 ,文本从介绍webSocket是什么开始,然后开始介绍这个项目,以及在Nginx中配置域名做webSocket的转发,然后介绍如何搭建一个分布式系统。 目录 1、项目说明 1.1 goWebSocket 1.2 项目体验 2、介绍webSocket 2.1 webSocket 是什么 2.2 webSocket的兼...阅读全文

博文 2019-08-12 17:07:15 link1st

golang channel通讯

基于channel的通讯,对于无缓存的channel 发送的成功之时,接收者已经收到了。 接收,发生在发送者成功之前。 为什么会这样呢,如果我们靠记忆,就会怎么样,终究没有忘记快。可是如果我们能够从原理上来理解,也许就不容易忘记了。Golang的协程是协作式的,所以呢,如果发送者发送,那接收者存在一个何时运行的问题,如果发送成功之后,接收者才运行,不是说不可以,总少了那么一点点的协同的味道了。所以,如果换你来实现,一定也是发送者发送,送到接收者,唤起接收者运行(这时,发送者挂起了),然后到发送者重新回来运行的时候,接收者已经接收到了。 再扩展一下,对于带缓存的怎么办呢?这时候,其实就要看是谁,在什么 情况下阻塞了。总之,不能够自己一直运行下去,得给对方(你亲爱的合作方)运行的机会...阅读全文

土拨鼠 select语句与chan的使用

1 go的select配合chan 使用使用方式和switch 相似.要求是case 后面的操作必须是chan的读取 //下面这个select会选择default.因为前两个都走不通 //如果没有default 会一直循环case从上到下知道有通道 能读写. var ch1 chan int var ch2 chan int var ch3 []chan int =[] chan int{ch1,ch2} var numbers=[]int{1,2,3,4,5} func main(){ select { case getchan(0)<-getnumber(0): //向未被初始化的通道发送数据会造成当前的g永久的阻塞 fmt.Println("哈哈") case getchan(1)<-...阅读全文

博文 2019-08-30 11:41:27 blackdinosuar

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 := smtp.PlainAuth("", user, password, hp[0]) var content_type string if mailtype == "html" { content_t...阅读全文

博文 2017-11-07 01:00:01 purelightme

Go Channel 源码剖析

0. 引言这篇文章介绍一下 Golang channel 的内部实现,包括 channel 的数据结构以及相关操作的代码实现。代码版本 go1.9rc1,部分无关代码直接略去,比如 race detect,对应的代码中的 raceenabled。 1. hchan structchannel 的底层数据结果是 hchan struct。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748type hchan struct { qcount uint // 队列中数据个数 dataqsiz uint // channel 大小 buf unsafe.Pointer // ...阅读全文

博文 2017-08-08 02:30:16 Tao Kelu

Go基础系列:双层channel用法示例

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,而是用来传递消息,用来产生可读、可写的事件,以便让select选中某个分支。产生消息事件的方式有多种,比如直接关闭通道、发送false/true布尔值等等。 package main import ( "fmt" "time" ) func main() { // 定义双层通道cc cc := make(chan chan in...阅读全文

博文 2018-11-23 09:12:13 f-ck-need-u

深入了解 gRPC:协议

RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC,也就意味着后面大家可以非常方便的使用自己喜欢的语音对接 TiKV 了。 gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的,这里先简单介绍一下 HTTP/2 相关的知识,然后在介绍下 gRPC 是如何基于 HTTP/2 构建的。 HTTP/1.x HTTP 协议可以算是现阶段 Web 上面最通用的协议了,在之前很长一段时间,很多应用都是基于 HTTP/1.x 协议,HTTP/1.x 协议是一个文本协议,可读性非常好,但其实并不高效,笔者主要碰到过几个问题: Parser 如果要解析一个完整的 HTTP 请求,首先我们需要能正确的读出 HTTP header。HTTP header 各个...阅读全文

博文 2017-07-20 05:04:54 PingCAP

Go语言(十九)日志采集项目之logagent开发(一)

日志采集项目之logagent开发(一) 项目结构 项目分为如下部分: logagent conf: 配置文件 kafka: kafka集成模块 tailf: 日志读取模块 main.go: 程序入口 xlog: 日志打印模块,参考https://blog.51cto.com/13812615/2490744 oconfig: 配置文件解析模块,参考:https://blog.51cto.com/13812615/2492150 logCollect/ ├── logagent │ ├── conf │ │ └── config.ini │ ├── kafka │ │ └── kafka.go │ ├── logs │ │ └── logagent.log │ ├── main.go │ └...阅读全文

博文 2020-05-04 23:33:16 wx5b285b48ed74e

LollipopGo开源游戏服务器框架--网络基础模块源码

大家好,我是彬哥,本节给大家讲下LollipopGo游戏服务器NetBase.go,抛砖引玉了,主要是针对Go语言游戏服务器网络处理。 package main import ( "encoding/json" "fmt" "Proto" "Proto/Proto2" "code.google.com/p/go.net/websocket" ) func wwwGolangLtd(ws *websocket.Conn) { // fmt.Println("Golang语言社区 欢迎您!", ws) // data = json{} data := ws.Request().URL.Query().Get("data") fmt.Println("data:", data) NetDataCo...阅读全文

博文 2019-01-04 07:34:43 Golang语言社区

Golang对接Appsflyer

AppsFlyer:官方文档 我的代码: Appsflyer-go golang请求Appslfyer的接口 常量定义 const ( AppID = "com.your_appid" // 在AppsFlyer上的产品名称 AppsFlyerDevKey = "your_appsflyer_devkey" // AppsFlyer的devKey AppsFlyerUrlFormat = "https://api2.appsflyer.com/inappevent/%s" // Appslfyer事件的url AppsFlyerTimeFormat = "2006-01-02 15:04:05.000" // utc时间格式 ) Event,存储事件相关信息 type Event struc...阅读全文

博文 2019-06-04 21:32:38 GUIN蚂蚁

用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 00:00:02 sheepbao

Go语言学习笔记 - 并发

Goroutine Go在语言层面对并发编程提供支持,采用轻量级线程(协程)实现。只需要在函数调用语句前添加go关键字,就可以创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。goroutine是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务。事实上,入口函数main就以goroutine运行。另有与之配套的channel类型,用以实现“以通讯来共享内存”的CSP模式。 go func() { println("Hello, World!") } 调度器不能保证多个goroutine执行次序,且进程退出时不会等待它们结束。默认情况下,进程启动后仅允许一个系统线程服务于goroutine。可使用环境变量或标准函数runtime.GOMAXP...阅读全文

博文 2017-02-10 15:54:27 技术学习

golang通道中 nil通道 close通道的特性点

英文原文 C1. 以下操作会引起panic P1. Closing the nil channel. 实例: func C1P1() { var ch chan int close(ch) } 结果 panic: close of nil channel goroutine 1 [running]: panic(0x458300, 0xc82000a170) /home/wdy/go/src/runtime/panic.go:464 +0x3e6 main.main() /home/wdy/learn/program-learn/golang/learnchannel.go:27 +0x1e exit status 2 P2. Closing a closed channel. 实例: fu...阅读全文

博文 2017-07-06 04:07:24 kingeasternsun

Golang Read CSV File From HTTP Request

发送请求到Go后端服务: curl -X POST \ http://127.0.0.1:11111/api/product/upload\ -H 'Content-Type: multipart/form-data' \ -F product_file=@products.csv 注意:Content-Type 需要传递为 multipart/form-data Go 服务读取文件CSV文件 file, fileHeader, _ := r.FormFile("product_file") defer file.Close() fmt.Println(fileHeader.Filename) // products.csv fmt.Println(fileHeader.Header) //...阅读全文

博文 2020-01-18 15:32:43 七秒钟回忆待续

golang并发----利用close(channel)实现任务取消

所有channel接收者都会在channel关闭时 立刻从阻塞等待中返回 ok值为false 这个广播机制经常被利用进行向多个订阅者同时发送信号 例如退出信号 func dowork() { fmt.Println("do work.") time.Sleep(time.Second) } func iscanceled(cancelchan chan struct{}) bool { select { case <-cancelchan: return true default: return false } } // 向cancelch中发送数据只能通知一个goroutine func cancel1(cancelch chan struct{}) { cancelch <- struc...阅读全文

Go 语言 Channel 实现原理精要

Home Menu Go 语言 Channel 实现原理精要 23 Mar 2019 Channel 并发编程 Golang Go实现原理 概述 设计原理 数据结构 基本操作 创建 发送 直接发送 缓冲区 阻塞发送 小结 接收 直接接收 缓冲区 阻塞接收 小结 关闭 总结 相关文章 Reference 这一节中的内容总共包含两个部分,我们会先介绍 Channel 的设计原理以及它在 Go 语言中的数据结构,接下来我们会分析常见的 Channel 操作,例如创建、发送、接收和关闭的实现原理,由于在 Range 和 Select 两节中我们会提到 Channel 在不同的控制结构中组合使用时的现象,所以这一节还是会将重点放到 Channel 的常见操作上。 概述 作为 Go 语言中核心的数据结构...阅读全文

博文 2019-03-31 11:43:25 draveness.me

使用GAE Standard环境发送http请求

在GAE Standard环境中,不能直接使用Golang的http包发送网络请求,需要使用如下形式才能发送网络请求。 import ( "fmt" "net/http" "google.golang.org/appengine" "google.golang.org/appengine/urlfetch" ) func handler(w http.ResponseWriter, r *http.Request) { ctx := appengine.NewContext(r) client := urlfetch.Client(ctx) resp, err := client.Get("https://www.google.com/") if err != nil { http.Erro...阅读全文

博文 2017-06-26 04:06:44 阿莱_1b6f

使用aws sqs 做缓冲队列(go)

背景 作为一位刚进公司的小白,参与到项目的第一个任务是为操作记录的存储增加消息队列,为什么我们要这么做呢?原因如下:在现有系统中我们直接将用户的操作记录增加到mongodb数据库中,但是在我们的系统出现峰值的时候,发现mongodb受不了,为此我们要做到削峰这个功能,按照惯例我们想到了使用消息队列,同时由于我们在项目中普遍采用aws的云服务,为此我们采用了aws的消息队列。 注意事项 aws sqs 收费是按照请求次数收费所以要尽量使用批量操作 aws sqs 的消费上线是12000次,最多允许12000个在传递的数据 aws sqs 容量无限大 aws sqs 的批量操作的上限是10条数据(毕竟是按次数收费) aws sqs并行取数据的过程中可能会出现重复,我们利用数据库的ID来去重,注意...阅读全文

博文 2019-10-26 16:32:45 zhuchenshu

常见加密算法入门

参考 https://www.jianshu.com/p/ce3893a7be09 比特币的加密算法 https://www.jianshu.com/p/57fc42456ab4 分类和简述 常见的密钥加密算法类型大体可以分为三类:对称加密(单秘钥加密)、非对称加密、单向加密(结果唯一且计算过程可重复但是计算不可逆) 对称加密算法 对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。由于加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程...阅读全文

博文 2018-12-04 11:34:46 黄靠谱

用 Go 来了解一下 Redis 通讯协议

用 Go 来了解一下 Redis 通讯协议 原文地址:煎鱼的迷之传送门 Go、PHP、Java... 都有那么多包来支撑你使用 Redis,那你是否有想过 有了服务端,有了客户端,他们俩是怎样通讯,又是基于什么通讯协议做出交互的呢? 介绍 基于我们的目的,本文主要讲解和实践 Redis 的通讯协议 Redis 的客户端和服务端是通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 客户端和服务器发送的命令或数据一律以 \r\n(CRLF)结尾(这是一条约定) 协议 在 Redis 中分为请求和回复,而请求协议又分为新版和旧版,新版统一请求协议在 Redis 1.2 版本中引入,最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式 本文是基于新版协议来实现功能,...阅读全文

博文 2018-06-07 21:34:37 煎鱼

运维架构服务监控Open-Falcon

一、 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。之后,随着业务规模的持续快速增长,监控的对象也越来越多,越来越复杂,监控系统的使用对象也从最初少数的几个SRE,扩大为更多的DEVS,SRE。这时候,监控系统的容量和用户的“使用效率”成了最为突出的问题。 监控系统业界有很多杰出的开源监控系统。我们在早期,一直在用zabbix,不过随着业务的快速发展,以及互联网公司特有的一些需求,现有的开源的监控系统在性能、扩展性、和用户的使用效率方面,已经无...阅读全文

博文 2017-10-12 11:04:55 小红牛

Go - Channel 原理

注:该文原文为 Channel Axioms ,作者是 Dave Cheney,这是他的博客地址 大部分的新的 Go 程序员能快速理解 channel 是作为一个 queue 的值和认同当 channel 是满的或者是空的时候, 操作是阻塞的概念。 这篇文章探讨了 channel 四个不太常见的特性: 给一个 nil channel 发送数据,造成永远阻塞 从一个 nil channel 接收数据,造成永远阻塞 给一个已经关闭的 channel 发送数据,引起 panic 从一个已经关闭的 channel 接收数据,立即返回一个零值 给一个 nil channel 发送数据,造成永远阻塞 这第一个例子对于新来者是有点小惊奇的,它给一个 nil channel 发送数据,造成永远阻塞。 以下这...阅读全文

软件技术-零基础Golang编写文件服务器

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】 当用户请求一个网页的时候,如何让服务器把网页文件发送给用户? 文件服务器 首先我们要知道,用户在浏览器中看到的页面其实就是一个.html文件,就是我们上一篇文章时候撰写的...代码。 但我们最初用Golang写的服务器只是简单返回Hello world!字符串,而不是文件。所以,正确的做法是: 让Golang读取硬盘上的文件内容,然后发送给用户。 这就是文件服务器要干的事情,你要login.html页面,我就给你login.html文件。 在Golang里面,已经提供了快速建立文件服务的功能,就是http.FileServer方法,但是首先要知道我们的web文件夹放在哪里。 获取当前文件路径 在Gola...阅读全文

博文 2019-03-27 02:34:38 zhyuzh3d

从零开始学golang之TCP

```go package main import ( "flag" "fmt" "net" "os" "time" ) /** * tcp 启动 链接 三次握手 关闭四次 * 慢启动 + 拥塞窗口 * 门限控制 < 拥塞窗口 进入拥塞避免 * 在发送数据后 检测 ack 确认超时 或者 收到重复ack 确认 操作门限值 和 拥塞窗口值 来限流 * 接收方 使用通告窗口 告知发送可接受多少字节 * * 发送方:滑动窗口协议 */ //结构体内嵌接口 type Man struct { iTest name string } type iTest interface { hello()...阅读全文

Kafka有哪些可靠性保障?

**一、AR** 在Kafka中维护了一个AR列表,包括所有的分区的副本。AR又分为ISR和OSR。 AR = ISR + OSR。 AR、ISR、OSR、LEO、HW这些信息都被保存在Zookeeper中。 **1.ISR** ISR中的副本都要同步leader中的数据,只有都同步完成了数据才认为是成功提交了,成功提交之后才能供外界访问。 在这个同步的过程中,数据即使已经写入也不能被外界访问,这个过程是通过LEO-HW机制来实现的。 **2.OSR** OSR内的副本是否同步了leader的数据,不影响数据的提交,OSR内的follower尽力的去同步leader,可能数据版本会落后。 最开始所有的副本都在ISR中,在kafka工作的过...阅读全文

运维架构服务监控Open-Falcon

一、 介绍监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。之后,随着业务规模的持续快速增长,监控的对象也越来越多,越来越复杂,监控系统的使用对象也从最初少数的几个SRE,扩大为更多的DEVS,SRE。这时候,监控系统的容量和用户的“使用效率”成了最为突出的问题。监控系统业界有很多杰出的开源监控系统。我们在早期,一直在用zabbix,不过随着业务的快速发展,以及互联网公司特有的一些需求,现有的开源的监控系统在性能、扩展性、和用户的使用效率方面,已经无法支...阅读全文

博文 2017-10-12 08:38:13 猫饭先生

Golang channel 源码分析

之前知道go团队在实现channel这种协程间通信的大杀器时只用了700多行代码就解决了,所以就去膜拜读了一把,但之后复盘总觉得多少有点绕,直到有幸找到一个神级PPT https://speakerdeck.com/kavya... 生动形象的解释了channel底层是怎么工作和实现的,于是就带着这篇PPT再来复盘一遍channel的源码 Hchan 数据结构 初始化 make(chan task, 3)初始化channel在调用方有两种, 一种是带缓冲的一种是非缓冲的,其初始化的具体实现除了缓冲非缓冲,还分channel的元素是否是指针类型 Send 满足send条件下往这个channel发送数据的代码, 假设当前没有另一个goroutine来接收channel的数据 G1: for ta...阅读全文

博文 2019-04-15 18:34:39 薛薛薛

Go基础学习记录之Session和Cookie

Session和Cookie session和cookie是两个非常常见的Web概念,也很容易被误解。但是,它们对于页面授权以及收集页面统计信息非常重要。我们来看看这两个用例。 假设我们要抓取限制公共访问的页面,例如Twitter用户的主页。当然,您可以打开浏览器并输入用户名和密码来登录和访问该信息,但所谓的“网络爬行”意味着我们使用程序自动执行此过程而无需任何人为干预。因此,当我们使用浏览器登录时,我们必须找出幕后的真实情况。 当我们第一次收到登录页面并输入用户名和密码时,按下“登录”按钮后,浏览器会向远程服务器发送POST请求。服务器验证登录信息并返回HTTP响应后,浏览器重定向到用户主页。这里的问题是,服务器如何知道我们拥有所需网页的访问权限?由于HTTP是无状态的,因此服务器无法知道...阅读全文

博文 2018-10-24 15:34:47 DurbanZhang

chanel 使用与原理 二

有了上篇的基本了解,可以翻阅源码了 涉及的数据结构 // Go/src/runtime/chan.go type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // lis...阅读全文

TCP连接的状态变迁

全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。 服务器独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。 共有的:(1)CLOSED (2)ESTABLISHED 。 ![image.png](https://static.studygolang.com/190222/c1b69cd34b964ea79036a1f00b187f9f.png) 状态变迁 1、建立连接时的状态变迁 一开始,建立连接之前服务器和客户端的状态都为CLOSED。服务器创建socket后开始监听,变为LISTEN状态。客户端请求建立连接,向服务器发送SYN...阅读全文