Skip to content

Commit 4c6aa2b

Browse files
author
wangyazhou
committed
添加分布式相关
1 parent deebac0 commit 4c6aa2b

File tree

7 files changed

+205
-17
lines changed

7 files changed

+205
-17
lines changed

.obsidian/workspace.json

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,30 @@
4141
"state": {
4242
"type": "markdown",
4343
"state": {
44-
"file": "eBPF/ebpf.md",
44+
"file": "架构/分布式.md",
4545
"mode": "source",
4646
"source": false
4747
},
4848
"icon": "lucide-file",
49-
"title": "ebpf"
49+
"title": "分布式"
50+
}
51+
},
52+
{
53+
"id": "420f6196d6d3217b",
54+
"type": "leaf",
55+
"state": {
56+
"type": "markdown",
57+
"state": {
58+
"file": "go/go_package.md",
59+
"mode": "source",
60+
"source": false
61+
},
62+
"icon": "lucide-file",
63+
"title": "go_package"
5064
}
5165
}
5266
],
53-
"currentTab": 2
67+
"currentTab": 3
5468
}
5569
],
5670
"direction": "vertical"
@@ -123,7 +137,7 @@
123137
"state": {
124138
"type": "backlink",
125139
"state": {
126-
"file": "eBPF/ebpf.md",
140+
"file": "go/go_package.md",
127141
"collapseAll": false,
128142
"extraContext": false,
129143
"sortOrder": "alphabetical",
@@ -133,7 +147,7 @@
133147
"unlinkedCollapsed": true
134148
},
135149
"icon": "links-coming-in",
136-
"title": "ebpf 的反向链接列表"
150+
"title": "go_package 的反向链接列表"
137151
}
138152
},
139153
{
@@ -171,13 +185,13 @@
171185
"state": {
172186
"type": "outline",
173187
"state": {
174-
"file": "eBPF/ebpf.md",
188+
"file": "go/go_package.md",
175189
"followCursor": false,
176190
"showSearch": false,
177191
"searchQuery": ""
178192
},
179193
"icon": "lucide-list",
180-
"title": "ebpf 的大纲"
194+
"title": "go_package 的大纲"
181195
}
182196
}
183197
],
@@ -198,21 +212,24 @@
198212
"obsidian-excalidraw-plugin:新建绘图文件": false
199213
}
200214
},
201-
"active": "b7d07db209d422b0",
215+
"active": "420f6196d6d3217b",
202216
"lastOpenFiles": [
203-
"eBPF/bpftrace.md",
217+
"go/go_module.md",
218+
"go/go.md",
219+
"架构/知识学习模板.md",
220+
"架构/分布式.md",
221+
"middleware/redis.md",
204222
"eBPF/ebpf.md",
223+
"eBPF/bpftrace.md",
205224
"k8s/kubernetes.md",
206225
"containerd/docker.md",
207226
"架构/架构设计.md",
208227
"calico/calico.md",
209-
"go/go_module.md",
210228
"架构/().md",
211229
"go/高并发.md",
212230
"go/go_package.md",
213231
"go/gRPC.md",
214232
"go/memory.md",
215-
"架构/分布式.md",
216233
"calico/calico架构.md",
217234
"middleware/etcd.md",
218235
"db/DBA(Database administrator).md",
@@ -223,9 +240,6 @@
223240
"k8s/kube_state_metirc.md",
224241
"k8s/kube_prometheus.md",
225242
"k8s/harbor.md",
226-
"go/go.md",
227-
"eBPF/bcc.md",
228-
"calico/calicoctl.md",
229243
"k8s/attachments/Pasted image 20250430202140.png",
230244
"k8s/attachments/Pasted image 20250430202042.png",
231245
"k8s/attachments/Pasted image 20250430201959.png",

eBPF/ebpf.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ funccount -i 1 't:block_*'
10281028
funccount -i 1 c:getaddrinfo
10291029
```
10301030
1031-
=== stackcount
1031+
### stackcount
10321032
10331033
```bash
10341034
# 对创建块I/O的栈踪迹进行计数
@@ -1049,9 +1049,9 @@ stackcount t:sched:sched_switch
10491049
10501050
## 参考
10511051
1052-
https://arthurchiao.art/blog/cilium-bpf-xdp-reference-guide-zh/#bpf_helper[bpf-helper]
1052+
https://arthurchiao.art/blog/cilium-bpf-xdp-reference-guide-zh/#bpf_helper[bpf-helper
10531053
1054-
https://mp.weixin.qq.com/s/25mhUrNhF3HW8H6-ES7waA[epbf-st]
1054+
https://mp.weixin.qq.com/s/25mhUrNhF3HW8H6-ES7waA[epbf-st
10551055
10561056
https://gist.github.com/BruceChen7/8b15bdc26d2831e91983b3b52f114e60?permalink_comment_id=3263483[bcc-understand]
10571057

go/go.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,3 +1238,12 @@ To completely disable this security protection add
12381238
```
12391239

12401240

1241+
1242+
1243+
1244+
1245+
## 文章
1246+
1247+
1248+
1249+
官网上的 Effective Go

go/go_package.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,76 @@
1616

1717

1818

19+
## gin
20+
21+
*中间件进行路径重写*
22+
```go
23+
package main
24+
25+
import (
26+
"github.com/gin-gonic/gin"
27+
"strings"
28+
)
29+
30+
func rewriteMiddleware() gin.HandlerFunc {
31+
return func(c *gin.Context) {
32+
if strings.HasPrefix(c.Request.URL.Path, "/api/data") {
33+
// 重写请求路径为/api/v1/data
34+
c.Request.URL.Path = strings.Replace(c.Request.URL.Path, "/api/data", "/api/v1/data", 1)
35+
}
36+
c.Next()
37+
}
38+
}
39+
40+
func main() {
41+
r := gin.Default()
42+
r.Use(rewriteMiddleware())
43+
44+
r.GET("/api/v1/data", getDataHandler)
45+
46+
r.Run(":8080")
47+
}
48+
49+
func getDataHandler(c *gin.Context) {
50+
c.JSON(200, gin.H{"message": "Data from /api/v1/data"})
51+
}
52+
```
53+
54+
55+
56+
57+
*通过设置路由器别名的方式,让多个路由指向同一个处理函数*
58+
59+
```go
60+
package main
61+
import (
62+
"github.com/gin-gonic/gin"
63+
"net/http" )
64+
65+
func proxyMiddleware() gin.HandlerFunc {
66+
return func(c *gin.Context) {
67+
targetPath := "/api/v1/data"
68+
if c.Request.URL.Path == "/api/data" {
69+
http.Redirect(c.Writer, c.Request, targetPath, http.StatusPermanentRedirect)
70+
c.Abort()
71+
return
72+
}
73+
c.Next()
74+
}
75+
}
76+
77+
func main() {
78+
r := gin.Default()
79+
r.Use(proxyMiddleware())
80+
r.GET("/api/v1/data", getDataHandler)
81+
r.Run(":8080")
82+
}
83+
84+
func getDataHandler(c *gin.Context) {
85+
c.JSON(200, gin.H{"message": "Data from /api/v1/data"})
86+
}
87+
```
88+
1989

2090

2191

middleware/redis.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
3+
4+
5+
6+
7+
Redis 的数据结构,Redis 的性能优化、高可用配置、分布式锁什么
8+
9+
10+
11+
12+
13+

架构/分布式.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@
3535
[# A pattern language for microservices](https://microservices.io/patterns/index.html) 各式各样的微服务架构图,开发微服务可以找相似的进行参考
3636

3737

38+
分布式架构,那么 CAP 理论、微服务架构、弹力设计

架构/知识学习模板.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
2+
## 系统学习一门知识模板
3+
1. **这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。** 这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念
4+
5+
2. **这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么**。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。
6+
7+
3. **这个技术适用的场景**。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。
8+
9+
4. **技术的组成部分和关键点**。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。
10+
11+
5. **技术的底层原理和关键实现**。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。可以参看我在 CoolShell 上写的 Docker 底层技术那一系列文章。
12+
13+
6. **已有的实现和它之间的对比**。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。
14+
## 举一反三
15+
1. 联想能力。这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的其他事物。对于软件开发和技术学习也一样。
16+
17+
2. 抽象能力。抽象能力是举一反三的基本技能。平时你解决问题的时候,如果你能对这个问题进行抽象,你就可以获得更多的表现形式。抽象能力需要找到解决问题的通用模型,比如数学就是对现实世界的一种抽象。只要我们能把现实世界的各种问题建立成数据模型(如,建立各种维度的向量),我们就可以用数学来求解,这也是机器学习的本质。
18+
19+
3. 自省能力。所谓自省能力就是自己找自己的难看。当你得到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博。这种自己和自己辩论的能力又叫思辨能力。将自己分裂成正反方,左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个 case,从而获得完整全面的问题分析能力
20+
21+
## 如何阅读代码
22+
杰夫·阿特伍德(Jeff Atwood)说过这么一句话:`Code Tells You How, Comments Tell You Why`
23+
可见,代码并不会告诉你 Why,看代码只能靠猜测或推导来估计 Why,是揣测,不准确,所以会有很多误解。而且,我们每个人都知道,Why 是能让人一通百通的东西,也是能让人醍醐灌顶的东西。
24+
但是,代码会告诉你细节,这是书和文档不能给你的。细节是魔鬼,细节决定成败。书和文档是人对人说的话,代码是人对机器说的话
25+
26+
1. 如果你想知道人为什么要这么搞,那么应该去看书(像 Effective C++、CodeComplete、Design Pattern、Thinking in Java 等),看文档。
27+
2. 如果你要知道让机器干了什么?那你应该看代码!(就像 Linus 去看 zlib 的代码来找性能问题。)
28+
29+
如果你想了解一种思想,一种方法,一种原理,一种思路,一种经验,恐怕,读书和读文档会更有效率一些
30+
如果你想了解的就是具体细节,比如某协程的实现,某个模块的性能,某个算法的实现,那么你还是要去读代码的
31+
32+
首先,在阅读代码之前,我建议你需要有下面的这些前提再去阅读代码,这样你读起代码来会很顺畅
33+
1. 基础知识。相关的语言和基础技术的知识
34+
2. 软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,然后让软件跑起来,自己先用一下感受一下
35+
3. 相关文档。读一下相关的内部文档,Readme 也好,Release Notes 也好,Design 也好,Wiki 也好,这些文档可以让你明白整个软件的方方面面。如果你的软件没有文档,那么,你只能指望这个软件的原作者还在,而且他还乐于交流
36+
4. 代码的组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你要读的程序是在某种标准的框架下组织的,比如:Java 的 Spring 框架,那么恭喜你,这些代码不难读了。
37+
38+
接下来,你要了解这个软件的代码是由哪些部分构成的,我在这里给你一个列表,供你参考
39+
1. 接口抽象定义。任何代码都会有很多接口或抽象定义,其描述了代码需要处理的数据结构或者业务实体,以及它们之间的关系,理清楚这些关系是非常重要的。
40+
2. 模块粘合层。我们的代码有很多都是用来粘合代码的,比如中间件(middleware)、Promises 模式、回调(Callback)、代理委托、依赖注入等。这些代码模块间的粘合技术是非常重要的,因为它们会把本来平铺直述的代码给分裂开来,让你不容易看明白它们的关系。
41+
3. 业务流程。这是代码运行的过程。一开始,我们不要进入细节,但需要在高层搞清楚整个业务的流程是什么样的,在这个流程中,数据是怎么被传递和处理的。一般来说,我们需要画程序流程图或者时序处理图
42+
4. 具体实现。了解上述的三个方面的内容,相信你对整个代码的框架和逻辑已经有了总体认识。这个时候,你就可以深入细节,开始阅读具体实现的代码了。对于代码的具体实现,一般来说,你需要知道下面一些事实,这样有助于你在阅读代码时找到重点
43+
- 代码逻辑。代码有两种逻辑,一种是业务逻辑,这种逻辑是真正的业务处理逻辑;另一种是控制逻辑,这种逻辑只是用控制程序流转的,不是业务逻辑。比如:flag 之类的控制变量,多线程处理的代码,异步控制的代码,远程通讯的代码,对象序列化反序列化的代码等。这两种逻辑你要分开,很多代码之所以混乱就是把这两种逻辑混在一起了(详情参看《编程范式游记》)。
44+
- 出错处理。根据二八原则,20% 的代码是正常的逻辑,80% 的代码是在处理各种错误,所以,你在读代码的时候,完全可以把处理错误的代码全部删除掉,这样就会留下比较干净和简单的正常逻辑的代码。排除干扰因素,可以更高效地读代码
45+
- 数据处理。只要你认真观察,就会发现,我们好多代码就是在那里倒腾数据。比如DAO、DTO,比如 JSON、XML,这些代码冗长无聊,不是主要逻辑,可以不理。
46+
- 重要的算法。一般来说,我们的代码里会有很多重要的算法,我说的并不一定是什么排序或是搜索算法,可能会是一些其它的核心算法,比如一些索引表的算法,全局唯一 ID 的算法、信息推荐的算法、统计算法、通读算法(如 Gossip)等。这些比较核心的算法可能会非常难读,但它们往往是最有技术含量的部分
47+
- 底层交互。有一些代码是和底层系统的交互,一般来说是和操作系统或是 JVM 的交互。因此,读这些代码通常需要一定的底层技术知识,不然,很难读懂。
48+
5. 运行时调试。很多时候,代码只有运行起来了,才能知道具体发生了什么事,所以,我们让代码运行进来,然后用日志也好,debug 设置断点跟踪也好。实际看一下代码的运行过程,是了解代码的一种很好的方式。
49+
50+
51+
52+
53+
54+
55+
56+
57+
58+
59+
60+
61+
62+
63+
64+
65+
66+
67+
68+
69+
70+
71+
72+
73+
74+
75+
76+
77+
78+
79+
80+
81+

0 commit comments

Comments
 (0)