-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
271 lines (240 loc) · 36.6 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>Youndry's Blog</title><meta name="author" content="Youndry"><meta name="copyright" content="Youndry"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="瞬间亦是永恒">
<meta property="og:type" content="website">
<meta property="og:title" content="Youndry's Blog">
<meta property="og:url" content="https://yuanjiemaster.github.io/index.html">
<meta property="og:site_name" content="Youndry's Blog">
<meta property="og:description" content="瞬间亦是永恒">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://s2.loli.net/2024/08/28/U5bqYDNvrcMzLX1.jpg">
<meta property="article:author" content="Youndry">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://s2.loli.net/2024/08/28/U5bqYDNvrcMzLX1.jpg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://yuanjiemaster.github.io/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css?v=4.13.0"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.1/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.33/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":false,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容:${query}","hits_stats":"共找到 ${hits} 篇文章"}},
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":200},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
infinitegrid: {
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid@4.11.1/dist/infinitegrid.min.js',
buttonText: '加载更多'
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'Youndry\'s Blog',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2025-01-11 02:32:31'
}</script><script>(win=>{
win.saveToLocal = {
set: (key, value, ttl) => {
if (ttl === 0) return
const now = Date.now()
const expiry = now + ttl * 86400000
const item = {
value,
expiry
}
localStorage.setItem(key, JSON.stringify(item))
},
get: key => {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = Date.now()
if (now > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = (url, attr = {}) => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
Object.keys(attr).forEach(key => {
script.setAttribute(key, attr[key])
})
document.head.appendChild(script)
})
win.getCSS = (url, id = false) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onerror = reject
link.onload = link.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
link.onload = link.onreadystatechange = null
resolve()
}
document.head.appendChild(link)
})
win.activateDarkMode = () => {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = () => {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://s2.loli.net/2024/08/28/U5bqYDNvrcMzLX1.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">16</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">0</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div><hr class="custom-hr"/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首頁</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 時間軸</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 標籤</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分類</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fa fa-heartbeat"></i><span> 清單</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音樂</span></a></li><li><a class="site-page child" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 照片</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 電影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友鏈</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 關於</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background-image: url('https://s2.loli.net/2024/08/28/mdWLKCXRtbpFoNv.jpg')"><nav id="nav"><span id="blog-info"><a href="/" title="Youndry's Blog"><span class="site-name">Youndry's Blog</span></a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search" href="javascript:void(0);"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首頁</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 時間軸</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 標籤</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分類</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fa fa-heartbeat"></i><span> 清單</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音樂</span></a></li><li><a class="site-page child" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 照片</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 電影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友鏈</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 關於</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">Youndry's Blog</h1><div id="site_social_icons"><a class="social-icon" href="https://github.com/YuanJieMaster" target="_blank" title="Github"><i class="fab fa-github" style="color: #24292e;"></i></a><a class="social-icon" href="mailto:xxxxxx@gmail.com" target="_blank" title="Email"><i class="fas fa-envelope" style="color: #4a7dbe;"></i></a></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/01/11/%E3%80%90%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%91%E5%8A%A8%E6%80%81%E6%9F%A5%E6%89%BE%E8%A1%A8/" title="【数据结构】动态查找表">【数据结构】动态查找表</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-01-10T18:31:21.000Z" title="发表于 2025-01-11 02:31:21">2025-01-11</time></span></div><div class="content">动态查找表动态查找表,表结构本身是在查找过程中动态生成的,动态更新意味着适合使用指针
二叉排序树二叉排序树:构造的过程就是排序的过程,在无序的关键字序列中,在既有的二叉排序树(一开始的二叉排序树是一个空树)中查询一个个关键字应该所在的位置,往二叉排序树一个个添加,最后只需要对生成的二叉排序树进行中序遍历就可以得到有序的关键字序列了
在实际应用中,平衡二叉树有其弊端——在数据量大的情况下深度太大,因为每当访问一个节点的时候,我们需要进行更多的比较(每层都要比较选择进入哪个子树),不过消耗时间主要不是在内存中元素之间的比较,而是每次进入一个节点时都需要进行磁盘I/O读取,那么为了减少时间消耗,我们现在需要的就是尽量减少树的深度,引入B-树这种数据结构
B-树B-树要尽量减少树的深度,为了达到这个目的,B-树增加了可拥有子节点的上限;还有要提高每个节点的利用率(不要存储太少的元素),设置一个下限,每个节点的子节点(M个)保持在 (m/2)-1(向上取整)<= M <= m 之间,下限取m/2(向上取整)-1是考虑到节点之间的合并操作,低于m/2才能进行合并操作,合并时候 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/12/02/TodoList%E6%97%A5%E5%BF%97%EF%BC%881%EF%BC%89/" title="TodoList日志(1)">TodoList日志(1)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-12-01T18:55:05.000Z" title="发表于 2024-12-02 02:55:05">2024-12-02</time></span></div><div class="content">TodoList设计这是创新实践课程的作业,做一个简单的TodoList应用,借这个机会把整个业务开发的流程熟悉一遍。
需求分析功能调研TODO 应用通常是一个帮助用户管理日常任务的工具,用户可以在其中创建、查看、编辑、删除任务,并通过标记任务状态来追踪进度。常见的功能包括:
创建任务:允许用户输入任务标题、描述、优先级、截止日期等信息。
查看任务:展示所有任务,并按状态(如已完成、未完成)进行过滤。
编辑任务:让用户修改任务的内容、截止日期等。
删除任务:删除已不再需要的任务。
标记任务完成/未完成:允许用户标记任务的完成状态,帮助跟踪进度。
此外,一些TODO应用还可能包括任务提醒、优先级设置、任务分类、搜索功能等扩展功能。
核心功能
这些是项目的基本功能,优先实现基本功能,扩展功能之后再说。
创建任务:用户可以添加新的任务,任务包含标题、描述和截止日期(可选)。任务可以标记为已完成或未完成。
输入框:任务标题、任务描述、截止日期。
按钮:保存、取消。
查看任务:用户可以查看所有任务,并过滤选项:全部任务、未完成任务、已完成任务。。
列表展示:任务标题、描述、状 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/30/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E5%85%AD%E8%AF%BE-%E8%B5%B0%E8%BF%9B%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/" title="【青训营X豆包MarsCode】第六课-走进消息队列">【青训营X豆包MarsCode】第六课-走进消息队列</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-30T05:47:50.000Z" title="发表于 2024-11-30 13:47:50">2024-11-30</time></span></div><div class="content">走进消息队列消息队列前世今生在现代分布式系统中,消息队列(Message Queue,简称 MQ)已成为一种不可或缺的中间件,用于解耦系统组件、提高系统可靠性与扩展性。消息队列的出现和发展,与以下几个系统问题密切相关:
系统崩溃:
在高并发系统中,直接处理请求可能导致系统崩溃。通过将请求先放入消息队列,系统可以避免瞬时过载,确保稳定运行,等待后端存储服务逐步处理这些请求。
服务处理能力有限:
当系统的处理能力达到瓶颈时,前端请求会迅速堆积,造成系统崩溃。此时可以将请求放入消息队列,按需逐步消费,避免一瞬间的请求涌入导致服务过载。
链路耗时长尾:
在一些分布式系统中,某些链路的处理时间可能会较长,导致长尾效应。通过异步方式将请求投递到消息队列中,避免长时间等待影响系统整体性能。
日志存储:
在分布式系统中,日志的存储与分析是关键环节。将日志数据发送到消息队列后,后端日志分析平台可以异步获取数据,进行实时或定期分析。
什么是消息队列?
消息队列(MQ)是一个用于存储和传输消息的容器,其本质上是一个先进先出(FIFO)的队列。在分布式系统中,消息队列通常具有以下特点:
高吞 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/30/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E4%BA%94%E8%AF%BE-TOS%20%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%AE%9E%E6%88%98/" title="【青训营X豆包MarsCode】第五课-TOS 对象存储实战">【青训营X豆包MarsCode】第五课-TOS 对象存储实战</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-30T01:57:50.000Z" title="发表于 2024-11-30 09:57:50">2024-11-30</time></span></div><div class="content">TOS 对象存储实战对象存储基本介绍抖音背后的存储发/刷抖音背后有何流程?背后有何种存储需求?
短视频生产/消费
片源系统–>审核系统–>推送系统
片源系统:用户上传的原始视频文件。
审核系统:对视频内容进行审核和检测。
推送系统:审核通过后,视频被推送至用户推荐流。
存储需求:海量、便宜、易用
为什么对象存储为什么需要对象存储呢?
海量数据:抖音每天生成海量的短视频文件。
高性价比:存储系统需要具备高效的数据存储能力,同时成本需控制在合理范围内。
易用性:存储系统需要简单易用,能够高效支持数据上传、下载以及检索等操作。
存储系统:单机存储、单机数据库、分布式数据库、分布式存储
单机存储(单机文件/KV):文件系统、Key-Value 存储
单机数据库(少量(半)结构化数据):关系型数据库、非关系型数据库
分布式数据库(大量(半)结构化数据):关系型数据库、非关系型数据库
分布式存储(大数据计算中间结果/视频/图片):分布式文件系统、对象存储
分布式存储:分布式文件系统HDFS、对象存储TOS
对象存 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/28/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E5%9B%9B%E8%AF%BE-Redis-%E5%A4%A7%E5%8E%82%E7%A8%8B%E5%BA%8F%E5%91%98%E6%98%AF%E6%80%8E%E4%B9%88%E7%94%A8%E7%9A%84/" title="【青训营X豆包MarsCode】第四课-Redis-大厂程序员是怎么用的">【青训营X豆包MarsCode】第四课-Redis-大厂程序员是怎么用的</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-28T09:40:50.000Z" title="发表于 2024-11-28 17:40:50">2024-11-28</time></span></div><div class="content">Redis-大厂程序员是怎么用的Redis是什么为什么需要Redis,Redis的基本工作原理
Redis:开源的、高性能的、支持多种数据结构的Key-Value数据库。不仅是一个缓存系统,还是一个持久化的数据库,能够在内存中高效地进行读写操作。
背景:数据量增加、读写数据压力的不断增加(如秒杀、抢购、社交平台的点赞、评论等),传统关系型数据库(如 MySQL)往往无法满足高并发的需求,可能导致响应时间过长、系统崩溃等问题。Redis 的出现提供了一个高效的解决方案。
高性能读写操作: Redis 是一个内存数据库,通过内存存储数据,读取速度极快,尤其在处理大量并发请求时表现优异。
数据持久化:虽然 Redis 是一个内存数据库,但它支持两种持久化机制:RDB 快照和AOF(追加日志)。这使得 Redis 即使在系统重启或故障时,也能恢复数据。
单线程执行:Redis的命令由单一线程处理,避免了多线程带来的复杂性和性能瓶颈。在单线程下实现高并发处理,避免了多线程并发时可能出现的锁竞争、死锁等问题。虽然单线程看似是性能瓶颈,但 Redis 使用了非常高效的事件驱动机制,能够在一个线程内处 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/28/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E4%B8%89%E8%AF%BE-%E5%B8%A6%E4%BD%A0%E8%AE%A4%E8%AF%86%E5%AD%98%E5%82%A8%20&%20%E6%95%B0%E6%8D%AE%E5%BA%93/" title="【青训营X豆包MarsCode】第三课-带你认识存储 & 数据库">【青训营X豆包MarsCode】第三课-带你认识存储 & 数据库</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-28T02:44:00.000Z" title="发表于 2024-11-28 10:44:00">2024-11-28</time></span></div><div class="content">带你认识存储 & 数据库经典案例一条数据从产生,到数据流动,最后持久化的全生命周期
用户脑子 =》 后端服务器 =》 数据库 (《=》其他系统)
数据的持久化
注册“小明”,检查是否存在(合法性),用数据架构组织数据(修改内存),写入硬件(写入存储介质)
潜在问题
Q、数据库怎么保证数据不丢?
数据库通常使用事务日志和多副本存储来保证数据可靠性。即使发生故障,也能通过日志恢复数据。
Q、数据库怎么处理多人同时修改的问题?
数据库通过事务的隔离性和锁机制来确保并发访问的正确性。
Q、为什么用数据库,除了数据库还能存到别的存储系统吗?
数据库提供更强的数据管理能力(如事务、索引、高效查询),但对于特定场景,也可以使用文件系统、分布式存储等替代。
Q、数据库只能处理结构化数据吗?
不是,关系型数据库擅长处理结构化数据,而非关系型数据库可以处理半结构化或非结构化数据(如JSON、图像)。
Q、有哪些操作数据库的方式,要用什么编程语言?
常用SQL操作关系型数据库,或使用数据库的SDK(Java、Python、Go等)与其交互;非关系型数 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/25/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E4%BA%8C%E8%AF%BE-%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BARPC%E6%A1%86%E6%9E%B6/" title="【青训营X豆包MarsCode】第二课-深入浅出RPC框架">【青训营X豆包MarsCode】第二课-深入浅出RPC框架</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-25T14:43:55.000Z" title="发表于 2024-11-25 22:43:55">2024-11-25</time></span></div><div class="content">深入浅出 RPC 框架RPC 框架分层设计基本概念RPC (Remote procedure call 远程函数调用)是一种通过网络调用远程服务的方法,使程序可以像调用本地函数一样调用分布式系统中位于远程服务器上的函数。
函数映射、数据转换成字节流、网络传输
函数映射
在客户端调用一个远程函数时,如何将该调用正确映射到服务端对应的函数
服务注册,函数唯一标识符id,接口定义语言(IDL)
本地和远程是不同的进程,不共享内存
数据转换成字节流
将函数的参数和返回值序列化为可以通过网络传输的字节流格式
序列化(Serialization):将参数和返回值转换为字节流。
常用格式:JSON、XML(文本格式,易读但较慢);Protocol Buffers、Thrift、Avro(二进制格式,高效但不易读)。
反序列化(Deserialization):将接收到的字节流还原为原始数据。
序列化工具:
JSON:简单易用,语言无关,但性能不高。
Protocol Buffers(Protobuf):高效二进制序列化,适合高性能 RPC。
Thrift:序列化与 RPC 框架结合,支持多语言 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/11/03/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E4%B8%80%E8%AF%BE-Go%20%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95/" title="【青训营X豆包MarsCode】第一课-Go 语言基础语法">【青训营X豆包MarsCode】第一课-Go 语言基础语法</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-11-03T15:33:33.000Z" title="发表于 2024-11-03 23:33:33">2024-11-03</time></span></div><div class="content">Go 语言基础语法走进 Go 语言基础语法时间处理时间相关的函数,以及时间的格式化
now := time.Now()fmt.Println(t)fmt.Println(t.Format("2006-01-02 15:04:05"))
数字解析将字符串转成int:strconv.ParseInt(字符串,进制,精度位数) 或者 strconv.Atoi(字符串)(自动识别)
func main() { n, _ := strconv.ParseInt("111", 10, 64) fmt.Println(n) // 111 n2, _ := strconv.Atoi("123") fmt.Println(n2) // 123}
进程信息当我们在命令行中输入 go run example/20-env/main.go a b c d 时,os.Args可以获取到输入的参数 a b c d。
fmt.Println(os.Getenv(“PATH”))打印了环境变量 PATH 的值,它通 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/10/31/Ubuntu%E5%8F%8C%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85/" title="Ubuntu双系统安装">Ubuntu双系统安装</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-10-31T05:29:50.000Z" title="发表于 2024-10-31 13:29:50">2024-10-31</time></span></div><div class="content">Ubuntu双系统安装鉴于Linux在的种种便利,最近打算装一个Ubuntu,虽然之前使用VMware装过Ubuntu的虚拟机,但是由于未知原因(可能是内存不够,同时运行Windows和Ubuntu比较吃力),我的Ubuntu虚拟机运行得比较卡顿,于是想干脆装个双系统好了。
准备材料:U盘(最好8G以上,不要有文件,到时候需要格式化,文件会损坏)
省流:将U盘作为Ubuntu启动盘,在空余的磁盘空间安装Ubuntu系统
安装过程如下
制作启动U盘下载Ubuntu.iso文件
官网:https://ubuntu.com/download/desktop
镜像网:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/
选择合适的版本,注意选择 标记LTS 的版本,表示长期支持(比如24.04,22.04之类的)
下载写入工具(比如rufus、win32diskImager),这里使用win32diskImager
下载地址:https://sourceforge.net/projects/win32diskimager/
选择U盘,写入U ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/09/19/7%E5%A4%A9%E7%94%A8Go%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0Web%E6%A1%86%E6%9E%B6Gee%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/" title="【7天用Go从零实现】Web框架Gee教程(2)">【7天用Go从零实现】Web框架Gee教程(2)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-09-19T15:00:00.000Z" title="发表于 2024-09-19 23:00:00">2024-09-19</time></span></div><div class="content">7天用Go从零实现Web框架Gee教程(2)本文参考:https://geektutu.com/post/gee.html
好的,让我们继续往下看
Day2 上下文先看看文件结构吧
│ go.mod│ main.go│└─gee context.go gee.go go.mod router.go
这里是对gee框架进一步拆解模块化,分为context,gee,router,重点看看context,就是其实就是将Request和Response进行了封装,顶多将常用的Path、Method、StatusCode拎出来了而已, 噢,还有内部的方法,写响应的String、JSON、Data、HTML各种格式。
type Context struct { // origin objects Writer http.ResponseWriter Req *http.Request // request info Path string Method string // response info StatusCo ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://s2.loli.net/2024/08/28/U5bqYDNvrcMzLX1.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">Youndry</div><div class="author-info__description">瞬间亦是永恒</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">16</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">0</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/YuanJieMaster"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/YuanJieMaster" target="_blank" title="Github"><i class="fab fa-github" style="color: #24292e;"></i></a><a class="social-icon" href="mailto:xxxxxx@gmail.com" target="_blank" title="Email"><i class="fas fa-envelope" style="color: #4a7dbe;"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">This is my Blog</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/01/11/%E3%80%90%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%91%E5%8A%A8%E6%80%81%E6%9F%A5%E6%89%BE%E8%A1%A8/" title="【数据结构】动态查找表">【数据结构】动态查找表</a><time datetime="2025-01-10T18:31:21.000Z" title="发表于 2025-01-11 02:31:21">2025-01-11</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/12/02/TodoList%E6%97%A5%E5%BF%97%EF%BC%881%EF%BC%89/" title="TodoList日志(1)">TodoList日志(1)</a><time datetime="2024-12-01T18:55:05.000Z" title="发表于 2024-12-02 02:55:05">2024-12-02</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/11/30/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E5%85%AD%E8%AF%BE-%E8%B5%B0%E8%BF%9B%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/" title="【青训营X豆包MarsCode】第六课-走进消息队列">【青训营X豆包MarsCode】第六课-走进消息队列</a><time datetime="2024-11-30T05:47:50.000Z" title="发表于 2024-11-30 13:47:50">2024-11-30</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/11/30/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E4%BA%94%E8%AF%BE-TOS%20%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%AE%9E%E6%88%98/" title="【青训营X豆包MarsCode】第五课-TOS 对象存储实战">【青训营X豆包MarsCode】第五课-TOS 对象存储实战</a><time datetime="2024-11-30T01:57:50.000Z" title="发表于 2024-11-30 09:57:50">2024-11-30</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/11/28/%E3%80%90%E9%9D%92%E8%AE%AD%E8%90%A5X%E8%B1%86%E5%8C%85MarsCode%E3%80%91%E7%AC%AC%E5%9B%9B%E8%AF%BE-Redis-%E5%A4%A7%E5%8E%82%E7%A8%8B%E5%BA%8F%E5%91%98%E6%98%AF%E6%80%8E%E4%B9%88%E7%94%A8%E7%9A%84/" title="【青训营X豆包MarsCode】第四课-Redis-大厂程序员是怎么用的">【青训营X豆包MarsCode】第四课-Redis-大厂程序员是怎么用的</a><time datetime="2024-11-28T09:40:50.000Z" title="发表于 2024-11-28 17:40:50">2024-11-28</time></div></div></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2025/01/"><span class="card-archive-list-date">一月 2025</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/12/"><span class="card-archive-list-date">十二月 2024</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/11/"><span class="card-archive-list-date">十一月 2024</span><span class="card-archive-list-count">6</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/10/"><span class="card-archive-list-date">十月 2024</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/09/"><span class="card-archive-list-date">九月 2024</span><span class="card-archive-list-count">6</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/08/"><span class="card-archive-list-date">八月 2024</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">16</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2025-01-10T18:32:31.030Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2020 - 2025 By Youndry</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js?v=4.13.0"></script><script src="/js/main.js?v=4.13.0"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.33/dist/fancybox/fancybox.umd.min.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span> 数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div id="local-search-results"></div><div id="local-search-stats-wrap"></div></div></div><div id="search-mask"></div><script src="/js/search/local-search.js?v=4.13.0"></script></div></div></body></html>