1.golang pprof 监控系列(1) —— go trace 统计原理与使用
2.Golang实现多存储驱动设计SDK
3.golangå®ç¨å·¥å
ጼ(golanggingithub)
4.Go框架比较:goframe、指标beego、源码源码iris和gin
5.Golang <-time.After()在计时器过期前不会被垃圾回收
6.记录一次golang内存泄漏问题
golang pprof 监控系列(1) —— go trace 统计原理与使用
在深入理解golang的分析pprof监控系列中,第一部分将重点解析go tool trace的指标使用方法以及其统计原理。go1..版本的源码源码golang中,trace工具在解决延迟问题时发挥关键作用,分析中秋表白源码它记录了延迟事件和代码位置,指标帮助我们定位问题。源码源码
使用trace功能相对简单,分析通过调用trace.Start开始采样,指标指定trace.out文件作为输出,源码源码采样结束后,分析通过go tool trace分析采样文件。指标默认情况下,源码源码它会在本地随机端口启动HTTP服务以展示分析结果。分析
go runtime内部通过埋点的方式监控代码执行,每次事件发生时,通过traceEvent函数记录,包括线程、协程、运行队列等信息。微擎手机维修源码trace.Start时,一个协程会不断读取这些信息并输出到文件。trace.out文件中的Event结构包含如运行队列(P)、协程ID(G)、栈帧等详细数据,以及事件类型、时间戳和关联事件。
例如,通过比较GoSysExit和GoSysCall事件的时间戳,可以计算出系统调用的耗时。trace页面统计了各种信息,如Goroutine analysis的执行时间占比、网络等待、锁阻塞等,这些都是分析性能瓶颈的重要工具。
在Goroutine analysis页面,事件按代码位置和PC值分组,点击链接可以查看每个协程的详细情况,包括系统调用、阻塞和调度延迟。火星自助建站系统源码执行时间和网络等待等指标通过逐行事件时间差累加计算得出。同时,trace工具还支持用户自定义监控事件,生成的网页提供了多种分析视图。
总的来说,go tool trace是一个强大的性能分析工具,通过深入了解其工作原理,我们可以更有效地诊断和优化golang应用程序的性能。后续的内容将探讨更多高级功能和深入的gc分析。
Golang实现多存储驱动设计SDK
Golang提供了一种强大的工具,Gocache,用于实现多存储驱动设计的缓存SDK。这个库支持多种功能,包括链式缓存、可加载缓存、指标跟踪和自定义存储等,旨在简化开发者在项目中管理内存、Redis等不同存储的需求。 它的核心特性包括:链式缓存,允许数据在内存和Redis等存储间灵活切换,个人展示网站源码下载确保高可用性。
可加载缓存,当数据过期或失效时,支持自动从源重新加载,提高了缓存的实时性。
指标缓存,跟踪缓存操作的性能指标,帮助监控和优化。
支持自定义编组和解组,方便对象在存储和内存之间的转换。
默认支持内存和Redis存储,同时允许用户扩展到其他存储选项。
作者的开发缘由源于在GraphQL Go项目中需要统一管理不同缓存存储的需求,Gocache因此应运而生。通过一个统一的API,开发者可以轻松集成内存、分布式缓存等,简化了缓存的管理和维护。 使用Gocache,你可以通过简单的分布式项目源码安装命令开始,只需导入库并配置存储适配器,如Memcache。它的缓存适配器提供了诸如设置、获取和删除等操作,让缓存管理变得直观易用。 对于自定义需求,Gocache还允许开发自己的缓存或存储,只需要实现相应的接口,为项目的特定场景提供灵活性。 总之,Golang的Gocache是一个强大且灵活的多存储驱动设计SDK,极大地简化了缓存管理,适合各种项目场景。golangå®ç¨å·¥å ·åº(golanggingithub)
golang使ç¨Nsq
1.ä»ç»
æè¿å¨ç 究ä¸äºæ¶æ¯ä¸é´ä»¶ï¼å¸¸ç¨çMQå¦RabbitMQ,ActiveMQ,KafkaçãNSQæ¯ä¸ä¸ªåºäºGoè¯è¨çåå¸å¼å®æ¶æ¶æ¯å¹³å°ï¼å®åºäºMITå¼æºåè®®åå¸ï¼ç±bitlyå ¬å¸å¼æºåºæ¥çä¸æ¬¾ç®åæç¨çæ¶æ¯ä¸é´ä»¶ã
å®æ¹å第ä¸æ¹è¿ä¸ºNSQå¼åäºä¼å¤å®¢æ·ç«¯åè½åºï¼å¦å®æ¹æä¾çåºäºHTTPçnsqdãGo客æ·ç«¯go-nsqãPython客æ·ç«¯pynsqãåºäºNode.jsçJavaScript客æ·ç«¯nsqjsãå¼æ¥C客æ·ç«¯libnsqãJava客æ·ç«¯nsq-java以ååºäºåç§è¯è¨çä¼å¤ç¬¬ä¸æ¹å®¢æ·ç«¯åè½åºã
1.1Features
1).Distributed
NSQæä¾äºåå¸å¼çï¼å»ä¸å¿åï¼ä¸æ²¡æåç¹æ éçææç»æï¼ç¨³å®çæ¶æ¯ä¼ è¾åå¸ä¿éï¼è½å¤å ·æé«å®¹éåHAï¼é«å¯ç¨ï¼ç¹æ§ã
2).Scalableæäºæ©å±
NSQæ¯ææ°´å¹³æ©å±ï¼æ²¡æä¸å¿åçbrokersãå ç½®çåç°æå¡ç®åäºå¨é群ä¸å¢å èç¹ãåæ¶æ¯æpub-subåload-balancedçæ¶æ¯ååã
3).OpsFriendly
NSQé常容æé ç½®åé¨ç½²ï¼çæ¥å°±ç»å®äºä¸ä¸ªç®¡ççé¢ãäºè¿å¶å 没æè¿è¡æ¶ä¾èµãå®æ¹æDockerimageã
4.Integratedé«åº¦éæ
å®æ¹çGoåPythonåºé½ææä¾ãèä¸ä¸ºå¤§å¤æ°è¯è¨æä¾äºåºã
1.2ç»ä»¶
1.3ææç»æ
NSQæ¨èéè¿ä»ä»¬ç¸åºçnsqdå®ä¾ä½¿ç¨ååå®ä½åå¸è ï¼è¿æå³çå³ä½¿é¢å¯¹ç½ç»ååºï¼æ¶æ¯ä¹ä¼è¢«ä¿åå¨æ¬å°ï¼ç´å°å®ä»¬è¢«ä¸ä¸ªæ¶è´¹è 读åãæ´éè¦çæ¯ï¼åå¸è ä¸å¿ å»åç°å ¶ä»çnsqdèç¹ï¼ä»ä»¬æ»æ¯å¯ä»¥åæ¬å°å®ä¾åå¸æ¶æ¯ã
NSQ
é¦å ï¼ä¸ä¸ªåå¸è åå®çæ¬å°nsqdåéæ¶æ¯ï¼è¦åå°è¿ç¹ï¼é¦å è¦å æå¼ä¸ä¸ªè¿æ¥ï¼ç¶ååéä¸ä¸ªå å«topicåæ¶æ¯ä¸»ä½çåå¸å½ä»¤ï¼å¨è¿ç§æ åµä¸ï¼æ们å°æ¶æ¯åå¸å°äºä»¶topicä¸ä»¥åæ£å°æ们ä¸åçworkerä¸ã
äºä»¶topicä¼å¤å¶è¿äºæ¶æ¯å¹¶ä¸å¨æ¯ä¸ä¸ªè¿æ¥topicçchannelä¸è¿è¡æéï¼å¨æ们çæ¡ä¾ä¸ï¼æä¸ä¸ªchannelï¼å®ä»¬å ¶ä¸ä¹ä¸ä½ä¸ºæ¡£æ¡channelãæ¶è´¹è ä¼è·åè¿äºæ¶æ¯å¹¶ä¸ä¸ä¼ å°S3ã
nsqd
æ¯ä¸ªchannelçæ¶æ¯é½ä¼è¿è¡æéï¼ç´å°ä¸ä¸ªworkeræä»ä»¬æ¶è´¹ï¼å¦ææ¤éåè¶ åºäºå åéå¶ï¼æ¶æ¯å°ä¼è¢«åå ¥å°ç£çä¸ãNsqdèç¹é¦å ä¼ånsqlookup广æä»ä»¬çä½ç½®ä¿¡æ¯ï¼ä¸æ¦å®ä»¬æ³¨åæåï¼workerå°ä¼ä»nsqlookupæå¡å¨èç¹ä¸åç°ææå å«äºä»¶topicçnsqdèç¹ã
nsqlookupd
2.Internals
2.1æ¶æ¯ä¼ éæ ä¿
1ï¼å®¢æ·è¡¨ç¤ºå·²ç»åå¤å¥½æ¥æ¶æ¶æ¯
2ï¼NSQåéä¸æ¡æ¶æ¯ï¼å¹¶ææ¶å°æ°æ®åå¨å¨æ¬å°ï¼å¨re-queueætimeoutï¼
3ï¼å®¢æ·ç«¯åå¤FINï¼ç»æï¼æREQï¼éæ°æéï¼åå«æ示æåæ失败ãå¦æ客æ·ç«¯æ²¡æåå¤,NSQä¼å¨è®¾å®çæ¶é´è¶ æ¶ï¼èªå¨éæ°æéæ¶æ¯
è¿ç¡®ä¿äºæ¶æ¯ä¸¢å¤±å¯ä¸å¯è½çæ åµæ¯ä¸æ£å¸¸ç»ænsqdè¿ç¨ãå¨è¿ç§æ åµä¸ï¼è¿æ¯å¨å åä¸çä»»ä½ä¿¡æ¯ï¼æä»»ä½ç¼å²æªå·æ°å°ç£çï¼é½å°ä¸¢å¤±ã
å¦ä½é²æ¢æ¶æ¯ä¸¢å¤±æ¯æéè¦çï¼å³ä½¿æ¯è¿ä¸ªæå¤æ åµå¯ä»¥å¾å°ç¼è§£ãä¸ç§è§£å³æ¹æ¡æ¯ææåä½nsqd对ï¼å¨ä¸åç主æºä¸ï¼æ¥æ¶æ¶æ¯çç¸åé¨åçå¯æ¬ãå ä¸ºä½ å®ç°çæ¶è´¹è æ¯å¹ççï¼ä»¥ä¸¤åæ¶é´å¤çè¿äºæ¶æ¯ä¸ä¼å¯¹ä¸æ¸¸é æå½±åï¼å¹¶ä½¿å¾ç³»ç»è½å¤æ¿åä»»ä½åä¸èç¹æ éèä¸ä¼ä¸¢å¤±ä¿¡æ¯ã
2.2ç®åé ç½®å管ç
å个nsqdå®ä¾è¢«è®¾è®¡æå¯ä»¥åæ¶å¤çå¤ä¸ªæ°æ®æµãæµè¢«ç§°ä¸ºâè¯é¢âåè¯é¢æ1个æå¤ä¸ªâééâãæ¯ä¸ªééé½æ¥æ¶å°ä¸ä¸ªè¯é¢ä¸æææ¶æ¯çæ·è´ãå¨å®è·µä¸ï¼ä¸ä¸ªééæ å°å°ä¸è¡æå¡æ¶è´¹ä¸ä¸ªè¯é¢ã
å¨æ´åºçå±é¢ï¼æ¯ä¸ªnsqdæä¸ä¸ªä¸nsqlookupdçé¿æTCPè¿æ¥ï¼å®ææ¨å¨å ¶ç¶æãè¿ä¸ªæ°æ®è¢«nsqlookupdç¨äºç»æ¶è´¹è éç¥nsqdå°åã对äºæ¶è´¹è æ¥è¯´ï¼ä¸ä¸ªæ´é²çHTTP/lookupæ¥å£ç¨äºè½®è¯¢ã为è¯é¢å¼å ¥ä¸ä¸ªæ°çæ¶è´¹è ï¼åªéå¯å¨ä¸ä¸ªé ç½®äºnsqlookupå®ä¾å°åçNSQ客æ·ç«¯ãæ é为添å ä»»ä½æ°çæ¶è´¹è æç产è æ´æ¹é ç½®ï¼å¤§å¤§éä½äºå¼éåå¤ææ§ã
2.3æ¶é¤åç¹æ é
NSQ被设计以åå¸çæ¹å¼è¢«ä½¿ç¨ãnsqd客æ·ç«¯ï¼éè¿TCPï¼è¿æ¥å°æå®è¯é¢çææç产è å®ä¾ã没æä¸é´äººï¼æ²¡ææ¶æ¯ä»£çï¼ä¹æ²¡æåç¹æ éã
è¿ç§ææç»ææ¶é¤åé¾ï¼èåï¼åé¦ãç¸åï¼ä½ çæ¶è´¹è ç´æ¥è®¿é®ææç产è ãä»ææ¯ä¸è®²ï¼åªä¸ªå®¢æ·ç«¯è¿æ¥å°åªä¸ªNSQä¸éè¦ï¼åªè¦æ足å¤çæ¶è´¹è è¿æ¥å°ææç产è ï¼ä»¥æ»¡è¶³å¤§éçæ¶æ¯ï¼ä¿è¯ææä¸è¥¿æç»å°è¢«å¤çã对äºnsqlookupdï¼é«å¯ç¨æ§æ¯éè¿è¿è¡å¤ä¸ªå®ä¾æ¥å®ç°ãä»ä»¬ä¸ç´æ¥ç¸äºéä¿¡åæ°æ®è¢«è®¤ä¸ºæ¯æç»ä¸è´ãæ¶è´¹è 轮询ææçé ç½®çnsqlookupdå®ä¾åå并responseã失败çï¼æ æ³è®¿é®çï¼æä»¥å ¶ä»æ¹å¼æ éçèç¹ä¸ä¼è®©ç³»ç»é·äºåé¡¿ã
2.4æç
对äºæ°æ®çåè®®ï¼éè¿æ¨éæ°æ®å°å®¢æ·ç«¯æ大é度å°æé«æ§è½åååéçï¼èä¸æ¯çå¾ å®¢æ·ç«¯ææ°æ®ãè¿ä¸ªæ¦å¿µï¼ç§°ä¹ä¸ºRDYç¶æï¼åºæ¬ä¸æ¯å®¢æ·ç«¯æµéæ§å¶çä¸ç§å½¢å¼ã
efficiency
2.5å¿è·³åè¶ æ¶
ç»ååºç¨çº§å«çå¿è·³åRDYç¶æï¼é¿å 头é»å¡ç°è±¡ï¼ä¹å¯è½ä½¿å¿è·³æ ç¨ï¼å³ï¼å¦ææ¶è´¹è æ¯å¨åé¢çå¤çæ¶æ¯æµçæ¥æ¶ç¼å²åºä¸ï¼æä½ç³»ç»å°è¢«å¡«æ»¡ï¼å µå¿è·³ï¼ä¸ºäºä¿è¯è¿åº¦ï¼ææçç½ç»IOæ¶é´ä¸éå¿å¿ ä¸é ç½®çå¿è·³é´éç¸å ³èãè¿æå³çï¼ä½ å¯ä»¥ä»åé¢ä¸ææä¹é´çç½ç»è¿æ¥nsqdåæ¶è´¹è ï¼å®ä¼æ£æµå¹¶æ£ç¡®å¤çé误ãå½æ£æµå°ä¸ä¸ªè´å½é误ï¼å®¢æ·ç«¯è¿æ¥è¢«å¼ºå¶å ³éãå¨ä¼ è¾ä¸çæ¶æ¯ä¼è¶ æ¶èéæ°æéçå¾ ä¼ éå°å¦ä¸ä¸ªæ¶è´¹è ãæåï¼é误ä¼è¢«è®°å½å¹¶ç´¯è®¡å°åç§å é¨ææ ã
2.6åå¸å¼
å 为NSQ没æå¨å®æ¤ç¨åºä¹é´å ±äº«ä¿¡æ¯ï¼æ以å®ä»ä¸å¼å§å°±æ¯ä¸ºäºåå¸å¼æä½èçã个å«çæºå¨å¯ä»¥é便å®æºé便å¯å¨èä¸ä¼å½±åå°ç³»ç»çå ¶ä½é¨åï¼æ¶æ¯åå¸è å¯ä»¥å¨æ¬å°åå¸ï¼å³ä½¿é¢å¯¹ç½ç»ååºã
è¿ç§âåå¸å¼ä¼å âç设计ç念æå³çNSQåºæ¬ä¸å¯ä»¥æ°¸è¿ä¸æå°æ©å±ï¼éè¦æ´é«çååéï¼é£å°±æ·»å æ´å¤çnsqdå§ãå¯ä¸çå ±äº«ç¶æå°±æ¯ä¿åå¨lookupèç¹ä¸ï¼çè³å®ä»¬ä¸éè¦å ¨å±è§å¾ï¼é ç½®æäºnsqd注åå°æäºlookupèç¹ä¸è¿æ¯å¾ç®åçé ç½®ï¼å¯ä¸å ³é®çå°æ¹å°±æ¯æ¶è´¹è å¯ä»¥éè¿lookupèç¹è·åææå®æ´çèç¹éãæ¸ æ°çæ éäºä»¶ââNSQå¨ç»ä»¶å 建ç«äºä¸å¥æç¡®å ³äºå¯è½å¯¼è´æ éççæ éæè¡¡æºå¶ï¼è¿å¯¹æ¶æ¯ä¼ éåæ¢å¤é½ææä¹ãè½ç¶å®ä»¬å¯è½ä¸åKafkaç³»ç»é£æ ·æä¾ä¸¥æ ¼çä¿è¯çº§å«ï¼ä½NSQç®åçæä½ä½¿æ éæ åµé常ææ¾ã
2.7noreplication
ä¸åå ¶ä»çéåç»ä»¶ï¼NSQ并没ææä¾ä»»ä½å½¢å¼çå¤å¶åé群ï¼ä¹æ£æ¯è¿ç¹è®©å®è½å¤å¦æ¤ç®åå°è¿è¡ï¼ä½å®ç¡®å®å¯¹äºä¸äºé«ä¿è¯æ§é«å¯é æ§çæ¶æ¯åå¸æ²¡æ足å¤çä¿è¯ãæ们å¯ä»¥éè¿éä½æ件åæ¥çæ¶é´æ¥é¨åé¿å ï¼åªééè¿ä¸ä¸ªæ å¿é ç½®ï¼éè¿EBSæ¯ææ们çéåãä½æ¯è¿æ ·ä»ç¶åå¨ä¸ä¸ªæ¶æ¯è¢«åå¸å马ä¸æ»äº¡ï¼ä¸¢å¤±äºææçåå ¥çæ åµã
2.8没æä¸¥æ ¼ç顺åº
è½ç¶Kafkaç±ä¸ä¸ªæåºçæ¥å¿ææï¼ä½NSQä¸æ¯ãæ¶æ¯å¯ä»¥å¨ä»»ä½æ¶é´ä»¥ä»»ä½é¡ºåºè¿å ¥éåãå¨æ们使ç¨çæ¡ä¾ä¸ï¼è¿é常没æå ³ç³»ï¼å 为ææçæ°æ®é½è¢«å ä¸äºæ¶é´æ³ï¼ä½å®å¹¶ä¸éåéè¦ä¸¥æ ¼é¡ºåºçæ åµã
2.9æ æ°æ®éå¤å é¤åè½
NSQ对äºè¶ æ¶ç³»ç»ï¼å®ä½¿ç¨äºå¿è·³æ£æµæºå¶å»æµè¯æ¶è´¹è æ¯å¦åæ´»è¿æ¯æ»äº¡ãå¾å¤åå ä¼å¯¼è´æ们çconsumeræ æ³å®æå¿è·³æ£æµï¼æ以å¨consumerä¸å¿ é¡»æä¸ä¸ªåç¬çæ¥éª¤ç¡®ä¿å¹çæ§ã
3.å®è·µå®è£ è¿ç¨
æ¬æå°nsqéç¾¤å ·ä½çå®è£ è¿ç¨ç¥å»ï¼å¤§å®¶å¯ä»¥èªè¡åèå®ç½ï¼æ¯è¾ç®åãè¿é¨åä»ç»ä¸ç¬è å®éªçææï¼ä»¥ånsqadminçç¸å ³ä¿¡æ¯ã
3.1ææç»æ
topology
å®éªéç¨3å°NSQDæå¡ï¼2å°LOOKUPDæå¡ã
éç¨å®æ¹æ¨èçææï¼æ¶æ¯åå¸çæå¡åNSQDå¨ä¸å°ä¸»æºãä¸å ±5å°æºå¨ã
NSQåºæ¬æ²¡æé ç½®æ件ï¼é ç½®éè¿å½ä»¤è¡æå®åæ°ã
主è¦å½ä»¤å¦ä¸:
LOOKUPDå½ä»¤
NSQDå½ä»¤
å·¥å ·ç±»ï¼æ¶è´¹ååå¨å°æ¬å°æ件ã
åå¸ä¸æ¡æ¶æ¯
3.2nsqadmin
对Streamsç详ç»ä¿¡æ¯è¿è¡æ¥çï¼å æ¬NSQDèç¹ï¼å ·ä½çchannelï¼éåä¸çæ¶æ¯æ°ï¼è¿æ¥æ°çä¿¡æ¯ã
nsqadmin
channel
ååºææçNSQDèç¹:
nodes
æ¶æ¯çç»è®¡:
msgs
lookup主æºçå表:
hosts
4.æ»ç»
NSQåºæ¬æ ¸å¿å°±æ¯ç®åæ§ï¼æ¯ä¸ä¸ªç®åçéåï¼è¿æå³çå®å¾å®¹æè¿è¡æ éæ¨çåå¾å®¹æåç°bugãæ¶è´¹è å¯ä»¥èªè¡å¤çæ éäºä»¶èä¸ä¼å½±åç³»ç»å©ä¸çå ¶ä½é¨åã
äºå®ä¸ï¼ç®åæ§æ¯æ们å³å®ä½¿ç¨NSQçé¦è¦å ç´ ï¼è¿æ¹ä¾¿ä¸æ们ç许å¤å ¶ä»è½¯ä»¶ä¸èµ·ç»´æ¤ï¼éè¿å¼å ¥éå使æ们å¾å°äºå ªç§°å®ç¾ç表ç°ï¼éè¿éåçè³è®©æ们å¢å äºå 个æ°é级çååéãè¶æ¥è¶å¤çconsumeréè¦ä¸å¥ä¸¥æ ¼å¯é æ§å顺åºæ§ä¿éï¼è¿å·²ç»è¶ è¿äºNSQæä¾çç®ååè½ã
ç»åæ们çä¸å¡ç³»ç»æ¥çï¼å¯¹äºæ们æéè¦ä¼ è¾çå票æ¶æ¯ï¼ç¸å¯¹æ¯è¾ææï¼æ æ³å®¹å¿æ个nsqdå®æºï¼æè ç£çæ æ³ä½¿ç¨çæ åµï¼è¯¥èç¹å 积çæ¶æ¯æ æ³æ¾åãè¿æ¯æ们没æéæ©è¯¥æ¶æ¯ä¸é´ä»¶ç主è¦åå ãç®åæ§åå¯é æ§ä¼¼ä¹å¹¶ä¸è½å®å ¨æ»¡è¶³ãç¸æ¯Kafkaï¼opsè©è´èµ·æ´å¤è´è´£çè¿è¥ãå¦ä¸æ¹é¢ï¼å®æ¥æä¸ä¸ªå¯å¤å¶çãæåºçæ¥å¿å¯ä»¥æä¾ç»æ们æ´å¥½çæå¡ãä½å¯¹äºå ¶ä»éåNSQçconsumerï¼å®ä¸ºæ们æå¡çç¸å½å¥½ï¼æ们æå¾ ç继ç»å·©åºå®çåå®çåºç¡ã
GitHubGo项ç®æ¨èï½Golangä¸çå½ä»¤è¡é¢è²æ¸²æå·¥å ·åºï½æ¯æwindowsGolangä¸çå½ä»¤è¡è²å½©ä½¿ç¨åº,æ¥æ丰å¯çè²å½©æ¸²æè¾åºï¼éç¨çAPIæ¹æ³ï¼å ¼å®¹Windowsç³»ç»
ä»åºå称ï¼color
æ æ(star)ï¼ï¼ä¸éå¦ï¼æ½åè¡é¡¹ç®ï¼
æ æè¶å¿
æ·è´(fork)ï¼
è´¡ç®äººæ°ï¼3
ä»åºå¤§å°ï¼1MB
主è¦å¼åè¯è¨ï¼Go
è¯è¨åå¸ï¼Go:.%ãBatchfile:0.%
代ç æ交å¨æåå¸ï¼
ä½è å¨æï¼
2æ
Golangä¸çå½ä»¤è¡è²å½©ä½¿ç¨åº,æ¥æ丰å¯çè²å½©æ¸²æè¾åºï¼éç¨çAPIæ¹æ³ï¼å ¼å®¹Windowsç³»ç»
åè½ç¹è²
ç¨åºåæ°è§çï¼å享æ趣ãææçç¨åºåè¯é¢ï¼æ¯å¤©è¿æ¥ä¸ç¹ç¹ã
ç¥è¯å享ä¹Golangââç²¾éçç»ä»¶åºãç»ä»¶å表ï¼åç§golangç»ä»¶é½å¯æ¾å°ç¥è¯å享ä¹Golangç¯æ¯æå¨æ¥å¸¸ä½¿ç¨Golangæ¶å¦ä¹ å°çåç§åæ ·çç¥è¯çè®°å½ï¼å°å ¶æ´çåºæ¥ä»¥æç« çå½¢å¼å享ç»å¤§å®¶ï¼æ¥è¿è¡å ±åå¦ä¹ ã欢è¿å¤§å®¶è¿è¡æç»å ³æ³¨ã
ç¥è¯å享系åç®åå å«JavaãGolangãLinuxãDockerççã
awesome-goè¿ä¸ªç»ä»¶å å«äºåç§golangä¸å¸¸ç¨çç»ä»¶ï¼è¯´ç½äºå°±æ¯ä¸ä¸ªç²¾éçGoæ¡æ¶ãåºå软件çæ±æ»è¡¨ã
æ们æ¥å¸¸éè¦å¯»æ¾åç§golangç»ä»¶æ¶å¨è¿ä¸ªå表ä¸åºæ¬é½å¯ä»¥å¿«éæ¾å°ã
golangå½ä»¤è¡åºCobraç使ç¨
åäº2次æåå®ï¼å 容å¾é¿ï¼ç¿»è¯äºå¾ä¹ ï¼å 容æ¥æºäºCobragithubä»ç»ãç¿»è¯å®ä¹æ´å ¨é¢çäºè§£äºCobraï¼åè½ç¸å½å¼ºå¤§å®åï¼åç§ä½¿ç¨çåºæ¯é½èèå°äºãå¦å¤ä¹æ©å±äºä¸äºå ¶å®ç¥è¯ï¼æ¯å¦å½ä»¤è¡ç©æ³ï¼Levenshteindistanceççã以ä¸æ¯æ£æï¼
Cobraæä¾ç®åçæ¥å£æ¥å建强大çç°ä»£åCLIæ¥å£ï¼æ¯å¦gitä¸goå·¥å ·ãCobraåæ¶ä¹æ¯ä¸ä¸ªç¨åº,ç¨äºå建CLIç¨åº
Cobraæ¯å»ºç«å¨ç»æçå½ä»¤ãåæ°åæ å¿ä¹ä¸ã
å½ä»¤ä»£è¡¨æä½,åæ°åæ å¿æ¯è¿äºè¡å¨ç修饰符ã
æ好çåºç¨ç¨åºå°±å读åå¥åãç¨æ·ä¼ç¥éå¦ä½ä½¿ç¨æ¬æºåºç¨ç¨åºï¼å 为ä»ä»¬å°ç解å¦ä½ä½¿ç¨å®ã
æ¯å¦ä¸é¢çä¾åï¼serveræ¯å½ä»¤ï¼portæ¯æ å¿:
å¨ä¸é¢çå½ä»¤ï¼æ们åè¯Gitå éurlå°åbare
使ç¨Cobraå¾ç®åãé¦å ï¼ä½¿ç¨gogetå®è£ ææ°çæ¬
ç¶åå¨ä½ 项ç®éå¼ç¨Cobra
é常åºäºCobraçåºç¨ç¨åºå°éµå¾ªä¸é¢çç»ç»ç»æï¼å½ç¶ä½ ä¹å¯ä»¥éµå¾ªèªå·±çæ¥å£ï¼
å¨Cobraåºç¨ç¨åºä¸ï¼é常main.goæ件é常空æ´ãå®ä¸»è¦åªå¹²ä¸ä»¶äºï¼åå§åCobraã
Cobraæä¾èªå·±çç¨åºæ¥åå»ºä½ çç¨åºå¹¶ä¸æ·»å ä½ æ³è¦çå½ä»¤ãè¿æ¯æç®åçæ¹å¼æCobraæ·»å å°ä½ çç¨åºéã
è¿éä½ è½æ¾å°ç¸å ³ä¿¡æ¯
使ç¨Cobraï¼éè¦å建ä¸ä¸ªç©ºçmain.goæ件åä¸ä¸ªrootCmdæ件ãä½ å¯ä»¥éæ©å¨åéçå°æ¹æ·»å é¢å¤çå½ä»¤ã
Cobraä¸éè¦ç¹æ®çæé å½æ°ãç®åçå°±å¯ä»¥åå»ºä½ çå½ä»¤ã
çæ³æ åµä¸ä½ æè¿ä¸ªæ¾å¨å¨app/cmd/root.go
ä½ ä¼å¦å¤å®ä¹æ å¿åå¤çé ç½®init()å½æ°ã
æ¯å¦cmd/root.go
ä½ éè¦å¨mainå½æ°éæ§è¡rootå½ä»¤ã
é常main.goæ件é常空æ´ãå®ä¸»è¦åªå¹²ä¸ä»¶äºï¼åå§åCobraã
å ¶å®çå½ä»¤é常å®ä¹å¨cmd/ç®å½ä¸çèªå·±æ件å
å¦æä½ æ³å建ä¸ä¸ªversionå½ä»¤ï¼ä½ å¯ä»¥å建cmd/version.goæ件ï¼å¹¶å¨æ件éè¿ä¹å:
æ å¿æä¾ä¿®é¥°ç¬¦æ§å¶å¨ä½å½ä»¤å¦ä½æä½
å½æ å¿å®ä¹å¥½äºï¼æ们éè¦å®ä¹ä¸ä¸ªåéæ¥å ³èæ å¿
'æä¹ '表示æ¯ä¸ªå¨é£ä¸ªå½ä»¤ä¸çå½ä»¤é½å°è½åé å°è¿ä¸ªæ å¿ã对äºå ¨å±æ å¿ï¼'æä¹ 'çæ å¿ç»å®å¨rootä¸ã
Cobraé»è®¤åªå¨ç®æ å½ä»¤ä¸è§£ææ å¿ï¼ç¶å½ä»¤å¿½ç¥ä»»ä½å±é¨æ å¿ãéè¿æå¼Command.TraverseChildrenCobraå°ä¼å¨æ§è¡ä»»æç®æ å½ä»¤å解ææ å¿
ä½ åæ ·å¯ä»¥éè¿viperç»å®æ å¿ï¼
å¨è¿ä¸ªä¾åä¸ï¼æ°¸ä¹ çæ è®°author被viperç»å®,注æ,å½ç¨æ·æ²¡æç»--authoræä¾å¼ï¼authorä¸ä¼è¢«èµå¼ã
æ è®°é»è®¤æ¯å¯éçï¼å¦æä½ å¸æå½ä¸ä¸ªæ 记没æ设置æ¶ï¼å½ä»¤è¡æ¥éï¼ä½ å¯ä»¥æ è®°å®ä¸ºå¿ é¡»ç
éªè¯ä½ç½®åæ°å¯ä»¥éè¿CommandçArgså段ã
å ç½®ä¸åéªè¯æ¹æ³
ä¸ä¸ªè®¾ç½®èªå®ä¹éªè¯çä¾å
å¨ä¸é¢çä¾åï¼æ们å®ä¹äº3个å½ä»¤ã2个å¨é¡¶çº§ï¼ä¸ä¸ªï¼cmdTimesï¼æ¯å ¶ä¸ä¸ä¸ªé¡¶çº§å½ä»¤çåå½ä»¤ãå¨è¿ä¸ªä¾åéï¼ç±äºæ²¡æç»rootCmdæä¾Runï¼åç¬çrootæ¯ä¸è½è¿è¡çï¼å¿ é¡»è¦æåå½ä»¤ã
æä»¬ä» ä¸ºä¸ä¸ªå½ä»¤å®ä¹äºæ è®°ã
æ´å¤å ³äºflagsçææ¡£å¯ä»¥å¨æ¾å°
æ´å®æ´å¤§åç¨åºçä¾å,å¯ä»¥æ¥çHugo.
å½ä½ çç¨åºæåå½ä»¤æ¶ï¼Cobraä¼èªå¨ç»ä½ ç¨åºæ·»å helpå½ä»¤ãå½ä½ è¿è¡âapphelpâï¼ä¼è°ç¨helpå½ä»¤ãå¦å¤ï¼helpåæ ·æ¯æå ¶å®è¾å ¥å½ä»¤ãä¾å¦ï¼ä½ æä¸ä¸ªæ²¡æä»»ä½å ¶å®é ç½®çå½ä»¤å«âcreateâï¼å½ä½ è°ç¨âapphelpcreateâCorbraå°ä¼èµ·ä½ç¨ã
ä¸é¢çè¾å ¥æ¯Cobraèªå¨çæçãé¤äºå½ä»¤åæ å¿çå®ä¹ï¼å ¶å®ä¸åéè¦ã
helpå°±è·å ¶å®å½ä»¤ä¸æ ·ï¼å¹¶æ²¡æç¹æ®çé»è¾æè¡ä¸ºãäºå®ä¸ï¼ä½ ä¹å¯ä»¥æä¾ä½ èªå·±helpå¦æä½ æ³çè¯ã
ä½ è½ä¸ºé»è®¤çå½ä»¤ï¼æä¾ä½ èªå·±çhelpå½ä»¤æ模æ¿ã使ç¨ä¸é¢çæ¹æ³:
å2个ä¹å°éç¨äºä»»ä½åå½ä»¤
å½ç¨æ·æä¾æ æçæ è®°æå½ä»¤ï¼Cobraå°ä¼è¿åç¨æ³ã
ä½ å¯è½ä»ä¸é¢ç帮å©æè¯å°ï¼é»è®¤ç帮å©å°è¢«åµå ¥å°ç¨æ³éç¶åä½ä¸ºè¾åºã
ä½ è½æä¾ä½ èªå·±çç¨æ³å½æ°æ模æ¿ç»Cobra使ç¨ã
æ¯å¦å¸®å©ï¼æ¹æ³å模æ¿é½å¯ä»¥éåã
å¦æVersionå段设置å°äºæ ¹å½ä»¤ï¼Cobraä¼æä¾äºä¸ä¸ªé¡¶å±â--versionâæ è®°ãè¿è¡å¸¦ä¸â--versionâæ è®°çç¨åºï¼å°ä¼æç §æ¨¡æ¿çæ¬ä¿¡æ¯ã模æ¿å¯ä»¥éè¿cmd.SetVersionTemplate(sstring)æ¹æ³ä¿®æ¹
å¨å½ä»¤è¿è¡åæè¿è¡åï¼åè¿è¡æ¹æ³é常容æãPersistentPreRunåPreRunæ¹æ³å°ä¼å¨Runä¹åæ§è¡ãPersistentPostRunåPostRunæ¹æ³å°ä¼å¨Runä¹åæ§è¡ãPersistent*Runæ¹æ³ä¼è¢«åå½ä»¤ç»§æ¿ï¼å¦æå®ä»¬èªå·±æ²¡æå®ä¹çè¯ãè¿äºæ¹æ³å°æç §ä¸é¢çå±æ§æ§è¡ï¼
ä¸é¢çä¾åï¼2个å½ä»¤é½ä½¿ç¨äºä¸é¢çç¹æ§ãå½åå½ä»¤æ§è¡çæ¶åï¼å®å°æ§è¡æ ¹å½ä»¤çPersistentPreRunï¼ä½ä¸ä¼æ§è¡æ ¹å½ä»¤çPersistentPostRunï¼
è¾åº:
Cobraä¼èªå¨è¾åºå»ºè®®ï¼å½éå°âunknowncommandâé误æ¶ãè¿ä½¿å¾å½è¾å ¥é误æ¶ï¼Cobraçè¡ä¸ºç±»ä¼¼gitå½ä»¤ãä¾å¦ï¼
建议ä¼åºäºæ³¨åçåå½ä»¤èªå¨çæã使ç¨äºLevenshteindistanceçå®ç°ãæ¯ä¸ä¸ªæ³¨åçå½ä»¤ä¼å¹é 2个è·ç¦»ï¼å¿½ç¥å¤§å°åï¼æ¥æä¾å»ºè®®ã
å¦æä½ å¸æå¨ä½ çå½ä»¤éï¼ç¦ç¨å»ºè®®æèå¼±å符串çè·ç¦»ï¼ä½¿ç¨ï¼
æ
ä½ å¯ä»¥éè¿SuggestForæ¥ç»å½ä»¤æä¾æç¡®çåè¯å»ºè®®ãè¿ä¸ªç¹æ§å 许å½å符串ä¸ç¸è¿ï¼ä½æ¯ææä¸ä½ çå½ä»¤ç¸è¿ï¼å«åä½ ä¹ä¸æ³ç»è¯¥å½ä»¤è®¾ç½®å«åãæ¯å¦ï¼
Cobraå¯ä»¥åºäºåå½ä»¤ï¼æ è®°ï¼ççæææ¡£ã以以ä¸æ ¼å¼ï¼
Cobraå¯ä»¥çæä¸ä¸ªbash-completionæ件ãå¦æä½ ç»å½ä»¤æ·»å æ´å¤ä¿¡æ¯ï¼è¿äºcompletionså¯ä»¥é常强大åçµæ´»ãæ´å¤ä»ç»å¨BashCompletionsã
golangci-lineå·¥å ·ä»ç»å¨ciè¿ç¨ä¸ï¼ç»å¸¸æä¸äºå¯ä»¥éè¿éæåææè ç½çæ£æµå»é¿å ä¸äºé®é¢ä»¥åè§è代ç æ ¼å¼ï¼ä½¿ç¨Goè¯è¨ä¸è¬æ¯ä½¿ç¨golangci-lineä½ä¸ºä»£ç æ£æµå·¥å ·ï¼
åèå®ç½ï¼
å®è£ ï¼curl-sSfL|sh-s---b$(goenvGOPATH)/binv1..0
çæ¬ä¿¡æ¯:golangci-lint--version
ç®åæå¸æ¯èªå·±äºå¼çgolangci-lineï¼æ以è¿é使ç¨çå¼æºçæ¬ï¼å ¶å®å¤§åå°å¼ï¼å°±æ¯å¼åäºä¸äºæ件ï¼
è¿ä¸ªå°±æ¯ä¸ä¸ªå·¥å ·ï¼éæäºåç±»èªå¨æ£æµä»£ç çå·¥å ·ï¼æ以ä¸éè¦æ¬å°å®è£ 太å¤çå·¥å ·ï¼åªéè¦è¿ä¸ªå·¥å ·å³å¯ï¼
ç±äºå®éè¦ä¸ä¸ªgoç项ç®ï¼è¿é以æèªå·±ç项ç®å»ä»ç»ï¼é¡¹ç®å°åï¼ï¼å¦ææåå¦æ³èªå·±å°è¯ä¸å¯ä»¥ç´æ¥ä¸è½½æè¿ä¸ªé¡¹ç®ï¼é¡¹ç®ä¹æ¯è¾è§èï¼
å ¶å®æ§è¡golangci-lintrun-hå°±å¯ä»¥è·å以ä¸å¸®å©
ä¾å¦æç»å¸¸ä½¿ç¨ç:ææ¥å¸¸å°±æ¯å¼å¯formatåè½ï¼
1ãé»è®¤ä½¿ç¨çæ件
2ãé»è®¤æ²¡ç¨ç
3ãpresetsåç±»ï¼
å ·ä½å¯ä»¥åèæç:
主è¦æ¯åä¸äºæ ç¨ä»£ç æ£æµï¼ç®å代ç ï¼æ ¼å¼å代ç ï¼ç¶åæ§è¡golangci-lintrun--fixå³å¯
Go框架比较:goframe、beego、iris和gin
在Web开发中,Golang提供了多种框架,如goframe、beego、iris和gin。它们在设计和功能定位上更像是组件,而非完整的框架,需要额外的组件集成。尽管如此,它们都具备完备的Web开发能力,是net/ 地址库数据符合预期。使用浏览器和本地工具对 pprom 数据进行分析,包括 top、火焰图(Flame Graph)等视图。通过火焰图发现内存泄漏点,进一步定位到 goroutine 数量异常。
原来,服务中存在 goroutine 泄漏问题,原因在于一个 singleflight 实现的错误处理,未正确调用 wg.Done()。只有一小部分节点出现此问题,分析代码后定位问题。检查发现,引用的 trpc localcache 库在 年 9 月 日已修复相关问题,但本地代码未及时更新。与负责人沟通后,问题已记录并将在近期修复。
总结这次排查经历,初期迷茫于现象难以解释,后来深入分析内存问题,陷入对内存问题的单一视角,考虑更换库解决,最后意识到 goroutine 泄漏是问题关键。问题定位清晰后,解决较为直接。提醒开发者在代码中关注 goroutine 管理,防止内存泄漏问题。
经验教训:任何 bug 都有其合理的解释,深入分析问题,避免盲目猜测,通过系统化排查方法,最终解决问题。希望开发者代码中没有 bug。
个很不错的Golang开源项目
以下是一些不错的Golang开源项目,它们涵盖了从基础的Web服务器到复杂的分布式系统,涉及多个领域的应用。
1. Kubernetes示例:这段代码展示了如何使用Go语言创建和管理Pod,从创建Kubernetes客户端、构建Pod、在集群中创建Pod并获取Pod列表到最后删除Pod,提供了一个基本的Kubernetes操作流程。
2. CockroachDB示例:此示例涵盖了创建数据库连接、创建表、插入数据、查询数据、更新数据和删除数据等基本操作,为使用Golang与CockroachDB集成提供了一个清晰的示例。
3. Gogs示例:该示例展示了使用Golang编写的基本Web应用程序,创建了一个简单的Web服务器,并处理了根路径、用户路径和创建用户路径的HTTP请求,使用了Gin框架来处理路由和请求。
4. Hugo示例:这展示了使用Golang编写的静态网站生成器,创建了一个新的Hugo站点并使用Hugo API加载和构建站点内容,注意,此示例中站点的构建仅包括结构构建而未渲染内容,这在实现实际站点时通常需要多次构建和调试。
5. Prometheus示例:该示例展示了使用Golang编写的度量指标收集器,创建了计数器和直方图指标,并使用Prometheus客户端库公开这些指标,同时启动了一个HTTP服务器处理请求,增加了计数器和直方图指标,此示例还指导如何添加更多指标并自定义度量逻辑。
6. etcd示例:这个简单的示例展示了使用Golang编写的分布式键值存储系统,创建了一个etcd客户端,将键与值关联,获取键值对并打印输出,最后关闭etcd客户端连接,强调了在实际使用中可以利用etcd的高可用性、分布式事务等功能构建更复杂的分布式系统。
7. WireGuard示例:这是一个使用Golang编写的***软件示例,创建了一个WireGuard接口并添加了一个对等点,实际使用中可以配置接口和对等体设置,安全地通过WireGuard ***通道传输数据,但需要注意WireGuard为相对较新的协议,可能不适合所有用例。
8. Buffalo示例:这展示了使用Golang编写的Web应用程序,创建了一个名为“myapp”的新Buffalo应用程序,并将主页路由指向index.html视图,指导如何添加更多的路由和视图构建复杂的Web应用程序。
9. GoCD示例:该示例展示了使用Golang编写的持续交付和持续集成系统,创建了一个GoCD客户端并连接到GoCD服务器,获取所有管道组和管道的名称,提供了利用GoCD功能构建完整的CI/CD流水线的指导。
. Moby示例:这是使用Golang编写的容器引擎示例,创建了一个Docker客户端并列出所有正在运行的容器,指导如何利用Moby的功能和API构建更复杂和高级的容器化应用程序。
这些示例涵盖了Golang在不同领域的应用,从基础的Web开发到复杂的系统集成,展示了Golang在现代软件开发中的广泛适用性。