eddycjy / go-programming-tour-book-comments Goto Github PK
View Code? Open in Web Editor NEWgo-programming-tour-book-comments
go-programming-tour-book-comments
6.7 公开和发布度量指标 为了确定我们当前正在运行的 Go 程序其性能情况如何,我们常常需要借助各种手段去进行收集和查看指标,而这些指标我们常常称其为度量(Metrics)指标,这些指标能够更好的帮助我们确定应用程序中的问题区域和瓶颈在哪里,并且能够借助一些开源组件来绘制监控图表,非常的方便。
度量指标一般可以分为以下几种类别:
与网络带宽使用
1.1 打开工具之旅 我想,绝大部分工程师,都会想拥有一个属于自己的工具集,那一定是一件很酷又非常有趣的事情。因为它在给你带来极大的生活和工作效率提高的同时也能给你带来不少的成就感,更重要的是在你持续不断的维护迭代你的项目的时候,你的技术也会得到磨炼,而你遇到的问题,别人可能也有,当你更进一步地开
2.6 模块开发:标签管理 在初步完成了业务接口的入参校验的逻辑处理后,接下来我们正式的进入业务模块的业务逻辑开发,在本章节将完成标签模块的接口代码编写,涉及的接口如下:
功能 HTTP 方法 路径 新增标签 POST /tags 删除指定标签 DELETE /tags/:id 更新指定标签 PUT /tags/:id 获取标签列表 GET /tags 2.6.1 新建 model 方法 首先我们
1.2 单词格式转换 在日常的生活和工作中,我们经常拿到一些单词的命名字符串,需要将它转换为各种各样格式的命名,像是在程序中,你原本已经定义了某个命名,但你可能会需要将其转为一个或多个 const 常量,这时候如果你人工一个个的修改,那就太繁琐了,并且还有可能改错,如此来往多次,那这工作效率实在是太低了。
实际上我们可以通过编写一个小工
5.2 缓存淘汰算法 本书讨论的缓存,是指存放在内存的。那么容量一般是有限的,因为内存是有限的。因此,当缓存容量超过一定限制时,应该移除一条或多条数据。那应该移除谁呢?答案是尽可能移除“无用”数据。那怎么判断数据是否“无用”?这就涉及到缓存淘汰算法。
常用的缓存淘汰算法有:
FIFO(先进先出) LFU(最少使用) LRU(最近最少使用) 本节讲解具体算法实现时,我们不考虑并发(即单 g
2.13 优雅重启和停止 付费知识,请右拐《Go 语言编程之旅》纸质书,传送门: 出版社的官方旗舰店 。
https://golang2.eddycjy.com/posts/ch2/13-graceful-restart-stop/
4.2 WebSocket 介绍、握手协议和细节 基于 WebSocket 的聊天室是本章的重点。先一起认识下 WebSocket。
4.2.1 WebSocket 介绍 来自维基百科的解释:
WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。 WebSocket 协议在 2011 年由 IETF 标准化为 RFC
2.5 为接口做参数校验 接下来我们将正式进行编码,在进行对应的业务模块开发时,第一步要考虑到的问题的就是如何进行入参校验,我们需要将整个项目,甚至整个团队的组件给定下来,形成一个通用规范,在今天本章节将核心介绍这一块,并完成标签模块的接口的入参校验。
2.5.1 validator 介绍 在本项目中我们将使用开源项目
6.1 Go 大杀器之性能剖析 PProf(上) 应用程序在运行时,总是会出现一些你所意料不到的问题,像是跑着跑着突然报警,监控提示你进程 CPU 使用率过高、内存占用不断增大(疑似泄露)、临时内存大量申请后长时间内不滑,又或是 Goroutine 泄露、出现 Goroutine 数量暴涨,并且持续保持,甚至是莫名其妙在某次迭
1.3 便捷的时间工具 平时在查看原始数据时,有时候要看格式化后的个性化时间,又或是直接看时间戳等等,这些都是我们时不时会接触到的。更甚的是,如果不同系统中的时间格式不一样,比较规则不一样,那你每用一次都要做一轮转换。又有可能是,你的业务接口的入参开始时间和结束时间是一个时间戳的值,在通常情况下,你是不是要靠外部的一些快捷站点,又或是内部的 Web 站点去获
5.4 缓存的性能和优化思路 前面我们实现的并发安全的进程内缓存性能如何呢?一般地,Go 语言中,对性能的判定通过标准库提供的基准测试来实现。
5.4.1 基准测试 因为需要同时测试 Set 和 Get,因此为我们前面实现的缓存增加一个导出的 Set 方法:
func (t *TourCache) Set(key string, val interface{}) { if val == nil { return } t.mainCache.set(key, val) } 对于基准测试,我们在 BigCache 这个库的作者的基准测试基础上,增加 TourCache 的测试,并加上 SetGet 并行测试。可以通过如下命令获取我们的 fork 的测试代码,并执行测试:
$ git clone https://github.com/polaris1119/bigcache-bench $ cd bigcache-bench $ go test -bench=. -benchmem -benchtime=4s ./... -timeout 30m 看看测试的结果。
goos: lin
6.5 用 GODEBUG 看 GC 6.5.1 GC 的基础知识 6.5.1 什么是 GC 在计算机科学中,垃圾回收(GC)是一种自动管理内存的机制,垃圾回收器会去尝试回收程序不再使用的对象及其占用的内存。而最早 John McCarthy 在 1959 年左右发明了垃圾回收,以简化 Lisp 中的手
附录 D:让 Go panic 的十种方法 本章节有且仅有一个目的,那就是让你的 Go 程序遇到 panic。
D.1 数组/切片索引越界 func main() { names := []string{ "煎鱼", "eddycjy", "Go 语言编程之旅", } name := names[len(names)] fmt.Printf("name: %s", name) } 运行结果:
panic: runtime error: index out of range [3] with length 3 goroutine 1 [running]: main.main() /Users/eddycjy/go-application/awesomePanic/main.go:11 +0x1b D.2 空指针调用 type User struct { Name string } func
3.6 同时提供 HTTP 接口 3.6.1 为什么要提供其它协议的支持 在我们完成了多个 gRPC 服务后,总会有遇到一个需求,那就是提供 HTTP 接口,又或者针对一个 RPC 方法,提供多种协议的支持,但为什么会出现这种情况呢?
这基本是由于以下几种可能性,第一:心跳、监控接口等等,第二:业务场景变化,同一个 RPC 方法需要针对多种协议的业务场
gorm v2版本没有gorm解决方案
func (m *Model) BeforeUpdate(tx *gorm.DB) error {
now := time.Now().Unix()
tx.Statement.SetColumn("modified_at", now)
return nil
}
2.1 开启博客之路 2.1.1 用什么 本次博客项目将选用 gin 框架来完成开发,gin 是用 Go 编写的一个 HTTP Web 框架,它具有类似于 Martini 的 API 风格,并且它使用了著名的开源项目 httprouter 的自定义版本作为路由基础,使得它的性能表现更高更好,相较 Martini 大约提高了 40 倍。
另外 gin 除了快以外,还具备小
2.8 对接口进行访问控制 在完成了相关的业务接口的开发后,你正打算放到服务器上给其他同事查看时,你又想到了一个问题,这些 API 接口,没有鉴权功能,那就是所有知道地址的人都可以请求该项目的 API 接口和 Swagger 文档,甚至有可能会被网络上的端口扫描器扫描到后滥用,这非常的不安全
https://golang2.eddycjy.com/posts/ch2/08-api-access-security/
4.7 非核心功能 在日常的互联网项目开发中,一般先快速开发出一个最小可运行版本(MVP),投入市场验证。之后快速迭代,并进行其他非核心功能的开发。本文介绍聊天室的一些非核心功能如何实现。
说明:这里涉及到的功能,对一个聊天室来说,并不一定就是非核心功能。只是针对本书来说,它是非核心功能,因为没有它们,聊天室也可以正常运作。当然,核心还
https://golang2.eddycjy.com/posts/ch4/07-non-core-functions/
[root@blog-services]# go run main.go 2023/07/08 13:14:30 init DBEngine err: invalid bool value: %!t(string=1) exit status 1
这个似乎是main.go
中的setupDBEngine
报错,而这个err为t(string=1)
这种err意味着什么,数据库连接问题吗,但config是对的。
而当我禁用log时则能正常提供服务
3.9 Metadata 和 RPC 自定义认证 3.9.1 Metadata 介绍 在 HTTP/1.1 中,我们常常通过直接操纵 Header 来传递数据,而对于 gRPC 来讲,它基于 HTTP/2 协议,本质上也可是通过 Header 来进行传递,但我们不会直接的去操纵它,而是通过 gRPC 中的 metadata 来进行调用过程中的数据传递和操纵。但需要注意的是,metadata 的使用需要我们所使用的库进行支持,并不能像 HTTP/1.1 那样自行去
https://golang2.eddycjy.com/posts/ch3/09-grpc-metadata-creds/
2.9 应用中间件 完成了接口的访问控制后,心中的一块大石终于落地了,你在开发服务器上将这个项目运行了起来,等着另外一位同事和你对接你所编写的后端接口后便愉快的先下班了。
但结果第二天你一来,该同事非常苦恼的和你说,你的接口,怎么调一下就出问题了,你大为震惊,详细的咨询了是几时调用的接口,调用的接口是哪个,入参又是什么
1.4 SQL 语句到结构体的转换 付费知识,请右拐《Go 语言编程之旅》纸质书,传送门: 出版社的官方旗舰店 。
2.2 进行项目设计 在完成了初步的示例演示后,接下来就是进入具体的预备开发阶段,一般在正式进入业务开发前,我们会针对本次需求的迭代内容进行多类的设计和评审,无设计不开发。但是问题在于,我们目前还缺很多初始化的东西没有做,因此在本章节中,我们主要针对项目目录结构、接口方案、路由注册、数据库等设计进行思考和设计开发。
2.2.1 目录结构 我们先将
3.11 服务注册和发现 付费知识,请右拐《Go 语言编程之旅》纸质书,传送门: 出版社的官方旗舰店 。
https://golang2.eddycjy.com/posts/ch3/11-grpc-naming-discovery/
2.4 生成接口文档 我们在前面的章节中完成了针对业务需求的模块和路由的设计,并且完成了公共组件的处理,初步运行也没有问题,那么这一次是不是真的就可以开始编码了呢?
其实不然,虽然我们完成了路由的设计,但是接口的定义不是一个人的事,我们在提前设计好接口的入参、出参以及异常情况后,还需要其他
3.3 gRPC 的使用和了解 3.3.1 安装 我们在 grpc-demo 项目下,在命令行执行 Go 语言的 gRPC 库的安装命令,如下:
$ go get -u google.golang.org/[email protected] 3.3.2 gRPC 的四种调用方式 在 gRPC 中,一共包含四种调用方式,分别是:
Unary RPC:一元 RPC。 Server-side streaming RPC:服务端流式 RPC。 Client-side streaming RPC:客户端流式 RPC。 Bid
2.8 上传图片和文件服务 在处理文章模块时,你会发现 blog_article 表中的封面图片地址(cover_image_url)是我们直接手动传入的一个虚构地址,那么在实际的应用中,一般不同的架构分层有多种处理方式,例如:由浏览器端调用前端应用,前端应用(客户端)再调用服务端进行上传,第二种是浏览器端直接调用服务端接口上传文件,再调用服务器端的其它业务接口完成业务属性填写。
那么在本章节我们将继续完善功能,
6.2 Go 大杀器之性能剖析 PProf(下) 付费知识,请右拐《Go 语言编程之旅》纸质书,传送门: 出版社的官方旗舰店 。
2.3 编写公共组件 刚想正式的开始编码,你会突然发现,怎么什么配套组件都没有,写起来一点都不顺手,没法形成闭环。
实际上在我们每个公司的项目中,都会有一类组件,我们常称其为基础组件,又或是公共组件,它们是不带强业务属性的,串联着整个应用程序,一般由负责基建或第一批搭建的该项目的同事进行梳理和编写,如果没有这类组件,谁都写一套,是非常
https://golang2.eddycjy.com/posts/ch2/03-auxiliary-component/
4.1 基于 TCP 的聊天室 本节通过命令行来模拟基于 TCP 的简单聊天室。
本程序可以将用户发送的文本消息广播给该聊天室内的所有其他用户。该服务端程序中有四种 goroutine:main goroutine 和 广播消息的 goroutine,以及每一个客户端连接都会有一对读和写的 goroutine。
先在本地创建一个项目(若为 Windows 系统,可根据实际情况自行调整项目的路径):
$ mkdir -p $HOME/go-programming-tour-book/chatroom $ cd $HOME/go-programming-tour-book/chatro
3.2 Protobuf 的使用和了解 3.2.1 安装 3.2.1.1 protoc 安装 在 gRPC 开发中,我们常常需要与 Protobuf 进行打交道,而在编写了.proto 文件后,我们会需要到一个编译器,那就是 protoc,protoc 是 Protobuf 的编译器,是用 C++ 所编写的,其主要功能是用于编译.proto 文件。
接下来我们进行 protoc 的安装,在命令行下执行安装命令(需要依赖一些库,可根据错误提示搜索并进行依赖库的安装):
$ wget https://github.
2.10 进行链路追踪 付费知识,请右拐《Go 语言编程之旅》纸质书,传送门: 出版社的官方旗舰店 。
4.6 实现聊天室:广播器 上一节介绍了聊天室的核心流程,其中多次提到了 Broadcaster,但没有过多涉及到其中的细节。本节我们详细介绍它的实现:广播器,这是聊天室的一个核心模块。
4.6.1 单例模式 Go 不是完全面向对象的语言,只支持部分面向对象的特性。面向对象中的单例模式是一个常见、简单的模式。前文提
Go 语言编程之旅:一起用 Go 做项目 本书定位 本书不直接介绍 Go 语言的语法基础,内容将面向项目实践,同时会针对核心细节进行分析。而在实际项目迭代中,常常会出现或多或少的事故,因此本书也针对 Go 语言的大杀器(分析工具)以及常见问题进
3.8 拦截器介绍和实际使用 我想在每一个 RPC 方法的前面或后面做某些操作,我想针对某个业务模块的 RPC 方法进行统一的特殊处理,我想对 RPC 方法进行鉴权校验,我想对 RPC 方法进行上下文的超时控制,我想对每个 RPC 方法的请求都做日志记录,怎么做呢?
这诸如类似的一切需求的答案,都在本章节将要介绍的拦截器(Interceptor)上,你能够
3.4 运行一个 gRPC 服务 在了解了 gRPC 和 Protobuf 的具体使用和情况后,我们将结合常见的应用场景,完成一个 gRPC 服务。而为了防止重复用工,这一个 gRPC 服务将会直接通过 HTTP 调用我们上一章节的博客后端服务,以此来获得标签列表的业务数据,我们只需要把主要的精力集中在 gRPC 服务相关联的知识上就可以了,同时后续的数个章节知识点的开展都会围绕着这个服务来进行。
3.4.1 初始化项目 $ mk
附录 B:Goroutine 与 panic、recover 的小问题 在 Go 语言中,goroutine、panic、recover 是人尽皆知关键字,几乎在每一个项目中,你必定会主动地使用到它。即使你不主动使用,你也无法避免你所使用的标准库、第三方外部依赖模块使用它。
虽然它们在程序中非常常见,但依然会有许多刚入门的开发者在初次使用时遇到小 “坑”,并对这个处理结果都表现出很震惊,接下来在本文中我们将对
https://golang2.eddycjy.com/posts/appendix/02-goroutine-panic/
6.4 用 GODEBUG 看调度跟踪 让 Go 更强大的原因之一莫过于它的 GODEBUG 工具,GODEBUG 的设置可以让 Go 程序在运行时输出调试信息,可以根据你的要求很直观的看到你想要的调度器或垃圾回收等详细信息,并且还不需要加装其它的插件,非常方便,在本章节我们先讲解 GODEBUG
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.