diff --git a/.gitignore b/.gitignore index a48cf0d..f36daff 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ public +.idea diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/posts/1.Learning/A1.StudyNotes/Hackintool-todo.md b/content/posts/1.Learning/A1.StudyNotes/Hackintool-todo.md new file mode 100644 index 0000000..c3d83b3 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/Hackintool-todo.md @@ -0,0 +1,13 @@ +--- +title: "黑苹果未完善问题点" +date: 2022-03-19T21:06:28+08:00 +tags: ["hackintool"] +categories: ["Learning", "StudyNotes"] +--- + +- [ ] 前置耳机无声音 +> https://github.com/acidanthera/AppleALC/blob/master/README_CN.md + +型号为alc222 + +alcid=11 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/_index.md b/content/posts/1.Learning/A1.StudyNotes/_index.md new file mode 100644 index 0000000..1b7d453 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/_index.md @@ -0,0 +1,13 @@ +--- +title: "学习笔记" +date: 2023-04-15T11:01:48+08:00 +categories: ["Learning", "StudyNotes"] +--- + +指记录自己在学习过程中的笔记,包括课堂笔记、阅读笔记、笔记总结等 + +包含的分类: + +* 课程笔记 +* 学习技巧 +* 讲座笔记 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/aliyunpan-mac.md b/content/posts/1.Learning/A1.StudyNotes/aliyunpan-mac.md new file mode 100644 index 0000000..ebd81d6 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/aliyunpan-mac.md @@ -0,0 +1,20 @@ +--- +title: "阿里云盘mac本地挂在" +date: 2022-03-19T21:06:28+08:00 +tags: ["aliyundriver"] +categories: ["Learning", "StudyNotes"] +--- + +主要参考文档:https://blog.51cto.com/xuedingmaojun/4815572 + +采用方式: +https://github.com/zxbu/webdav-aliyundriver#jar包运行 + +挂在地址代码 +```shell +cd /Users/xxx/Workspaces/WebRoot/logs/webdav;nohup java -jar /Users/xxx/Workspaces/Env/WebDAV/PATH/bin/webdav-aliyundriver-2.4.2.jar --aliyundrive.refresh-token="aaa" --server.port=aaa --aliyundrive.work-dir=/usr/local/etc/webdav/aliyundriver --aliyundrive.auth.user-name=aaa --aliyundrive.auth.password=aaa > /Users/aaa/Workspaces/WebRoot/logs/webdav/webdav.log 2>&1 &; + +# nohup切换前台停止 +fg + +``` \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/clickhouse.md b/content/posts/1.Learning/A1.StudyNotes/clickhouse.md new file mode 100644 index 0000000..fcfee27 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/clickhouse.md @@ -0,0 +1,50 @@ +--- +title: "ClickHouse" +date: 2022-10-02T14:54:45+08:00 +tags: ["clickhouse"] +categories: ["Learning", "StudyNotes"] +--- + +# ClickHouse + +> 官网:[clickhouse.com](https://clickhouse.com/) +> +> 学习资料:[谷粒](https://www.gulixueyuan.com/my/course/445) + +## 核心要点: + +1. MergeTree引擎 +2. OrderBy是主键 +3. 分布式 +4. Explain +5. 参数配置 +6. 语法规则 +7. 多表联查(join) + + + +## 面试题 + +1.不支持真正的`delete/update`操作,不支持`transactions`(事物) + +```text +OLAP引擎一般都不支持事物,ClickHouse的定位也是分析性数据库,而不是严格的关系型数据库,加入对于事物的支持, +必然会有锁,同时分布式事物的支持,会带来更复杂的实现,其中诸多因素,都会影响写入和查询的性能。 +``` + +2.不支持高并发查询,官方建议`100 QPS` + +```text +ClickHouse是并行计算,单个查询就可以跑满多个CPU核心,而不像MySQL单个查询单线程执行。 +``` + +3.需要批量写入,频繁的单条写入会带来写入问题 + +```text +ClickHouse存储结构有点类LSM,每次的insert基本都会生成一个文件目录,后台线程Merge目录文件,如果频繁写入, +后台线程就会Merge不过来,产生`Too many parts`异常。建议每秒不超过一次写入,并且是Batch写入。 +``` + +4.有限的SQL语法支持,JOIN语法也比较另类,暂时不支持窗口函数 + +5.稀疏索引的设计使得ClickHouse不适合做单行点查询 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/gitbook-docker.md b/content/posts/1.Learning/A1.StudyNotes/gitbook-docker.md new file mode 100644 index 0000000..0459f96 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/gitbook-docker.md @@ -0,0 +1,63 @@ +--- +title: "gitbook在docker内进行安装编译" +date: 2022-11-06T16:54:57+08:00 +tags: ["gitbook"] +categories: ["Learning", "StudyNotes"] +--- + +# Gitbook与Docker + +最近在学习k8s容器相关,了解了docker的优势,而本身对于特别在意环境的干净,之前的Gitbook不想安装原因,是因为要安装node等信息。借此机会尝试下使用docker进行安装。 + +## 1. Docker安装 + +这个比较简单,直接官网下载安装,无异常 + +## 2. docker-compose 编写 + +```yaml +# 在对应的目录下创建compose的yaml文件,我放在`Workspaces/Docker/GitBook`下 +services: + gitbook: + image: bloodstar/gitbook-builder + ports: + - "4000:4000" + volumes: + - ./gitbook:/gitbook + command: gitbook build +``` + +由于我只是使用gitbook的build,不需要serve,所以端口无所谓 + +## 3.command命令修改 + +### 3.1 初始化 + +修改command命令为`gitbook init` + +### 3.2 插件安装 + +修改command命令为`gitbook install`,这中间会存在异常,主要是网络连接github会有一定问题 + +### 3.3 编译 + +修改command命令为`gitbook build` + +## 4. 异常处理 + +### 4.1 初始化失败 + +直接建`README.md` `SUMMARY.md` 两个文件后 + +### 4.2 插件安装失败 + +需要特殊渠道,让服务可以可以访问 + +## 5. 部署 + +使用nginx做代理,直接`root`指向`Workspaces/Docker/GitBook/gitbook/_book`目录 + +到对应的目录夹下,运行命令`docker-compose up -d` + + + diff --git a/content/posts/1.Learning/A1.StudyNotes/gitbook-install.md b/content/posts/1.Learning/A1.StudyNotes/gitbook-install.md new file mode 100644 index 0000000..7582fdf --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/gitbook-install.md @@ -0,0 +1,136 @@ +--- +title: "如何编写 Gitbook" +date: 2022-03-01T01:13:27+08:00 +tags: ["gitbook"] +categories: ["Learning", "StudyNotes"] +--- + +## 环境 +nodejs +> nodejs目前的版本比较高,如果直接使用14版本,会存在gitbook安装失败,最好使用12版本 +```shell +yum install nodejs +# 检查是否安装成功 +node -v +``` + +## 安装 + +```shell +npm install -g gitbook-cli +# 检查是否安装成功 +gitbook --version + +# 出现错误 `cb.apply is not a function`,修复方法,详见`https://mizeri.github.io/2021/04/24/gitbook-cbapply-not-a-function/` + +# 修改`/usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js`文件的65行起3行,具体内容如下 + +// fs.stat = statFix(fs.stat) +// fs.fstat = statFix(fs.fstat) +// fs.lstat = statFix(fs.lstat) +``` + +## 生成book +1. 如何 `html` +```shell +gitbook build ./Thief ./ThiefTarget/ +``` + +## 配置nginx + +```shell +server { + listen 80; + listen [::]:80; + listen 81 http2; + server_name gitbook.micah.wiki; + root /xxx; + location / { + + } + location = /robots.txt {} +} + +server { + listen 443 ssl; + server_name gitbook.micah.wiki; + + ssl_certificate /yyy/cert.pem; + ssl_certificate_key /yyy/key.pem; + + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + root /xxx; + location / { + + } + location = /robots.txt {} +} +``` + +## 封面 +| | 大 | 小 | +|:----------------:|:-----------:|:-----------------:| +| **文件** | `cover.jpg` | `cover_small.jpg` | +| **大小(像素)** | 1800x2360 | 200x262 | + +## 术语 +增加 `GLOSSARY.md` 文件,貌似目前值支持英文的,不支持 GitBook 中文 术语 + +## 引用文件 +```shell +# 1. 本地文件 +{% include "./xx.md" %} +# 2. git地址 +{% include "git+https://github.com/GitbookIO/documentation.git/README.md#0.0.1" %} +# 或者 +git+https://[email protected]/project/blah.git/file#commit-ish +``` +## 继承 +编写内容类似于 +```shell +{% extends "./page_info.md" %} + +{% block pageContent %} +# This is my page content +{% endblock %} +``` +`page_info.md` 内容 +```shell +{% block pageContent %} +This is the default content +{% endblock %} + +# License + +{% import "./LICENSE" %} +``` + +## 插件 +在根目录下,创建book.json,并添加以下内容 +```json +{ + "plugins" : [ + "code", + "-lunr", + "-search", + "search-pro" + ] +} +``` +进入根目录下,执行以下命令 +```shell +gitbook install +``` + +## favicon +在项目根目录下新建 gitbook/images 目录 +在该目录下存放 favicon 文件 + +通用 (尺寸 48x48) - favicon.ico +用于苹果设备 (尺寸 152x152) - apple-touch-icon-precomposed-152.png diff --git a/content/posts/1.Learning/A1.StudyNotes/github-sync-gitee.md b/content/posts/1.Learning/A1.StudyNotes/github-sync-gitee.md new file mode 100644 index 0000000..09c374c --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/github-sync-gitee.md @@ -0,0 +1,27 @@ +--- +title: "Github同步Gitee" +date: 2022-03-02T13:48:42+08:00 +tags: ["github","gitee"] +categories: ["Learning", "StudyNotes"] +--- + +## 问题 + +由于国内访问Github受限,经常是无法访问,所以就通过Gitee来代理,如何同步成为一个问题,网上主要有两种方案: + +1. 通过项目关联,同时push到Github和Gitee +2. 通过Github的workflow进行同步 + +## 尝试 + +### 关联同时push + +参考地址:https://cloud.tencent.com/developer/article/1649682 + +### workflow + +参考地址:https://juejin.cn/post/6894928345830522887 + +### Gitee服务 + +参考地址:https://gitee.com/help/articles/4336#article-header2 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/hugo-init.md b/content/posts/1.Learning/A1.StudyNotes/hugo-init.md new file mode 100644 index 0000000..99171b2 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/hugo-init.md @@ -0,0 +1,74 @@ +--- +title: "Hugo项目部署" +date: 2022-03-13T21:06:28+08:00 +tags: ["hugo"] +categories: ["Learning", "StudyNotes"] +--- + +# 安装 + +我喜欢安装直接下载下来,放在bin目录下,所以在 [git](https://github.com/gohugoio/hugo/releases) 的release下载对应的版本 + +检查安装`hugo version`查看是否已经安装成功 + +> 一般执行的时候,会出现告警,只要进入`系统偏好设置`->`安全性与隐私`->`通用`中`仍然允许`后,再执行一次就可以了 + +# 使用 + +1. 现在自己的目录(按照自己的习惯,我习惯`~/Workspaces/WebRoot`)下,执行`hugo new site xxx` +2. 找到自己喜欢的皮肤,个人喜欢 [even](https://github.com/olOwOlo/hugo-theme-even) + 皮肤,该皮肤从hexo-theme-even移植而来,个人感觉还不错。到新建的项目下,进入 `themes` + 目录,执行 `git clone https://github.com/olOwOlo/hugo-theme-even.git even` +3. 把`exampleSite`下的`config.toml`复制到`xxx`项目下,并根据自己的方式进行修改 +4. 在 `xxx->content` 目录下,克隆你要维护的blog的markdown文档,文件夹名字命名为 `post` ,因为该theme使用的是post,而不是posts +5. 在`xxx` 目录夹运行`hugo -D`,建议先删除下`public`目录下的内容 + +命令如下 + +```shell +cd ~/Workspaces/WebRoot +hugo new site xxx +cd themes +git clone https://github.com/olOwOlo/hugo-theme-even.git even +cd ../ +mv config.toml default.config.toml +cp themes/even/exampleSite/config.toml ./ + +# 修改自己的信息 +vi config.toml + +cd content + +# clone 你blog的markdown地址 +git clone xxx post + +cd .. +rm -rf public/* +hugo -D +``` + +# web搭建 + +刚才我们安装的路径是 `~/Workspaces/WebRoot/xxx` 而hugo生成的具体内容为`~/Workspaces/WebRoot/xxx/public/` 下,所以我们需要对nginx配置地址为相应的地址 + +配置如下: + +```shell +server { + listen 80; + server_name xxx; # 这里是域名 + + access_log /Users/xxxxx/Workspaces/WebRoot/logs/xxx/access.log main; # 这里 xxxxx 表示自己的对应目录 + error_log /Users/xxxxx/Workspaces/WebRoot/logs/xxx/error.log; + + location / { + root /Users/xxxxx/Workspaces/WebRoot/xxx/public; + index index.html index.htm; + } + location /favicon.ico { + root /Users/xxxxx/Workspaces/WebRoot; + } +} +``` + +需要注意的是:nginx会获取权限失败,原因是启动的时候,需要指定用户信息`user root admin;`,并且用`sudo nginx -t`进行测试 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/hugo-xuexi.md b/content/posts/1.Learning/A1.StudyNotes/hugo-xuexi.md new file mode 100644 index 0000000..cf5541d --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/hugo-xuexi.md @@ -0,0 +1,7 @@ +--- +title: "Hugo学习" +date: 2022-02-28T12:00:24+08:00 +tags: ["hugo"] +categories: ["Learning", "StudyNotes"] +--- +在头部增加`tags`、`categories`可以在标签、分类上进行体现 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/iphone-ibook.md b/content/posts/1.Learning/A1.StudyNotes/iphone-ibook.md new file mode 100644 index 0000000..583dd9e --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/iphone-ibook.md @@ -0,0 +1,15 @@ +--- +title: "免费的苹果iBook软件" +date: 2022-03-01T01:01:19+08:00 +tags: ["phone"] +categories: ["Learning", "StudyNotes"] +--- + +## 如何操作 + +1. 打开[zlibrary](https://singlelogin.org/) 网站,选择右上角汉语 +2. 注册后,通过邮箱激活网站 +3. 登录刚才激活的邮箱,域名选择“书籍” +4. 进入后搜索你需要的书籍 +5. 选择epub类型,通过safari下载。 +6. 点开下载中的文件,通过”图书“软件打开 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/kafka.md b/content/posts/1.Learning/A1.StudyNotes/kafka.md new file mode 100644 index 0000000..98e8276 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/kafka.md @@ -0,0 +1,17 @@ +--- +title: "kafka学习" +date: 2022-10-03T15:29:00+08:00 +tags: ["kafka"] +categories: ["Tech"] +--- + +# Kafka + +> 教程地址:[Kafka](https://www.youtube.com/watch?v=19dzMtsV9pg&list=PLmOn9nNkQxJEDjzl0iBYZ3WuXUuUStxZl&index=4) + +## 一、高吞吐量 + +1. 顺序写 +2. 零拷贝 +3. 分段日志:Segment +4. 预读(Read ahead)后写(Write Behind) diff --git a/content/posts/1.Learning/A1.StudyNotes/mac-problem.md b/content/posts/1.Learning/A1.StudyNotes/mac-problem.md new file mode 100644 index 0000000..4bcdff2 --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/mac-problem.md @@ -0,0 +1,23 @@ +--- +title: "苹果系统问题" +date: 2022-03-01T01:04:18+08:00 +tags: ["mac"] +categories: ["Learning", "StudyNotes"] +--- + +## 1.邮箱无法删除 +菜单选择:邮箱 -> 重建 + +## 2. Your have Mail +找到`/var/mail`,如果里面有内容。 +使用 `mail` 查看具体内容或使用 `rm /var/mail/$USER` 进行删除 + +## 3. locale问题 远程登录时 `LC_CTYPE: cannot change locale (UTF-8)` +在.zshrc中添加以下命令 +``` +export LC_ALL=en_US.UTF-8 +export LANG=en_US.UTF-8 +``` + +## 4. image2icon +mac上的图标不是新版本,看上去很不顺眼,可以使用该软件,生成icns后,然后使用“查看简介”,直接拖动到左上角的图标上 `xclient` diff --git a/content/posts/1.Learning/A1.StudyNotes/snowflake.md b/content/posts/1.Learning/A1.StudyNotes/snowflake.md new file mode 100644 index 0000000..239ff0d --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/snowflake.md @@ -0,0 +1,141 @@ +--- +title: "雪花算法" +date: 2022-06-29T16:43:16+08:00 +tags: ["雪花算法"] +categories: ["Learning", "StudyNotes"] +--- + +## 1. 历史 + +[snowflake](https://github.com/twitter-archive/snowflake)是由 twitter 开源的分布式 id 生成算法,采 用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 bits 作为序列号。 + +小插曲:世界上没有两片相同的雪花,所以使用雪花来表示唯一 + +## 2. 算法内容 + +![snowflake](https://image.shijinping.cn/picgo/202206291654161.webp) + +* 1:第一位不使用:为什么这里第一位不使用,因为对于long类型,如果第一位是`1` 则说明是负数 + +* 2~42:表示时间戳,最多可以表示2^41-1次方的数值,可以是毫秒级。 +* 43~52:表示工作机器ID,最多支持2^10机器,也就是1024的机器。可以自己定义前几位为机房ID。 +* 53~64:表示自增ID,同一毫秒如果超过2^12次方的增长量,应该算非常大的了 + +## 3. 代码实现 + +```java + +public class SnowFlake { + + private final long workerId; + private final long datacenterId; + private long sequence; + + public SnowFlake(long workerId, long datacenterId, long sequence) { + // sanity check for workerId + // 这儿不就检查了一下,要求就是你传递进来的机房id和机器id不能超过32,不能小于0 + // 这个是二进制运算,就是 5 bit最多只能有31个数字,也就是说机器id最多只能是32以内 + // 这个是一个意思,就是 5 bit最多只能有31个数字,机房id最多只能是32以内 + long maxWorkerId = ~(-1L << workerIdBits); + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException( + String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + long maxDatacenterId = ~(-1L << datacenterIdBits); + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException( + String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, " + + "sequence bits %d, workerid %d", timestampLeftShift, datacenterIdBits, workerIdBits, + sequenceBits, workerId); + + this.workerId = workerId; + this.datacenterId = datacenterId; + this.sequence = sequence; + } + + private final long workerIdBits = 5L; + private final long datacenterIdBits = 5L; + + private final long sequenceBits = 12L; + + private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + private long lastTimestamp = -1L; + + public long getWorkerId() { + return workerId; + } + + public long getDatacenterId() { + return datacenterId; + } + + public long getTimestamp() { + return System.currentTimeMillis(); + } + + public synchronized long nextId() { + // 这儿就是获取当前时间戳,单位是毫秒 + long timestamp = timeGen(); + + if (timestamp < lastTimestamp) { + System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp); + throw new RuntimeException(String.format( + "Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + // 这个意思是说一个毫秒内最多只能有4096个数字 + // 无论你传递多少进来,这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围 + long sequenceMask = ~(-1L << sequenceBits); + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0; + } + + // 这儿记录一下最近一次生成id的时间戳,单位是毫秒 + lastTimestamp = timestamp; + + // 这儿就是将时间戳左移,放到 41 bit那儿; + // 将机房 id左移放到 5 bit那儿; + // 将机器id左移放到5 bit那儿;将序号放最后12 bit; + // 最后拼接起来成一个 64 bit的二进制数字,转换成 10 进制就是个 long 型 + long datacenterIdShift = sequenceBits + workerIdBits; + long twepoch = 1288834974657L; + return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) + | (workerId << sequenceBits) | sequence; + } + + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + // ---------------测试--------------- + public static void main(String[] args) { + SnowFlake worker = new SnowFlake(1, 1, 1); + for (int i = 0; i < 30; i++) { + System.out.println(worker.nextId()); + } + } + +} +``` + + + +## 参考地址: + +1. https://blog.csdn.net/qq_33797815/article/details/113178832 \ No newline at end of file diff --git a/content/posts/1.Learning/A1.StudyNotes/todo.md b/content/posts/1.Learning/A1.StudyNotes/todo.md new file mode 100644 index 0000000..4a09c7a --- /dev/null +++ b/content/posts/1.Learning/A1.StudyNotes/todo.md @@ -0,0 +1,43 @@ +--- +title: "TodoList" +date: 2023-04-13T19:57:12+08:00 +tags: ["待完成"] +categories: ["Learning", "StudyNotes"] +--- + +TODO未整理 + +golang的gc,gmp模型,context作用,channel原理,并发打印数字,slice和map原理 +kafka的重平衡,高水位,顺序消费,怎么保证消息不丢失 +rocketmq怎么实现事物消息 +redis数据结构,zset原理,介绍cluster已经怎么保证高可用,哨兵模式介绍 +mysql聚簇索引,索引优化,结合业务怎么分库分表,为啥一个表超过1000w性能会变差 + +压测,限流 +降怎么保证服务高可用,限流熔断降级压测都要提下 +监控报警这些 +限流有哪些算法,以及却别要知道下 +熔断策略是啥 +限流:窗口计数,滑动窗口,漏桶,令牌桶 + + + + + +1. webrtc是什么技术 +2. webrtc与不同的socket通信有什么区别 +3. webrtc如何实现连麦、直播的 + + + +![image-20230322152028665](https://image.shijinping.cn/picgo/20230322152028665.png) + +# 计算方式 + +| 名称 | 计算方式 | +| ----- | ------------------------------------------------------------ | +| redis | http://www.redis.cn/redis_memory/ | +| mysql | select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='mysql';
参考地址: https://blog.csdn.net/fdipzone/article/details/80144166 | + + + diff --git a/content/posts/1.Learning/A2.ReadingNotes/_index.md b/content/posts/1.Learning/A2.ReadingNotes/_index.md new file mode 100644 index 0000000..edee447 --- /dev/null +++ b/content/posts/1.Learning/A2.ReadingNotes/_index.md @@ -0,0 +1,12 @@ +--- +title: "读书笔记" +date: 2023-04-15T11:02:56+08:00 +categories: ["Learning", "ReadingNotes"] +--- + +指读书时记录的笔记,包括书摘、注释、心得等 + +包含的分类: + +* 书籍摘录 +* 书评心得 diff --git a/content/posts/1.Learning/A2.ReadingNotes/book-list.md b/content/posts/1.Learning/A2.ReadingNotes/book-list.md new file mode 100644 index 0000000..c78095e --- /dev/null +++ b/content/posts/1.Learning/A2.ReadingNotes/book-list.md @@ -0,0 +1,1136 @@ +--- +title: "读书列表" +date: 2022-08-21T22:36:07+08:00 +tags: ["book"] +categories: ["Learning", "ReadingNotes"] +--- + +Copy From: [awesome-architecture](https://github.com/toutiaoio/awesome-architecture) + +## 分布式 + +- [分布式架构链路追踪:SkyWalking 介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F799b7ki&aid=19640&nid=313) +- [漫谈分布式系统 (20):基于规则的优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx8e3o0q&aid=19639&nid=313) +- [架构设计:分布式服务,库表拆分模式详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgbxl2rq&aid=19579&nid=312) +- [走出微服务误区:避免从单体到分布式单体](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fovtxful&aid=19525&nid=311) +- [熬夜之作:一文带你了解 Cat 分布式监控](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Foswj2ss&aid=19507&nid=310) +- [初识 etcd](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjiupdi0&aid=19412&nid=308) +- [分布式场景下基于重试机制的一致性解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv9ayiee&aid=19401&nid=308) +- [一文读懂 HDFS 架构与设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnfjgybv&aid=19384&nid=308) +- [MIT 6.824 分布式系统课程第六课之错误容忍:Raft(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fk3hxmqx&aid=19326&nid=307) +- [漫谈分布式事务的那些解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fa21b8ih&aid=19264&nid=305) +- [我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzh3mw4w&aid=19257&nid=305) +- [架构设计基础:单服务、集群、分布式的基本区别和联系](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqfdoann&aid=19231&nid=305) +- [用匠心精神,打造高可用分布式系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftmdintk&aid=19206&nid=304) +- [MIT 6.824 分布式系统课程第四课:主备复制](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fssa331p&aid=19129&nid=302) +- [面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fseazusu&aid=19004&nid=300) +- [MIT 6.824 分布式系统课程第三课:GFS](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Faitt0pc&aid=19008&nid=300) +- [分布式定时任务调度框架实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnecfb59&aid=18948&nid=299) +- [MIT 6.824 分布式系统课程第一课:介绍笔记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhuo7gu5&aid=18889&nid=298) +- [2019 我的技术之路:分布式系统到分布式制造](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4n3knao&aid=18817&nid=297) +- [分布式 ID 生成方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fypxzkfo&aid=18816&nid=297) +- [Filebeat + Kafka + ELK 分布式日志收集](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgz54sz8&aid=18597&nid=293) +- [[译] 一切系统都是分布式的 (OReilly, 2015)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ferplffd&aid=18580&nid=293) +- [SOSP19' Ceph 的十年经验总结:文件系统是否适合做分布式文件系统的后端](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flyt9n91&aid=18431&nid=291) +- [如果有人再问你怎么实现分布式延时消息,这篇文章丢给他](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1aco4t1&aid=18395&nid=290) +- [中间件底层实现的分布式协议之 Raft](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fycdzigb&aid=18384&nid=290) +- [在分布式链路下,蚂蚁金服如何快速构建低成本、高可用联调环境?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjuvljt6&aid=18284&nid=289) +- [解耦并不难:分布式系统中的解耦](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqw55a90&aid=18180&nid=287) +- [分布式唯一 ID 之 Snowflake 算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fazcxobo&aid=18084&nid=285) +- [漫谈分布式系统(一):为什么要有分布式系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn45lggn&aid=17863&nid=282) +- [技术中台:分布式架构在蚂蚁金服的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcla3i6r&aid=17751&nid=281) +- [图解各路分布式 ID 生成算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6b8ilwi&aid=17770&nid=281) +- [ElasticDL:蚂蚁金服开源基于 TensorFlow 的弹性分布式深度学习系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffv0ohs6&aid=17721&nid=280) +- [逻辑时钟:如何刻画分布式中的事件顺序](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmyak0cj&aid=17667&nid=279) +- [线性一致性实现原理剖析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6mzkcch&aid=17655&nid=279) +- [XSQL:低门槛、易部署、更稳定的多数据源分布式查询引擎](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd2s2pob&aid=17587&nid=278) +- [分布式消息系统设计要点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fozm344g&aid=17546&nid=278) +- [React Native 分布式热更新系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fiyckexn&aid=17421&nid=276) +- [端到端一致性,流系统 Spark/Flink/Kafka/DataFlow 对比总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzy1vawh&aid=17385&nid=276) +- [盘点 Zookeeper 在分布式架构中的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Foqr4qzf&aid=17266&nid=274) +- [[译] 分布式系统经典论文:Google Bigtable 的设计和实现 (OSDI 2006)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnsv5xu&aid=17015&nid=271) +- [[译] 分布式系统经典论文:Amazon Dynamo 的设计和实现 (SOSP 2007)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhoonp5&aid=17008&nid=270) +- [Apollo 配置中心:分布式部署](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4jtfat&aid=16979&nid=270) +- [分布式系统原理介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5popmw&aid=16859&nid=269) +- [高并发场景下分布式实时信令系统的架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhp43pq&aid=16685&nid=267) +- [8 个月打磨,一份送给程序员的 “分布式系统” 合集](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft421lk&aid=16627&nid=266) +- [分布式系统关注点:360° 的全方位监控](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1tyy60&aid=16540&nid=265) +- [设计一个分布式 RPC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdret83&aid=16439&nid=264) +- [分布式时序数据库 QTSDB 的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F99ydes&aid=16414&nid=264) +- [轻松构建微服务之分布式配置中心](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo84er8&aid=16470&nid=264) +- [分布式系统关注点:构建易测试系统的 “六脉神剑”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2ml4xz&aid=16474&nid=264) +- [个推基于 Zipkin 的分布式链路追踪实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F56ji5m&aid=16443&nid=264) +- [MXNet 结合 kubeflow 进行分布式训练](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx0yb12&aid=16378&nid=263) +- [分布式数据缓存中的一致性哈希算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmndgeq&aid=16293&nid=262) +- [聊一聊分布式对象存储解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnpum4m&aid=16291&nid=262) +- [分布式系统关注点:阻塞与非阻塞有什么区别?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcczcuh&aid=16290&nid=262) +- [UidGenerator:百度开源的分布式 ID 服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxhcewg&aid=16120&nid=260) +- [如何设计一个优秀的分布式系统?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flmuvic&aid=16085&nid=260) +- [分布式 ID 生成策略](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2jy9rw&aid=16040&nid=259) +- [从一个真实的分布式 ID 案例看如何做架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8yxaot&aid=16021&nid=259) +- [近万字长文,设计分布式系统需要考虑因素的都在这里](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs1kxx2&aid=16004&nid=259) +- [分布式 TensorFlow 编程模型演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F36j135&aid=15949&nid=258) +- [基于 Redis 和 Lua 的分布式限流](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F88u0ec&aid=15883&nid=257) +- [Aloha:一个分布式调度框架的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgu0vn2&aid=15786&nid=255) +- [可线性化检查:与 NP 完全问题做斗争](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fc63w76&aid=15773&nid=255) +- [分布式架构设计之架构演进之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0v90x2&aid=15664&nid=254) +- [分布式系统设计经典论文](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fc94mq1&aid=15707&nid=254) +- [Leaf:美团分布式 ID 生成服务开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo5ng3q&aid=15647&nid=253) +- [宜信分布式安全服务编排实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx7ls8w&aid=15568&nid=252) +- [xxl-registry:轻量级分布式服务注册中心](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fanbf4z&aid=15506&nid=251) +- [CAP 一致性协议及应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn7c6kj&aid=15424&nid=250) +- [分布式系统关注点:弹性架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqnm4xm&aid=15406&nid=250) +- [Etcd Raft 使用入门及原理解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhneodn&aid=15343&nid=249) +- [滴滴开源分布式消息中间件产品 DDMQ](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjyot9s&aid=15280&nid=248) +- [企业实施分布式架构的挑战以及应对建议](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqdc5bq&aid=15271&nid=248) +- [云端分布式架构下的编程语言:elixir; pattern matching](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxsxyl5&aid=15240&nid=248) +- [让 Raft 变快 100 倍:Dragonboat 的写优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr7nlaa&aid=15210&nid=247) +- [GMKV:分布式 kv 在更美 App 的落地](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fds18q6&aid=15197&nid=247) +- [基于 Licode 的 WebRTC 全球分布式架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqk23db&aid=15148&nid=247) +- [手绘 raft 一致性算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxf4vhf&aid=15133&nid=246) +- [kingbus:基于 Raft 的分布式 MySQL binlog 存储系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flwb5b3&aid=15139&nid=246) +- [为自己搭建一个分布式 IM(即时通讯)系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqh17sc&aid=15134&nid=246) +- [分布式系统的基石:深入浅出共识算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu4c7lv&aid=15068&nid=245) +- [[译] 伯克利开源多数据流实时分布式分析系统 Confluo,吞吐超 Kafka 4-10 倍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdos8cl&aid=15072&nid=245) +- [Ambry:LinkedIn 对象存储论文翻译](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl8oghr&aid=14990&nid=244) +- [Go 分布式实时服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fetrnyn&aid=14984&nid=244) +- [自己写分布式配置中心(上):单机模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsmpor6&aid=14918&nid=243) +- [唯品会分布式强一致日志存储系统 VDL 正式对外开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqlz79l&aid=14878&nid=242) +- [浅谈分布式最终一致性](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu97o5l&aid=14876&nid=242) +- [MIT 6.824 学习笔记(一):MapReduce 详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgpg6tz&aid=14873&nid=242) +- [用 Redis 实现分布式幂等服务中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fubh2z8&aid=14811&nid=241) +- [[译] 深度神经网络的分布式训练概述:常用方法和技巧全面总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4ujc6y&aid=14662&nid=239) +- [分布式基础,通俗易懂 CAP?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frnojsa&aid=14628&nid=238) +- [分布式系统关注点:做了负载均衡就可以随便加机器了吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbb4qwr&aid=14585&nid=238) +- [大规模 MySQL 运维陷阱之基于 MyCat 的伪分布式架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kid2f&aid=14510&nid=237) +- [分布式之消息队列复习精讲](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyosx21&aid=14551&nid=237) +- [自己写分布式限流组件:基于 Redis 的 RateLimter](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvx5em2&aid=14543&nid=237) +- [分布式高性能 Redis 集群线上常见问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffxnlcx&aid=14485&nid=236) +- [如果再有人问你分布式 ID,这篇文章丢给他](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4uqsp5&aid=14346&nid=234) +- [详解分布式协调服务 ZooKeeper](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnmeenq&aid=14366&nid=234) +- [带着问题学习分布式系统之数据分片](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsd7ohp&aid=14295&nid=233) +- [[译] 构建大型支付系统时学到的分布式体系结构概念](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwe1x5r&aid=14184&nid=232) +- [分布式数据库 MVCC 技术探秘(二):混合逻辑时钟](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F99yztm&aid=14086&nid=230) +- [分布式系统关注点:通过 “共识” 达成数据一致性](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpglb72&aid=14028&nid=229) +- [如何设计分布式系统开关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqbsr5a&aid=14017&nid=229) +- [分布式系统与消息的投递](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4jr8iz&aid=14016&nid=229) +- [使用开源技术构建有赞分布式 KV 存储服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F09bshx&aid=13957&nid=228) +- [美图分布式 Bitmap 实践:Naix](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy9caq7&aid=13878&nid=227) +- [分布式数据库 MVCC 技术探秘(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2cvy58&aid=13813&nid=226) +- [Node.js:浅析高并发与分布式集群](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flqz7i8&aid=13806&nid=226) +- [扯什么区块链,应该是分布式账本和面向通证架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzphvz1&aid=13747&nid=225) +- [学习分布式不得不会的 CAP 理论](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fifnec1&aid=13705&nid=224) +- [知乎十万级容器规模的分布式镜像仓库实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqjw2zk&aid=13528&nid=222) +- [主流分布式架构的风流韵事](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F08bm31&aid=13448&nid=221) +- [如何快速开发一个 Dubbo 应用?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqxec8r&aid=13436&nid=220) +- [Google F1 是如何做 Schema 变更的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7w2ccy&aid=13428&nid=220) +- [[译] 浅显易懂的分布式 TensorFlow 入门教程](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8tgl38&aid=13398&nid=220) +- [Raft 协议学习笔记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6jvkbu&aid=13297&nid=218) +- [基于可靠消息方案的分布式事务(二):Java 中的事务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F28xhz5&aid=13190&nid=217) +- [青云新一代分布式数据库 RadonDB 开源了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh4do84&aid=13023&nid=214) +- [一个 Raft 开源项目的结构分析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcptbrx&aid=13020&nid=214) +- [分布式跟踪工具 Pinpoint 初探](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftgun7k&aid=13007&nid=214) +- [分布式强一致性数据库的灵魂:Raft 算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3kiiw1&aid=12877&nid=212) +- [分布式系统:一致性 hash 算法的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv74dxm&aid=12826&nid=211) +- [分布式单点登录框架 XXL-SSO](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flwkoz4&aid=12754&nid=210) +- [同为分布式缓存,为何 Redis 更胜一筹?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6cr0xa&aid=12661&nid=209) +- [[译] Uber 是如何用 Kafka 构建可靠的重试处理保证数据不丢失](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd0szfl&aid=12628&nid=209) +- [MPP 的进化:深入理解 Batch 和 MPP 优缺点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2a9ayg&aid=12667&nid=209) +- [Zookeeper 源码:总体流程概览](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frc9df3&aid=12597&nid=208) +- [分布式理论:CAP 是三选二吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm73fu0&aid=12579&nid=208) +- [分布式系统设计:批处理模式之作业队列系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr0izu8&aid=12580&nid=208) +- [GlusterFS 纠删码最佳实践应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fehk25r&aid=12525&nid=207) +- [加密货币和区块链(二):分布式共识与去中心化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsox15f&aid=12505&nid=207) +- [饿了么异地多活技术实现(三):GZS & DAL](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqvrp0i&aid=12406&nid=206) +- [分布式技术集锦](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnucswn&aid=12333&nid=205) +- [漫谈分布式系统、拜占庭将军问题与区块链](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdbunl6&aid=12267&nid=204) +- [Zeppelin:奇虎 360 出品的高性能分布式 KV 存储平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fe0h0tu&aid=12254&nid=203) +- [分布式系统数据层设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm0se1z&aid=12191&nid=203) +- [跟繁琐的命令行说拜拜,Gerapy 分布式爬虫管理框架来袭](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnqxt5d&aid=12177&nid=202) +- [分布式 Redis 架构设计简介](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu64f4z&aid=12116&nid=202) +- [分布式文件系统 FastDFS 详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fk8b72k&aid=11995&nid=200) +- [ELK 6.0 部署:Elasticsearch + Logstash + Kibana 搭建分布式日志平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft5avsp&aid=11925&nid=199) +- [VDL:唯品会强一致、高可用、高性能分布式日志存储介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpjgx6k&aid=11861&nid=198) +- [分布式一致性与共识算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3j0nur&aid=11857&nid=198) +- [RAID 6 应用于消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdqfevp&aid=11851&nid=198) +- [分布式系统中的必备良药:RPC](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm45adb&aid=11764&nid=197) +- [区块链:利用 IPFS 构建自己的去中心化分布式 Wiki 系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjpxhgu&aid=11701&nid=196) +- [分布式消息队列实现概要](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fenlfg4&aid=11707&nid=196) +- [dedid:为分布式数据库而设计的全局唯一 ID(主键)生成器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyz54cq&aid=11634&nid=195) +- [分布式实时日志分析解决方案 ELK 部署架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fij76vu&aid=11631&nid=195) +- [OceanBase 1.0 分布式技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fltrkvn&aid=11592&nid=195) +- [分布式数据库的故障和常见处理机制](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5j581f&aid=11551&nid=194) +- [日志:分布式系统的核心](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1w3gk0&aid=11537&nid=194) +- [Netflix Archaius 分布式配置管理依赖构件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxmm8rr&aid=11403&nid=192) +- [Pegasus:小米出品的分布式 Key-Value 存储系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7yen01&aid=11351&nid=191) +- [XXL-CRAWLER:灵活高效、面向对象的分布式爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8408lv&aid=11348&nid=191) +- [使用 Redis 实现分布式锁及其优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8h65sd&aid=11335&nid=191) +- [Kafka 的复制机制](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F46dmov&aid=11333&nid=191) +- [Zookeeper:分布式过程协同技术详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fseveyq&aid=11328&nid=191) +- [浅谈大规模分布式系统中那些技术点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvnqayf&aid=11281&nid=191) +- [分布式键值存储 Dynamo 的实现原理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgkwe82&aid=11251&nid=190) +- [浅谈分布式存储系统中的数据一致性要求](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5fktt9&aid=11242&nid=190) +- [[译] 创建一个分布式网络爬虫的故事](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F890p4c&aid=11124&nid=188) +- [分布式文件管理系统 JDFS(五):整体架构描述](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm7g6fg&aid=11125&nid=188) +- [使用 Chaos 测试分布式系统线性一致性](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7vtyw7&aid=11092&nid=187) +- [分布式搜索数据库性能探究](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv74im8&aid=11090&nid=187) +- [微信开源 PhxQueue:高可用、高可靠、高性能的分布式队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9hmeq6&aid=10935&nid=185) +- [一文教你迅速解决分布式事务 XA 一致性问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmdp3vq&aid=10751&nid=183) +- [分布式 ID 生成方案概述](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F020ikb&aid=10749&nid=183) +- [分布式系统架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fe1q2rc&aid=10640&nid=182) +- [如何用 Go 打造亿级实时分布式出行平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsntl6i&aid=10587&nid=181) +- [molten:PHP 应用透明链路追踪工具](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3ijcsx&aid=10558&nid=180) +- [分布式流式处理的新贵 Kafka Stream](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6hslm0&aid=10545&nid=180) +- [微服务架构上云最佳实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdk2by4&aid=10486&nid=180) +- [如何在 Spring Cloud 分布式系统中实现分布式锁?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fceqbdy&aid=10470&nid=179) +- [漫谈分布式系统:三种通信范型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnthju4&aid=10454&nid=179) +- [[译] 如何选择合适的分布式机器学习平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fa2vhin&aid=10427&nid=179) +- [浅谈分布式服务协调技术 Zookeeper](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcbmvci&aid=10381&nid=178) +- [Hystrix 实现分布式系统中的故障容错](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftvnj08&aid=10398&nid=178) +- [[译] Metrics, tracing 和 logging 的关系](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fve6tex&aid=10323&nid=177) +- [使用 DDAL 快速构建分布式数据库应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3egyo2&aid=10243&nid=176) +- [etcd raft 如何实现成员变更](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqky7vp&aid=10242&nid=176) +- [单体中心代码库 vs. 分布式代码库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgqu0j2&aid=10237&nid=176) +- [Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo9e9gh&aid=10095&nid=174) +- [分布式系统概念](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgja08a&aid=10092&nid=174) +- [jd_spider:两只蠢萌京东的分布式爬虫](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd1vrcq&aid=10059&nid=173) +- [例解 Poxos 算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5vo24o&aid=10048&nid=173) +- [分布式调用链监控资源总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fopdnzv&aid=9960&nid=172) +- [Angel:腾讯出品的基于参数服务器理念开发的高性能分布式机器学习平台 ](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0p8zys&aid=9932&nid=172) +- [针对 PHP 做的 Ragnar Fiery 分布式性能跟踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F462xte&aid=9698&nid=168) +- [GFS 阅读笔记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fckl80f&aid=9696&nid=168) +- [自己动手扩展分布式调用链](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4hoeqi&aid=9681&nid=168) +- [分布式系统常见的事务处理机制](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F66jwr8&aid=9640&nid=167) +- [KAFKA:如何做到 1 秒发布百万级条消息](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjj0kd7&aid=9601&nid=167) +- [[译] 再谈 CAP 理论](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz5bsmr&aid=9619&nid=167) +- [Kudu:一个融合低延迟写入和高性能分析的存储系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd9f2pk&aid=9554&nid=166) +- [MapReduce 阅读笔记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsf3p9s&aid=9412&nid=164) +- [Leaf:美团点评分布式 ID 生成系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffyq4pz&aid=9423&nid=164) +- [微博百万用户分布式压测实践手记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu894hm&aid=9229&nid=162) +- [如何打造支撑百万用户的分布式代码托管平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fliwba6&aid=9228&nid=162) +- [Voyage:Java 实现的基于 Netty 的轻量、高性能分布式 RPC 服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Faclw19&aid=9215&nid=161) +- [Spark 自己的分布式存储系统:BlockManager](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fubeub6&aid=9197&nid=161) +- [最大努力通知?No,事务消息](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1ej2bx&aid=9150&nid=161) +- [分布式任务队列 Celery 介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Futsyhi&aid=9119&nid=160) +- [分布式事务之聊聊 TCC](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg0j0hh&aid=9114&nid=160) +- [分布式服务化系统一致性的 “最佳实干”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs6wy1e&aid=9078&nid=160) +- [一个简单的分布式 Web 扫描器的设计与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fozty3i&aid=9043&nid=159) +- [微服务架构下的分布式数据管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F90t7zh&aid=9005&nid=159) +- [XXL-JOB:分布式任务调度平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgrr0d3&aid=8993&nid=158) +- [Spark 分布式的基础:通信系统 rpc](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgxhx9w&aid=8978&nid=158) +- [腾讯云分布式高可靠消息队列 CMQ 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn7qpkw&aid=8945&nid=158) +- [分布式系统研发心得](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdufjn5&aid=8893&nid=157) +- [Golang 高性能分布式游戏服务器框架 mqant](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5wma7d&aid=8911&nid=157) +- [Antares:分布式任务调度平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0w8lyo&aid=8776&nid=155) +- [RPC 基本原理与 Apache Thrift 初体验](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2ifjzc&aid=8763&nid=155) +- [OceanBase 1.0 分布式技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp21ck6&aid=8646&nid=154) +- [万亿级数据洪峰下的分布式消息引擎](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmnuuvd&aid=8579&nid=153) +- [分布式系统调用链监控](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fexoywq&aid=8356&nid=149) +- [从 ACID 到 CAP/BASE](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzqe5ru&aid=8310&nid=148) +- [NewSQL 究竟新在哪里?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgfsopo&aid=8224&nid=147) +- [分布式系统本质论(3/3)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv1fi3e&aid=8118&nid=145) +- [不妥协:分布式事务的一致性、可用性和性能](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fk0srwe&aid=8054&nid=144) +- [CAP 初窥](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqziz1m&aid=8042&nid=144) +- [深度剖析开源分布式监控 CAT](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi5raq9&aid=7980&nid=143) +- [一名分布式存储工程师的技能树是怎样的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fttqk69&aid=7995&nid=143) +- [分布式锁总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcu6dnv&aid=7993&nid=143) +- [浅析分布式系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjdlch0&aid=7914&nid=142) +- [RSF 分布式 RPC 服务框架的分层设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F864at1&aid=7871&nid=141) +- [自己动手写分布式 KV 存储引擎(二):网络框架中的定时器原理和实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjgeeg9&aid=7777&nid=140) +- [JLiteSpider:轻量级的分布式 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nh7g6&aid=7761&nid=139) +- [分布式会话跟踪系统架构设计与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffmco5p&aid=7708&nid=139) +- [分布式事务(一):两阶段提交及 JTA](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb8cwtq&aid=7138&nid=130) +- [分布式队列编程(优化篇)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fepyfg1&aid=7094&nid=130) +- [探秘阿里分布式任务调度服务 SchedulerX](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqaxd7m&aid=7046&nid=129) +- [分布式队列编程:模型、实战](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5llwer&aid=7035&nid=129) +- [Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fblkw89&aid=7001&nid=128) +- [不懂点 CAP 理论,你好意思说你是做分布式的吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw5dp8u&aid=6908&nid=127) +- [SeimiCrawler:敏捷、独立部署、支持分布式的 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft70i21&aid=6809&nid=125) +- [分布式系统设计的求生之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs1tb5m&aid=6748&nid=125) +- [[PPT] 一次重构引发的分布式服务管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbj8f2u&aid=6724&nid=124) +- [基于 Dubbo 框架构建分布式服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsf6ol6&aid=6661&nid=123) +- [深入理解分布式系统的 2PC 和 3PC](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkvr7zf&aid=6492&nid=121) +- [分布式搜索引擎(二)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fprwrns&aid=6399&nid=120) +- [RPCX:类似 Dubbo 的分布式 RPC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzyeuuk&aid=6443&nid=120) +- [可靠分布式系统基础 Paxos 的直观解释](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffbb5j5&aid=6258&nid=118) +- [高性能分布式 Mock 平台的框架与设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F95qo0b&aid=6060&nid=116) +- [Zipkin:分布式追踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kmh7y&aid=6047&nid=115) +- [一名分布式存储工程师的技能树是怎样的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbowh0f&aid=6010&nid=115) +- [使用 DRPC 构建分布式多语言编程架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F45m47x&aid=5696&nid=111) +- [美团云分布式块存储系统 Ursa 的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F73xmbk&aid=5559&nid=109) +- [Sky Walking:对 Java 分布式应用程序集群业务运行情况进行追踪、告警和分析的系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fagpnck&aid=5541&nid=109) +- [几个分布式基础算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8uhegb&aid=5463&nid=108) +- [zerg:基于 Docker 的分布式爬虫服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdebq0t&aid=5181&nid=104) +- [微博分布式存储考试题:案例讲解及作业精选](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq9mtan&aid=5146&nid=104) +- [[译] Dapper,大规模分布式系统的跟踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fuu90n0&aid=5099&nid=104) +- [日志系统之基于 Zookeeper 的分布式协同设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fes7m4x&aid=4864&nid=101) +- [[译] 当讨论分布式系统时,我们都会讨论些什么?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvs2yhz&aid=4769&nid=100) +- [[译] 设计全球级的分布式、任务关键型应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdwli3k&aid=4453&nid=97) +- [分布式文件系统 FastDFS 架构剖析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F64hdc0&aid=4143&nid=94) +- [.NET 大型分布式电子商务架构说明](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft9ytxc&aid=4079&nid=93) +- [开源分布式计算系统框架比较](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F94etx&aid=3946&nid=91) +- [系统分布式情况下最终一致性方案梳理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7sjbj&aid=3930&nid=91) + +## 前端 + +- [[译] 高性能前端架构解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxbg9x4z&aid=19280&nid=306) +- [前端为什么要关注 Serverless?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1mbvwoz&aid=19099&nid=301) +- [一文道尽软件架构及前端架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4c5x4fc&aid=19049&nid=301) +- [爱奇艺号微前端架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnwog8cj&aid=18805&nid=297) +- [千万级流量业务的 Serverless 实践,看 FaaS 给前端带来的变化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftzo9lwk&aid=18742&nid=296) +- [[译] 不容错过的 Node.js 项目架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxaazxb8&aid=18478&nid=291) +- [学习 sentry 源码整体架构,打造属于自己的前端异常监控 SDK](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxqgn0kk&aid=18068&nid=285) +- [Egg.js 打造高可用服务集群](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjvrb95x&aid=17992&nid=284) +- [闲鱼前端基于 Serverless 的一种多端开发解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn7j7i9h&aid=17987&nid=284) +- [2019 JSConf China《面向传统,Serverless 进化之路》分享文字版](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6sngx4f&aid=17931&nid=283) +- [巨树:基于 ztree 封装的 Vue 树形组件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwmbvapl&aid=17269&nid=274) +- [你想知道的 React 组件设计模式这里都有(上)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh91pvf&aid=17190&nid=273) +- [前端要知道的 RESTful API 架构风格](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnzomb0&aid=17135&nid=272) +- [Serverless 掀起新的前端技术变革](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8sctee&aid=17145&nid=272) +- [记一次前端项目重构要点总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp20k50&aid=16887&nid=269) +- [大型项目前端架构浅谈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcosds3&aid=16432&nid=264) +- [简单高性能的 JavaScript 组件框架 Ale.js](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzm5v0z&aid=15137&nid=246) +- [前端重构范式之 position](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1f9hjy&aid=14289&nid=233) +- [面向体验的重构优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyw7ikn&aid=14232&nid=232) +- [用微前端的方式搭建类单页应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj6ow58&aid=14152&nid=231) +- [前端重构范式之 float layout](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fif6kcd&aid=13886&nid=227) +- [size-sensor:开源高性能 DOM 元素尺寸监听器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftevbzv&aid=13837&nid=226) +- [[译] Uber 开源 Fusion.js:一个基于插件架构的通用 Web 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdjks43&aid=13835&nid=226) +- [Node.js:浅析高并发与分布式集群](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flqz7i8&aid=13806&nid=226) +- [微前端快速选型指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg2nb3j&aid=13703&nid=224) +- [移动应用架构演变及泛前端趋势下移动团队破局](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fctjcpt&aid=13580&nid=223) +- [实施前端微服务化的六七种方式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz50khd&aid=13525&nid=222) +- [重构 React 组件的实用清单](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpmw8k9&aid=13468&nid=221) +- [Web 框架的架构模式探讨(JavaScript 语言)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo3pp4d&aid=13206&nid=217) +- [[译] 你需要了解的 23 种 JavaScript 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1orta0&aid=13207&nid=217) +- [Webpack 基本架构浅析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0bdvnn&aid=12942&nid=213) +- [浅谈 Chromium 中的设计模式(一):Chromium 中模块分层和进程模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn96o20&aid=12747&nid=210) +- [技术雷达之 “微前端”:将微服务理念扩展到前端开发](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7lfr8v&aid=12317&nid=204) +- [从 Nuxt.js 学习到了什么](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq3q80x&aid=12083&nid=201) +- [技术雷达之 “微前端”:将微服务理念扩展到前端开发](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Farjm1p&aid=11928&nid=199) +- [React 应用架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgjtz0e&aid=11921&nid=199) +- [基于 Egg 的高可靠高性能 React 同构解决方案 beidou 开源了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbkm8ln&aid=11862&nid=198) +- [当 Web 前端架构方案遇上《金瓶梅》](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft3rpu2&aid=11127&nid=188) +- [[译] 实现达到 60FPS 的高性能交互动画](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F009rtd&aid=11072&nid=187) +- [[译] 探索 ReactJS 中的 CSS 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F78clyh&aid=10593&nid=181) +- [[译] 如何实现前端微服务化?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9cmumb&aid=10467&nid=179) +- [webpack 多页应用架构系列(十六):善用浏览器缓存,该去则去,该留则留](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgwys2d&aid=10401&nid=178) +- [你了解 CSS 设计模式吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvzmo7j&aid=10088&nid=174) +- [前端高并发策略的更深层思考](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz3a1xm&aid=10034&nid=173) +- [美团点评酒旅前端的技术体系](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0vgh5v&aid=9614&nid=167) +- [[译] 解析 Twitter 前端架构,学习复杂场景数据设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu9fwu3&aid=9469&nid=165) +- [[译] Twitter Lite 以及大规模的高性能 React 渐进式网络应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6lihs5&aid=9296&nid=163) +- [小程序底层框架实现原理解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0v0kpa&aid=9079&nid=160) +- [API 设计之道](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F54dv15&aid=8823&nid=156) +- [[译] Google 是如何开发 Web 框架的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn0gdvg&aid=8790&nid=156) +- [《webpack 多页应用架构系列》电子书](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu4ugs5&aid=7881&nid=141) +- [在重构脚手架中掌握 React / Redux / Webpack2 基本套路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpq17kb&aid=7739&nid=139) +- [支付宝前端应用架构的发展和选择](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fspvwfm&aid=6833&nid=126) +- [[译] Node.js 架构概览](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Foqk60t&aid=6813&nid=126) +- [如何重构一个大型历史项目:百度经验改版总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvypknr&aid=6604&nid=123) +- [公司前端开发架构改造](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb6vsm5&aid=6008&nid=115) +- [58 同城前后端分离开发模式实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fc4gdsh&aid=5764&nid=112) +- [[译] Redux:一个启发自 Flux 的架构风格](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwt0rm6&aid=5734&nid=111) +- [从两个角度,一个小例子浅析 Node.js 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kk7rx&aid=5504&nid=109) +- [前端也应该了解点 Docker 知识:Docker 架构(上)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwuj4vg&aid=5151&nid=104) +- [前端技能训练:重构一 (@Phodal)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fihikv&aid=2710&nid=77) + +## 大数据 + +- [我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzh3mw4w&aid=19257&nid=305) +- [Data Lake 架构揭秘](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg0xaal7&aid=18804&nid=297) +- [[译] EOS 的 BM:为什么区块链是更好的应用服务器/数据库架构?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5ynbn24&aid=18684&nid=295) +- [大数据平台架构设计探究](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpqs9wa4&aid=18557&nid=292) +- [漫谈大数据平台架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp03yz5o&aid=18372&nid=290) +- [基于 Redis 实现的延迟消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwww9xod&aid=18191&nid=287) +- [小米 Go 开发实践:用 Go 构建高性能数据库中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo0y10it&aid=17812&nid=281) +- [微服务架构下,MySQL 读写分离后,数据库 CPU 飙升卡壳问题解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nh8e2o&aid=17708&nid=280) +- [使用 MySQL 模拟 Redis](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5w5rot6&aid=17705&nid=280) +- [海量数据实时分析服务技术架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F16xzr6g&aid=17624&nid=279) +- [浅谈车联网数据架构的那些坑](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8qd3ihj&aid=17460&nid=277) +- [端到端一致性,流系统 Spark/Flink/Kafka/DataFlow 对比总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzy1vawh&aid=17385&nid=276) +- [支撑微信支付的数据库如何提供超 300 万 TPCC 事务处理能力?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2ti19i0&aid=17235&nid=274) +- [每秒千万级的实时数据处理是怎么实现的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkpzid9&aid=16684&nid=267) +- [流沙:宜信安全数据平台实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0lqb9u&aid=16615&nid=266) +- [数据与广告系列(七):广告与推荐系统技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F621wdc&aid=16469&nid=264) +- [分布式数据缓存中的一致性哈希算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmndgeq&aid=16293&nid=262) +- [从零开始入门推荐算法工程师](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb78d1l&aid=16277&nid=262) +- [Alluxio 创始成员范斌:AI 与开源背景下数据架构的演变](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmlh95d&aid=16009&nid=259) +- [基于 Redis 和 Lua 的分布式限流](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F88u0ec&aid=15883&nid=257) +- [NutsDB:纯 Go 编写的高性能内嵌型 KV 数据库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpadg21&aid=15650&nid=253) +- [那些年用过的 Redis 集群架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbx4tiy&aid=15297&nid=249) +- [为什么使用主数据思维构建微服务是一种好方式?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F44rb55&aid=15000&nid=244) +- [业务库负载翻了百倍,我做了什么来拯救 MySQL 架构?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmp156e&aid=14893&nid=243) +- [MIT 6.824 学习笔记(一):MapReduce 详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgpg6tz&aid=14873&nid=242) +- [毫秒级从百亿大表任意维度筛选数据是怎么做到的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frm0hc6&aid=14832&nid=242) +- [用 Redis 实现分布式幂等服务中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fubh2z8&aid=14811&nid=241) +- [携程数据库高可用和容灾架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1w7ee1&aid=14650&nid=239) +- [大规模 MySQL 运维陷阱之基于 MyCat 的伪分布式架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kid2f&aid=14510&nid=237) +- [自己写分布式限流组件:基于 Redis 的 RateLimter](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvx5em2&aid=14543&nid=237) +- [分布式高性能 Redis 集群线上常见问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffxnlcx&aid=14485&nid=236) +- [海量数据的挑战:微博直播答题架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3ki1zs&aid=14383&nid=235) +- [大数据推荐系统实时架构和离线架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkwdn9d&aid=14382&nid=235) +- [ZooKeeper 架构设计与角色分工](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7klmai&aid=14358&nid=234) +- [从单机到 2000 万 QPS:知乎 Redis 平台发展与演进之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzpyhlq&aid=14251&nid=233) +- [阿里如何实现秒级百万 TPS?搜索离线大数据平台架构解读](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw8pn06&aid=14250&nid=233) +- [分布式数据库 MVCC 技术探秘(二):混合逻辑时钟](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F99yztm&aid=14086&nid=230) +- [美图大数据平台架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkwj7pg&aid=13979&nid=229) +- [360 大数据中心平台化的演进与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F114cq1&aid=13916&nid=228) +- [金融级数据库的多活架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqbsxb1&aid=13850&nid=227) +- [分布式数据库 MVCC 技术探秘(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2cvy58&aid=13813&nid=226) +- [58 速运架构实战:拆分服务与 DB,突破 “中心化” 瓶颈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2wekdm&aid=13792&nid=226) +- [面向机器学习数据平台的设计与搭建](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzvkt04&aid=13657&nid=224) +- [[译] Flink 创始人谈流计算核心架构演化和现状](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsvnpvi&aid=13694&nid=224) +- [京东推荐系统架构揭秘:大数据时代下的智能化改造](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpdwme8&aid=13581&nid=223) +- [HBase 高性能随机查询之道:HFile 原理解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr6hzop&aid=13536&nid=222) +- [沪江订单系统分表项目实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4sc1s0&aid=13520&nid=222) +- [快速理解 OpenTSDB 的 Schema 设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjoh2qt&aid=13484&nid=221) +- [Google F1 是如何做 Schema 变更的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7w2ccy&aid=13428&nid=220) +- [理解索引:HBase 介绍和架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxgjvf4&aid=13357&nid=219) +- [PB 级海量数据服务平台架构设计实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbbcpjn&aid=13252&nid=218) +- [MySQL 高可用集群方案之 PXC](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcazqgv&aid=13222&nid=217) +- [青云新一代分布式数据库 RadonDB 开源了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh4do84&aid=13023&nid=214) +- [[译] 使用 Redis 实现高流量的限速器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1usznh&aid=12949&nid=213) +- [BigTable 系统的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhf599t&aid=12902&nid=213) +- [分布式强一致性数据库的灵魂:Raft 算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3kiiw1&aid=12877&nid=212) +- [史上最全 Redis 高可用技术解决方案大全](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft7jma7&aid=12769&nid=211) +- [同为分布式缓存,为何 Redis 更胜一筹?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6cr0xa&aid=12661&nid=209) +- [MPP 的进化:深入理解 Batch 和 MPP 优缺点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2a9ayg&aid=12667&nid=209) +- [每天数百亿用户行为数据,美团点评怎么实现秒级转化分析?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fezmax6&aid=12626&nid=209) +- [浅谈大数据平台基建的逻辑](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frpo5x5&aid=12584&nid=208) +- [分布式系统数据层设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm0se1z&aid=12191&nid=203) +- [分布式 Redis 架构设计简介](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu64f4z&aid=12116&nid=202) +- [Hulu 大数据架构与应用经验](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwvm2jp&aid=11879&nid=199) +- [dedid:为分布式数据库而设计的全局唯一 ID(主键)生成器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyz54cq&aid=11634&nid=195) +- [OceanBase 1.0 分布式技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fltrkvn&aid=11592&nid=195) +- [分布式数据库的故障和常见处理机制](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5j581f&aid=11551&nid=194) +- [如何打造千万级 Feed 流系统?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj0n7id&aid=11517&nid=194) +- [基于 Redis 的限流系统的设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flztm2c&aid=11432&nid=193) +- [使用 Redis 实现分布式锁及其优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8h65sd&aid=11335&nid=191) +- [浅谈分布式存储系统中的数据一致性要求](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5fktt9&aid=11242&nid=190) +- [分布式搜索数据库性能探究](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv74im8&aid=11090&nid=187) +- [人工智能在线特征系统中的生产调度](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpf86r4&aid=10955&nid=186) +- [Redis 在京东到家的订单中的使用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2znejs&aid=10488&nid=180) +- [PhxSQL 设计与实现(详细版)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm7wnyn&aid=10411&nid=179) +- [1 对多业务,数据库水平切分架构一次搞定](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd7b2z4&aid=10260&nid=176) +- [使用 DDAL 快速构建分布式数据库应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3egyo2&aid=10243&nid=176) +- [基于大数据平台的实时质量监控平台的架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2tvmmk&aid=10205&nid=176) +- [一张思维导图学会如何构建高性能 MySQL 系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ficvg0r&aid=10159&nid=175) +- [美团点评数据库高可用架构的演进与设想](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5bst03&aid=10065&nid=174) +- [揭秘网易大数据实践与基于微服务的应用架构设计实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdlkoz9&aid=9897&nid=171) +- [典型数据库架构设计与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjo3rvs&aid=9812&nid=170) +- [360 海量数据存储 Zeppelin 设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3bfosy&aid=9715&nid=169) +- [搭建一个 Redis 高可用系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb3mj7w&aid=9655&nid=168) +- [滴滴出行海量数据背后的高可用架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fk5vzku&aid=9654&nid=168) +- [iOS 无埋点数据 SDK 的整体设计与技术实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj4639h&aid=9588&nid=167) +- [大数据环境下该如何优雅地设计数据分层](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq1j0l1&aid=9611&nid=167) +- [美团的大数据平台架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F73n6pb&aid=9519&nid=166) +- [日处理 20 亿数据,实时用户行为服务系统架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F131fd5&aid=9446&nid=165) +- [CRS:腾讯云 Redis 产品架构解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fio6pkb&aid=9472&nid=165) +- [微服务架构下的分布式数据管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F90t7zh&aid=9005&nid=159) +- [中华万年历大数据平台演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4j5kpq&aid=9003&nid=159) +- [京东发布 MySQL Group Replication 官方文档中文版](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flteldm&aid=9038&nid=159) +- [微店索引数据 dump 架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5in72j&aid=8791&nid=156) +- [OceanBase 1.0 分布式技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp21ck6&aid=8646&nid=154) +- [万亿级数据洪峰下的分布式消息引擎](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmnuuvd&aid=8579&nid=153) +- [Gores:Go 语言编写的基于 Redis 的消息队列系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpts7bc&aid=8569&nid=152) +- [MySQL 高性能存储引擎:TokuDB 初探](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fucy4jn&aid=8289&nid=148) +- [[译] 不使用 Trigger 的设计理念](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftsuyz4&aid=8226&nid=147) +- [NewSQL 究竟新在哪里?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgfsopo&aid=8224&nid=147) +- [神策分析的技术选型与架构实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0bmanu&aid=8016&nid=144) +- [MySQL 数据库中间件的高可用方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7iewb4&aid=7125&nid=130) +- [数据系统架构:Lambda architecture](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Feonf0v&aid=6971&nid=128) +- [用 MHA 轻松实现 MySQL 高可用(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgx5hfc&aid=6965&nid=128) +- [大数据环境下互联网行业数据仓库/数据平台的架构之漫谈(续)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8u2o1a&aid=6973&nid=128) +- [海量高性能列式数据库 HiStore 技术架构解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0kzpxa&aid=6811&nid=126) +- [MySQL 架构优化实战系列(二):主从复制同步与查询性能调优](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9y8l7q&aid=6713&nid=124) +- [iOS MVVM 架构:界面与数据 I/O 逻辑分离的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8b4zfw&aid=6311&nid=119) +- [Redis 字符串类型实现内幕](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6cx07b&aid=6248&nid=118) +- [乐视秒杀:每秒十万笔交易的数据架构解读](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm1z3dv&aid=6138&nid=117) +- [从日志统计到大数据分析(十六):元](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmgyqgq&aid=6096&nid=116) +- [秒级处理海量数据,浙江移动大数据平台是怎么做到的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb5wu4n&aid=6019&nid=115) +- [Hadoop NameNode 高可用 (High Availability) 实现解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3tr1ro&aid=5901&nid=114) +- [用 Swift 搭建数据驱动型 iOS 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flf5p2m&aid=5361&nid=107) +- [[译] 数据处理平台架构中的 SMACK 组合](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx4459x&aid=5329&nid=106) +- [大数据 / 数据挖掘 / 推荐系统 / 机器学习相关资源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fynunyg&aid=4857&nid=101) +- [我所理解的大数据个性化推荐](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnb0fio&aid=4299&nid=95) +- [数据库软件架构设计些什么](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm5b8fh&aid=4063&nid=93) +- [基于用户画像大数据的电商防刷架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi7s7se&aid=4062&nid=93) + +## 存储 + +- [Ambry:LinkedIn 对象存储论文翻译](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl8oghr&aid=14990&nid=244) +- [唯品会分布式强一致日志存储系统 VDL 正式对外开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqlz79l&aid=14878&nid=242) +- [使用开源技术构建有赞分布式 KV 存储服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F09bshx&aid=13957&nid=228) +- [天池中间件大赛:单机百万消息队列存储分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F505qkj&aid=13851&nid=227) +- [GlusterFS 纠删码最佳实践应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fehk25r&aid=12525&nid=207) +- [Zeppelin:奇虎 360 出品的高性能分布式 KV 存储平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fe0h0tu&aid=12254&nid=203) +- [VDL:唯品会强一致、高可用、高性能分布式日志存储介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpjgx6k&aid=11861&nid=198) +- [Pegasus:小米出品的分布式 Key-Value 存储系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7yen01&aid=11351&nid=191) +- [分布式键值存储 Dynamo 的实现原理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgkwe82&aid=11251&nid=190) +- [浅谈分布式存储系统中的数据一致性要求](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5fktt9&aid=11242&nid=190) +- [badger:一个高性能的 LSM K/V store](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Famj0xn&aid=11203&nid=189) +- [我跟存储的这 10 年](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5qqd3w&aid=10990&nid=186) +- [360 海量数据存储 Zeppelin 设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3bfosy&aid=9715&nid=169) +- [Kudu:一个融合低延迟写入和高性能分析的存储系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd9f2pk&aid=9554&nid=166) +- [Spark 自己的分布式存储系统:BlockManager](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fubeub6&aid=9197&nid=161) +- [微信红包订单存储架构变迁的最佳实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8v4dgh&aid=8647&nid=154) +- [MySQL 高性能存储引擎:TokuDB 初探](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fucy4jn&aid=8289&nid=148) +- [一名分布式存储工程师的技能树是怎样的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fttqk69&aid=7995&nid=143) +- [自己动手写分布式 KV 存储引擎(二):网络框架中的定时器原理和实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjgeeg9&aid=7777&nid=140) +- [Android 存储系统之架构篇](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh1z7r3&aid=7020&nid=129) +- [一名分布式存储工程师的技能树是怎样的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbowh0f&aid=6010&nid=115) +- [美团云分布式块存储系统 Ursa 的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F73xmbk&aid=5559&nid=109) +- [微博分布式存储考试题:案例讲解及作业精选](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq9mtan&aid=5146&nid=104) + +## 微服务 + +- [走出微服务误区:避免从单体到分布式单体](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fovtxful&aid=19525&nid=311) +- [一次漫长的 Dubbo 网关内存泄露排查经历](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frtfen2n&aid=19427&nid=309) +- [微服务、DevOps…不是效率银弹,请同时升级你的管理方式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fibh4mpc&aid=19223&nid=304) +- [微服务超全的设计选型参考](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F08ex0sl&aid=19127&nid=302) +- [微信 10 亿日活场景下,后台系统微服务架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftr32h3p&aid=19048&nid=301) +- [Spring Cloud 微服务:阿里开源组件 Nacos,服务和配置管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmgrqr95&aid=18961&nid=299) +- [[译] 5 分钟搭建 Node.js 微服务原型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxiqy4d6&aid=18916&nid=298) +- [花椒直播 Kong 应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F82560ps&aid=18833&nid=297) +- [微服务杂谈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fctuh4xl&aid=18752&nid=296) +- [企业级微服务解决方案 v3.2.0 发布](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6pkbspo&aid=18702&nid=295) +- [不是银弹:关于微服务的一点思考](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbtws1rn&aid=18635&nid=294) +- [CODING 微服务架构演进之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9st5xky&aid=18612&nid=294) +- [Spring Boot 与微服务从 0 到 1 的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frbfhyll&aid=18651&nid=294) +- [微服务统一认证与授权的 Go 语言实现(上)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2tc96jt&aid=18636&nid=294) +- [探探如何三个月完成微服务改造,以及踩过的 “坑”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F940ata9&aid=18432&nid=291) +- [余额宝背后的服务治理架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwsek9ag&aid=18362&nid=290) +- [2w 字长文,让你瞬间拥有 “调用链” 开发经验](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3e7lgvy&aid=18170&nid=287) +- [腾讯微服务框架 Tars 的 Go 性能提升之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw9edu5t&aid=17875&nid=282) +- [.NET Core 微服务网关 Bumblebee 架设](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5necrxf&aid=17815&nid=281) +- [Go 微服务全链路跟踪详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkc0iaka&aid=17814&nid=281) +- [微服务架构之网关层 Zuul 剖析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fc20pykp&aid=17782&nid=281) +- [微服务架构下,MySQL 读写分离后,数据库 CPU 飙升卡壳问题解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nh8e2o&aid=17708&nid=280) +- [Service Mesh 发展趋势(续):棋到中盘路往何方](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9xnhkda&aid=17481&nid=277) +- [微服务 API 通过 ip 可访问,域名不可访问问题分析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy91g23q&aid=17488&nid=277) +- [互联网架构微服务已经成为主流,Go 语言如何去打造呢?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsh3lncg&aid=17296&nid=274) +- [万字长文全面解析 GraphQL,携程微服务背景下的前后端数据交互方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fndbbm8o&aid=17252&nid=274) +- [颠覆微服务认知:深入思考微服务的七个主流观点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fns7pxad&aid=17233&nid=274) +- [微服务中使用 OpenJ9 JVM 内存占用降 60%(相对 HotSpot)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftq492f&aid=17102&nid=272) +- [高性能微服务网关 .NETCore 客户端 Kong.Net 开源发布](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhn0ni4&aid=17003&nid=270) +- [微服务任务调度平台 SIA-TASK 入手实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft5kl7a&aid=16740&nid=267) +- [[译] 为什么微服务适合我们](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0iwp7w&aid=16601&nid=266) +- [微服务架构与领域驱动设计应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F527e3y&aid=16600&nid=266) +- [[译] 容器、微服务和服务网格简史](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp54rbk&aid=16547&nid=265) +- [个推基于 Zipkin 的分布式链路追踪实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F56ji5m&aid=16443&nid=264) +- [可落地的 DDD(三):如何利用 DDD 进行微服务的划分](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvwjg5c&aid=16440&nid=264) +- [轻松构建微服务之分布式配置中心](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo84er8&aid=16470&nid=264) +- [轻松构建微服务之远程调用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F57dduv&aid=16356&nid=263) +- [微服务架构下的配置管理:Apollo](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx7mni2&aid=16287&nid=262) +- [土味微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmeg1cl&aid=16252&nid=262) +- [微服务化后缓存怎么做](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7q0a3u&aid=16189&nid=261) +- [最全的微服务知识科普](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flzegj5&aid=16108&nid=260) +- [聊一聊微服务网关 kong 近期的模型变迁](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ff1k7wv&aid=16052&nid=259) +- [小团队微服务落地实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F37u12h&aid=16020&nid=259) +- [[译] 未来我们对微服务和 Serverless 架构有什么期望](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Foopku4&aid=15866&nid=257) +- [[译] 混合微服务模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6018jy&aid=15887&nid=257) +- [微保 API 网关的探索与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffnp7wn&aid=15727&nid=255) +- [[译] 使用 Grab 的实验平台进行混沌实验编排](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fawfudg&aid=15641&nid=253) +- [离不开的微服务架构,脱不开的 RPC 细节](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F74yprd&aid=15520&nid=252) +- [小团队的微服务之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjldsgp&aid=15500&nid=251) +- [对没有监控的微服务 Say No](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F43p70f&aid=15428&nid=250) +- [虎牙直播在微服务改造方面的实践和总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6ymuhx&aid=15401&nid=250) +- [B 站基于大仓库的 CI/CD 及微服务实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fodbfuv&aid=15397&nid=250) +- [从 “挖光缆” 到 “剪网线”:蚂蚁金服异地多活单元化架构下的微服务体系](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ff0uwf1&aid=15360&nid=250) +- [重新理解 Martin Fowler 对微服务的定义](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F65zho9&aid=15186&nid=247) +- [小型系统如何 “微服务” 开发](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz1n2qv&aid=15086&nid=246) +- [Kafka 如何解决常见的微服务通信问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpiiy8y&aid=15057&nid=245) +- [为什么使用主数据思维构建微服务是一种好方式?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F44rb55&aid=15000&nid=244) +- [[译] 微服务设计指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4ju4tg&aid=14892&nid=243) +- [随行付微服务之数据同步 Porter](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcai7gs&aid=14932&nid=243) +- [[译] 微服务通信的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvnvqk7&aid=14937&nid=243) +- [走进 Service Mesh](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyp0jtz&aid=14874&nid=242) +- [Restful API 监控实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjzn3sg&aid=14801&nid=241) +- [DAGOR:微信微服务过载控制系统(附论文)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fms81by&aid=14770&nid=241) +- [微服务测试的思考与实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4gy52r&aid=14747&nid=240) +- [基于 Spring Cloud 的微服务架构演变史](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcwhh48&aid=14714&nid=240) +- [致传统企业朋友:不够痛就别微服务,有坑](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fodkk8i&aid=14651&nid=239) +- [讨论微服务之前,你知道微服务的 4 个定义吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F39utp2&aid=14561&nid=237) +- [个推基于 Docker 和 Kubernetes 的微服务实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3n201x&aid=14549&nid=237) +- [爱奇艺视频后台从 “单兵作战” 到 “团队协作” 的微服务实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9o4d71&aid=14311&nid=234) +- [基于 consul 实现微服务的服务发现和负载均衡](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl2jvii&aid=14234&nid=232) +- [SOFA 微服务多语言演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqu5cwp&aid=14160&nid=231) +- [用微前端的方式搭建类单页应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj6ow58&aid=14152&nid=231) +- [认证鉴权与 API 权限控制在微服务架构中的设计与实现:升级](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd7394m&aid=14161&nid=231) +- [为啥我用了微服务架构,软件还是不好修改啊?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyrntvt&aid=14052&nid=230) +- [携程微服务架构下的测试浅谈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6vcdxh&aid=14032&nid=229) +- [[译] 推荐 30 个用于微服务的顶级工具](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmwhpkm&aid=13968&nid=228) +- [[译] 微服务的 10 个挑战和解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbcqfzr&aid=13918&nid=228) +- [服务框架的技术栈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fe35r0j&aid=13769&nid=225) +- [深入解读 Service Mesh 背后的技术细节](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcy05s1&aid=13687&nid=224) +- [Spring Cloud 微服务版本灰度发布新神器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0hkfi4&aid=13706&nid=224) +- [微前端快速选型指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg2nb3j&aid=13703&nid=224) +- [如何构建安全的微服务应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn15ny2&aid=13692&nid=224) +- [微服务设计模式之 API 网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2bho18&aid=13613&nid=223) +- [基于 Restful 的微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs4e7gh&aid=13539&nid=222) +- [微服务架构实践:API Gateway](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu5779u&aid=13529&nid=222) +- [实施前端微服务化的六七种方式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz50khd&aid=13525&nid=222) +- [蚂蚁金服大规模微服务架构下的 Service Mesh 探索之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvtdynn&aid=13513&nid=222) +- [苏宁数据中台基于 Spring Cloud 微服务架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpa4438&aid=13449&nid=221) +- [微服务化的基石:持续集成](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzjf7v8&aid=13390&nid=220) +- [Go 微服务实战汇总](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fng7jym&aid=13356&nid=219) +- [基于微服务的日志中心设计、实现与关键配置](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3ew1fe&aid=13331&nid=219) +- [微服务化之缓存的设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8fhmhg&aid=13253&nid=218) +- [Netflix 的微服务是如何分层的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdymu8x&aid=13212&nid=217) +- [API 管理的正确姿势:API Gateway](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw2hntl&aid=13224&nid=217) +- [如何基于 Golang 设计一套微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbkh1sp&aid=13122&nid=216) +- [Eureka + Zuul + Feign + Hystrix 构建微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fglzqvq&aid=13131&nid=216) +- [微服务 2.0 技术栈选型手册](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F15f6ny&aid=13111&nid=216) +- [51 信用卡在微服务架构下的监控平台架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flv7vry&aid=13042&nid=215) +- [从跨语言调用到 dubbo2.js](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1ragmw&aid=13098&nid=215) +- [[译] 事件溯源|日志记录:一个基础的微服务模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi5wznu&aid=12970&nid=214) +- [无服务器架构下的运维](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhipgg3&aid=12969&nid=214) +- [从零搭建一个基于 Istio 的服务网格](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frsa4iv&aid=12947&nid=213) +- [Service Mesh 及其主流开源实现解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhiwdeq&aid=12943&nid=213) +- [罗辑思维 Go 语言微服务改造实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kjbj5&aid=12924&nid=213) +- [基于 Spring Cloud 的 Microservices 架构实战案例:配置文件属性内容加解密](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6xqcpp&aid=12789&nid=211) +- [腾讯出品的微服务框架的名字服务解决方案 TSeer 正式开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx9ffwo&aid=12828&nid=211) +- [为什么 Kubernetes 天然适合微服务?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhkawin&aid=12817&nid=211) +- [基于 Spring Cloud 的 Microservices 架构实战案例:架构拆解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzpvlor&aid=12710&nid=210) +- [认证鉴权与 API 权限控制在微服务架构中的设计与实现:授权码模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwdgigp&aid=12691&nid=210) +- [基于 Spring Cloud 的微服务落地](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx0w7ai&aid=12709&nid=210) +- [微服务化的不同阶段 Kubernetes 的不同玩法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwozb21&aid=12750&nid=210) +- [从 Spring Cloud 看一个微服务框架的 “五脏六腑”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F206sbe&aid=12739&nid=210) +- [微网关与服务啮合](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8284lx&aid=12512&nid=207) +- [手把手教你搭建一套可自动化构建的微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9t19hj&aid=12446&nid=206) +- [微服务架构下的立体监控系统设计和实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2jqfk6&aid=12407&nid=206) +- [全面解析京东微服务平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F38d3c9&aid=12405&nid=206) +- [基于 Sanic 的微服务基础架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmfs5yn&aid=12312&nid=204) +- [技术雷达之 “微前端”:将微服务理念扩展到前端开发](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7lfr8v&aid=12317&nid=204) +- [使用 Istio 治理微服务入门](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F46f4t0&aid=12248&nid=203) +- [TDD 开发容器化的 Python 微服务应用(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh7i1x8&aid=11888&nid=199) +- [技术雷达之 “微前端”:将微服务理念扩展到前端开发](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Farjm1p&aid=11928&nid=199) +- [Go 使用 grpc + http 打造高性能微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9we6bi&aid=11532&nid=194) +- [[译] 如何设计实现真正的响应式微服务系统?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyuww62&aid=11355&nid=192) +- [腾讯与阅文技术合作,微服务框架 Tars 再添 PHP](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8s8pwz&aid=11344&nid=191) +- [阿里云基于 Go 的微服务架构分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyxd30b&aid=11170&nid=189) +- [[译] 微服务从设计到部署(七):重构单体为微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvii7xj&aid=11077&nid=187) +- [[译] 微服务生态系统的 4 层模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvwuc9h&aid=11008&nid=186) +- [Kubernetes、微服务以及 Service Mesh](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0wtw8o&aid=10992&nid=186) +- [微服务的 4 个设计原则和 19 个解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbq83y1&aid=10789&nid=184) +- [微服务 API 级权限的技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fttmk3n&aid=10790&nid=184) +- [php-msf:基于 Swoole 的工程级企业微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbbht62&aid=10855&nid=184) +- [[译] 微服务从设计到部署(二):使用 API 网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv1bkhw&aid=10752&nid=183) +- [轻量级微服务架构及最佳部署](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg5t9sg&aid=10715&nid=183) +- [连接管理安全化微服务的利器 Istio](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2ah8ig&aid=10694&nid=182) +- [[译] 微服务从设计到部署(一):微服务简介 ](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm8aqw3&aid=10673&nid=182) +- [[译] 设计一个容错的微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fuxkvw4&aid=10639&nid=182) +- [如何构建微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fiu24f0&aid=10565&nid=181) +- [swoft:基于 Swoole 协程 2.x 的高性能 PHP 微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy7w5yu&aid=10553&nid=180) +- [微服务架构上云最佳实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdk2by4&aid=10486&nid=180) +- [[译] 如何实现前端微服务化?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9cmumb&aid=10467&nid=179) +- [[译] 使用 Spring Cloud 和 Docker 构建微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpkmy3j&aid=10457&nid=179) +- [微服务注册发现集群搭建:Registrator + Consul + Consul-template + nginx](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8ds6fl&aid=10390&nid=178) +- [几种常见的微服务架构方案简述:ZeroC IceGrid、Spring Cloud、基于消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4p2ebe&aid=10375&nid=178) +- [[译] REST?RPC?是时候改变你对微服务的认知了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb9yrio&aid=10206&nid=176) +- [京麦微服务技术架构演变之下的 618 备战实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyhnr3d&aid=10148&nid=175) +- [NHMicro:脚本化微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr6w3t5&aid=10117&nid=174) +- [详解微服务实践从架构到部署](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8f7m6l&aid=10091&nid=174) +- [Istio:Google、IBM 和 Lyft 联合开源的微服务 Service Mesh 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nfcfl&aid=10058&nid=173) +- [微服务初级设计指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwlbiz6&aid=10001&nid=173) +- [多研究些架构,少谈些框架(二):微服务和充血模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl7pnoz&aid=9929&nid=172) +- [揭秘网易大数据实践与基于微服务的应用架构设计实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdlkoz9&aid=9897&nid=171) +- [解析微软微服务架构 eShopOnContainers(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3sly7l&aid=9762&nid=169) +- [自己动手扩展分布式调用链](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4hoeqi&aid=9681&nid=168) +- [[译] 为了更好地支持微服务,我们从 PHP 迁移到了 Go](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fver9l5&aid=9669&nid=168) +- [华尔街见闻基于 Golang 的微服务实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2hkd12&aid=9594&nid=167) +- [基于 Spring Cloud 的微服务架构 v1.0](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo010bl&aid=9477&nid=165) +- [《微服务设计》之演化式架构师](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqhtx0d&aid=9480&nid=165) +- [StatsD 使用小结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3twx8z&aid=9411&nid=164) +- [《微服务设计》读书笔记之微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvf4npv&aid=9335&nid=163) +- [为基于 Spring Boot 的微服务架构搭建一套自动化、集中管理的 API 文档中心](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F15dua9&aid=9277&nid=162) +- [腾讯自用的微服务架构 Tars 正式开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd56pib&aid=9275&nid=162) +- [微服务架构下的分布式数据管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F90t7zh&aid=9005&nid=159) +- [使用微服务架构重构支付网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj99pg0&aid=8947&nid=158) +- [Faas,又一个未来?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqazq46&aid=8910&nid=157) +- [[译] Uber 微服务经验谈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpzx5mb&aid=8789&nid=156) +- [微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fizkqoe&aid=8678&nid=154) +- [Spring Cloud 构建微服务架构(一):服务注册与发现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj224c4&aid=8692&nid=154) +- [微服务架构的基础框架选择:Spring Cloud 还是 Dubbo?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm124s5&aid=8292&nid=148) +- [微服务的反模式和陷阱](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9s7cua&aid=8014&nid=144) +- [阿里巴巴前架构师 360 度无死角剖析微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fc9i3ia&aid=7979&nid=143) +- [spring-cloud-netflix-example:基于 Spring Cloud 的微服务实例](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr2tazu&aid=7947&nid=142) +- [产品级微服务的八大原则](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffya6n5&aid=7775&nid=140) +- [微服务场景下的自动化测试](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5hs6kt&aid=7728&nid=139) +- [[译] REST 和微服务:用异步交互分解单体系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdcn6tj&aid=7118&nid=130) +- [[译] 微服务到头了?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhpzb3p&aid=7056&nid=129) +- [[译] 用 Spring Cloud 治理微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0jbmp8&aid=6992&nid=128) +- [Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fblkw89&aid=7001&nid=128) +- [[译] NGINX 微服务参考架构简介](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4v4dms&aid=6880&nid=127) +- [微服务的团队应对之道](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw0loo0&aid=6924&nid=127) +- [微服务独家笔记](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5aqvuh&aid=6654&nid=123) +- [[译] 微服务即演进式架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgkij7u&aid=6464&nid=121) +- [[译] 介绍 Nginx 微服务参考架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8u3bb8&aid=6358&nid=119) +- [[译] 从微服务同步 REST 的天然缺陷说起](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fowysr9&aid=6261&nid=118) +- [[译] Cookpad 基于 Docker 的微服务经验总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3nzj6y&aid=5603&nid=110) +- [Golang 微服务工具包](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1d5zn4&aid=5405&nid=107) +- [实施微服务,我们需要哪些基础框架?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhroumz&aid=4904&nid=102) +- [[译] Rails 微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgrxphx&aid=4569&nid=98) +- [[译] 无服务器的微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kndxf&aid=4106&nid=93) +- [极速切入 Spring Boot 微服务框架 (float.lu)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgmaes&aid=3588&nid=87) +- [谈谈微服务 (王福强)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6v74s&aid=3136&nid=82) +- [[译] Martin Folwer 谈微服务的优缺点 (黄帅)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqfusw&aid=2889&nid=79) +- [[译] 构建微服务:使用 API Gateway (陈杰)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0bsp4&aid=2796&nid=78) +- [[译] 微服务实战(一):微服务架构的优势与不足 (杨峰)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F80pg6&aid=2430&nid=73) + +## 推荐系统 + +- [基于 DNN 的推荐算法介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7omj94e&aid=19456&nid=309) +- [B站的视频,都是怎么推荐的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr93dn0v&aid=19396&nid=308) +- [推荐系统中不得不说的 DSSM 双塔模型 ](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9v5muff&aid=19354&nid=307) +- [推荐系统的人工调控](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F806f4ts&aid=18992&nid=300) +- [推荐系统提供 web 服务的 2 种方式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjl9cfe6&aid=18880&nid=298) +- [[译] 如何使用深度学习模型构建推荐系统?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F30g1g4n&aid=18622&nid=294) +- [推荐算法团队介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhtlu867&aid=18625&nid=294) +- [推荐系统的 UI 交互与视觉展示](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fks51nh0&aid=18582&nid=293) +- [wide & deep 在贝壳推荐场景的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm5ne38u&aid=18435&nid=291) +- [混合推荐系统介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fptui4y4&aid=18391&nid=290) +- [微信开发工程师带你一文了解推荐领域最新工作](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3m6f9zp&aid=18295&nid=289) +- [推荐技术系列(四):利用社交关系的隐式矩阵分解原理和实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1gdic37&aid=18135&nid=286) +- [YouTube 基于多任务学习的视频排序推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0hi57u3&aid=17964&nid=284) +- [Facebook 面向个性化推荐系统的深度学习推荐模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5410zpi&aid=17834&nid=282) +- [深度学习在推荐系统中的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6b159gq&aid=17833&nid=282) +- [如何优化大规模推荐?下一代算法技术 JTM 来了](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsru663w&aid=17753&nid=281) +- [基于 Flink 实现的商品实时推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz7sgluz&aid=17579&nid=278) +- [序列推荐模型 TransFM](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fssrfh9j&aid=17556&nid=278) +- [矩阵分解推荐算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F62lhcin&aid=17403&nid=276) +- [论文:基于三部图网络结构的知识推荐算法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F78vyfh6&aid=17244&nid=274) +- [《推荐系统开发实战》之冷启动问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxv0mpu&aid=17031&nid=271) +- [《推荐系统开发实战》之推荐系统的灵魂伴侣:数据挖掘](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwhj4eb&aid=16980&nid=270) +- [基于 Erlang 语言的视频相似推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1whved&aid=16953&nid=270) +- [推荐系统之矩阵分解模型(原理篇)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzf3wie&aid=16543&nid=265) +- [数据与广告系列(七):广告与推荐系统技术架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F621wdc&aid=16469&nid=264) +- [构建可解释的推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Foj35u4&aid=16450&nid=264) +- [从零开始入门推荐算法工程师](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb78d1l&aid=16277&nid=262) +- [推荐系统冷启动](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Feo59x2&aid=15891&nid=257) +- [深度召回模型在 QQ 看点推荐中的应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu5o1mp&aid=15670&nid=254) +- [机器学习在微博信息流推荐中的应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyc6ldf&aid=15599&nid=253) +- [推荐系统融合排序之 LR](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw1rb09&aid=15256&nid=248) +- [重读 YouTube 深度学习推荐系统论文](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvwad6r&aid=15084&nid=246) +- [58 部落帖子推荐系统的抬手动作](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwvtv9f&aid=14547&nid=237) +- [大数据推荐系统实时架构和离线架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkwdn9d&aid=14382&nid=235) +- [2018 年最全的推荐系统干货](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl21nbg&aid=14220&nid=232) +- [[译] 2018 年推荐系统入门指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhszitv&aid=13611&nid=223) +- [京东推荐系统架构揭秘:大数据时代下的智能化改造](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpdwme8&aid=13581&nid=223) +- [推荐系统遇上深度学习(十五):强化学习在京东推荐中的探索](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1tmfmy&aid=13326&nid=219) +- [推荐系统遇上深度学习(十一):神经协同过滤 NCF 原理及实战](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcm6hka&aid=13187&nid=217) +- [从先进走向普遍的广告和推荐系统方法之一:在线学习](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9t354k&aid=12819&nid=211) +- [微软亚洲研究院论文解读:GAN 在网络特征学习中的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4l1kex&aid=12282&nid=204) +- [深度学习在 58 同城智能推荐系统中的应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fthubku&aid=12278&nid=204) +- [ 深度学习在推荐系统上的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpmd2v1&aid=12203&nid=203) +- [今日头条推荐算法原理全文详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvm05h0&aid=12157&nid=202) +- [从原理到策略算法再到架构产品看推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn2powm&aid=12115&nid=202) +- [[译] 一分钟整明白 Netflix 的 Contextual Bandits 的推荐探索策略](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6jz32a&aid=11998&nid=200) +- [融合了用户兴趣的推荐系统才更具个性](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp5z08l&aid=11855&nid=198) +- [就算是非技术人员也都有必要了解的一些推荐系统常识](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv62411&aid=11761&nid=197) +- [推荐系统之用户行为分析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbgzhaw&aid=11724&nid=197) +- [推荐系统那些事儿](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3wkrrg&aid=10953&nid=186) +- [3 亿会员、4 亿商品,深度学习在大型电商商品推荐的应用实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqfijcf&aid=10816&nid=184) +- [深度学习在美团点评推荐平台排序中的运用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fthx7o8&aid=10348&nid=178) +- [今日头条成功的核心技术秘诀是什么?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnvao7r&aid=10146&nid=175) +- [[译] 亚马逊推荐二十年](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh1peov&aid=10147&nid=175) +- [蘑菇街推荐工程实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F35tpcy&aid=10176&nid=175) +- [写给设计师的人工智能指南:推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdn9rsm&aid=9865&nid=171) +- [Pinterest 推荐系统四年进化之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F44yl8e&aid=9862&nid=171) +- [深度学习在推荐领域的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh1ey0b&aid=9850&nid=170) +- [Deep Learning for Recommendation Systems](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvlgip3&aid=9732&nid=169) +- [Bandit 算法与推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7uziol&aid=9559&nid=166) +- [深度学习在推荐算法上的应用进展](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9x52nx&aid=9463&nid=165) +- [魅族推荐平台的架构演进之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx4c15d&aid=9445&nid=165) +- [淘宝搜索/推荐系统背后深度强化学习与自适应在线学习的实践之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqpp7e2&aid=8803&nid=156) +- [[译] 工作职位推荐系统的算法与架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmunr12&aid=8369&nid=149) +- [基于用户画像的实时异步化视频推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fd9s3vx&aid=8240&nid=147) +- [兴趣 Feed 技术架构与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzjt9kg&aid=8079&nid=145) +- [推荐系统老司机的十条经验](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fupftbt&aid=8036&nid=144) +- [推荐系统的苟且和远方](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8pyzkt&aid=7139&nid=130) +- [[译] 如何从零构建实时的个性化推荐系统?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3cvjl9&aid=4928&nid=102) +- [大数据 / 数据挖掘 / 推荐系统 / 机器学习相关资源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fynunyg&aid=4857&nid=101) +- [为豆瓣电影实现 User-based 协同过滤的推荐系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh6dlgb&aid=4602&nid=98) +- [推荐系统基础知识](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0za23w&aid=4393&nid=96) +- [美团推荐系统整体框架与关键工作 (沈国阳)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjq47s&aid=3239&nid=84) +- [使用 Python 实现一个简单的推荐系统 (Kai Zhou)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcfc1t&aid=2132&nid=67) + +## 框架 + +- [分布式定时任务调度框架实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnecfb59&aid=18948&nid=299) +- [腾讯微服务框架 Tars 的 Go 性能提升之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw9edu5t&aid=17875&nid=282) +- [花椒移动端基础框架架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0b5llt3&aid=17731&nid=280) +- [设计一个分布式 RPC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdret83&aid=16439&nid=264) +- [[译] Linkerd or Istio?哪个 Service Mesh 框架更适合你?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fetr6qg&aid=16096&nid=260) +- [Golang 轻量级高并发 socket 框架 chitchat](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwmwus4&aid=15910&nid=257) +- [Aloha:一个分布式调度框架的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgu0vn2&aid=15786&nid=255) +- [ 架构认知(二):企业架构的框架和作用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsgkxah&aid=15556&nid=252) +- [简单高性能的 JavaScript 组件框架 Ale.js](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzm5v0z&aid=15137&nid=246) +- [[译] 评估 Kubernetes 中的 Serverless 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F17gc7q&aid=14690&nid=239) +- [[译] Uber 开源 Fusion.js:一个基于插件架构的通用 Web 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdjks43&aid=13835&nid=226) +- [服务框架的技术栈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fe35r0j&aid=13769&nid=225) +- [Scala 实现 DSL 的框架案例](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F44ltuw&aid=13276&nid=218) +- [Web 框架的架构模式探讨(JavaScript 语言)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo3pp4d&aid=13206&nid=217) +- [腾讯出品的微服务框架的名字服务解决方案 TSeer 正式开源](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx9ffwo&aid=12828&nid=211) +- [分布式单点登录框架 XXL-SSO](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flwkoz4&aid=12754&nid=210) +- [蚂蚁通信框架实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fgs1tff&aid=12748&nid=210) +- [从 Spring Cloud 看一个微服务框架的 “五脏六腑”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F206sbe&aid=12739&nid=210) +- [swoolefy:基于 Swoole 扩展实现的高性能 MVC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpm3wgu&aid=12535&nid=207) +- [手把手教你搭建一套可自动化构建的微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9t19hj&aid=12446&nid=206) +- [跟繁琐的命令行说拜拜,Gerapy 分布式爬虫管理框架来袭](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnqxt5d&aid=12177&nid=202) +- [设计和实现一款轻量级的爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxd00zo&aid=12081&nid=201) +- [Blade:高性能、简洁优雅的 Java Web 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl8iqmy&aid=11784&nid=197) +- [Log4a:基于 mmap 的高性能、高可用的 Android 日志收集框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1dr63d&aid=11715&nid=196) +- [Android 高级进阶(源码剖析篇):Twitter 的高性能序列化框架 Serial(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv04t13&aid=11576&nid=195) +- [腾讯与阅文技术合作,微服务框架 Tars 再添 PHP](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8s8pwz&aid=11344&nid=191) +- [XXL-CRAWLER:灵活高效、面向对象的分布式爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8408lv&aid=11348&nid=191) +- [TSF:腾讯出品的基于协程和 Swoole 驱动的高性能 PHP 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx5mx32&aid=11269&nid=190) +- [Colly:Go 实现的快速、优雅的高性能网页采集框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fltj9um&aid=11140&nid=188) +- [Biny:腾讯出品的高性能的超轻量级 PHP 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpixeg9&aid=11099&nid=187) +- [php-msf:基于 Swoole 的工程级企业微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbbht62&aid=10855&nid=184) +- [基于 Java、Kafka、ElasticSearch 的搜索框架的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffc0f0p&aid=10731&nid=183) +- [swoft:基于 Swoole 协程 2.x 的高性能 PHP 微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy7w5yu&aid=10553&nid=180) +- [iOS 从 0 到 1 搭建高可用 App 框架(二)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr7yjio&aid=10214&nid=176) +- [NHMicro:脚本化微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr6w3t5&aid=10117&nid=174) +- [Istio:Google、IBM 和 Lyft 联合开源的微服务 Service Mesh 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nfcfl&aid=10058&nid=173) +- [Google 应用框架实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2d8ovt&aid=9974&nid=172) +- [多研究些架构,少谈些框架(二):微服务和充血模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl7pnoz&aid=9929&nid=172) +- [基于 Spring Cloud 的微服务架构 v1.0](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo010bl&aid=9477&nid=165) +- [[译] 用分层结构打造苗条 MVC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg7ion2&aid=9189&nid=161) +- [Voyage:Java 实现的基于 Netty 的轻量、高性能分布式 RPC 服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Faclw19&aid=9215&nid=161) +- [小程序底层框架实现原理解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0v0kpa&aid=9079&nid=160) +- [Golang 高性能分布式游戏服务器框架 mqant](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5wma7d&aid=8911&nid=157) +- [[译] Google 是如何开发 Web 框架的](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn0gdvg&aid=8790&nid=156) +- [FastD:PHP 高性能 API 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg5ghje&aid=8708&nid=154) +- [微服务架构的基础框架选择:Spring Cloud 还是 Dubbo?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm124s5&aid=8292&nid=148) +- [JLiteSpider:轻量级的分布式 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nh7g6&aid=7761&nid=139) +- [SeimiCrawler:敏捷、独立部署、支持分布式的 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft70i21&aid=6809&nid=125) +- [基于 Dubbo 框架构建分布式服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsf6ol6&aid=6661&nid=123) +- [RPCX:类似 Dubbo 的分布式 RPC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzyeuuk&aid=6443&nid=120) +- [魅族 C++ 协程框架 Kiev 技术内幕](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6fdzp6&aid=6383&nid=120) +- [高性能分布式 Mock 平台的框架与设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F95qo0b&aid=6060&nid=116) +- [深入分析 iBATIS 框架之系统架构与映射原理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fatdywd&aid=5746&nid=112) +- [实施微服务,我们需要哪些基础框架?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhroumz&aid=4904&nid=102) +- [kiteq - 一个多种持久化方案的 MQ 框架 (@Beta版厨子)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo1pgk&aid=1996&nid=63) + +## 消息队列 + +- [浅入浅出消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzgc8ztu&aid=19595&nid=312) +- [深度剖析如何实现事务消息](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7i6ylx9&aid=18543&nid=292) +- [基于 Redis 实现的延迟消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwww9xod&aid=18191&nid=287) +- [万亿级消息背后: 小米消息队列的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frys99bx&aid=18161&nid=287) +- [金融行业消息队列选型及实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fov5cay&aid=15449&nid=251) +- [QMQ:去哪儿网内部广泛使用的消息中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3qehx7&aid=14951&nid=243) +- [分布式之消息队列复习精讲](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyosx21&aid=14551&nid=237) +- [天池中间件大赛:单机百万消息队列存储分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F505qkj&aid=13851&nid=227) +- [消息队列实现概要:深度解读分区 Topic 的实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq348q1&aid=13764&nid=225) +- [消息队列事务型消息原理浅析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fafyqe5&aid=13148&nid=216) +- [RAID 6 应用于消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdqfevp&aid=11851&nid=198) +- [分布式消息队列实现概要](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fenlfg4&aid=11707&nid=196) +- [几种常见的微服务架构方案简述:ZeroC IceGrid、Spring Cloud、基于消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4p2ebe&aid=10375&nid=178) +- [LocalMQ:从零构建类 RocketMQ 高性能消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fctccgi&aid=10177&nid=175) +- [消息队列的对比调研](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvvw3eq&aid=9763&nid=169) +- [Message Queue 的设计和实现(七)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsiyjen&aid=9151&nid=161) +- [腾讯云分布式高可靠消息队列 CMQ 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn7qpkw&aid=8945&nid=158) +- [Message Queue 的设计和实现(三)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2jr0pt&aid=8862&nid=157) +- [Gores:Go 语言编写的基于 Redis 的消息队列系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpts7bc&aid=8569&nid=152) +- [php-queue:PHP 开发的磁盘存储消息队列服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4tr157&aid=7892&nid=141) +- [PHP 高级编程之消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq5p960&aid=7023&nid=129) +- [消息队列设计精要](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7bcgog&aid=6747&nid=125) +- [Disque - 一个分布式消息队列 (antirez)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3cszs&aid=2230&nid=69) +- [可靠消息队列浅谈 (@招牌疯子)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6742y&aid=2148&nid=67) +- [kiteq - 一个多种持久化方案的 MQ 框架 (@Beta版厨子)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo1pgk&aid=1996&nid=63) + +## 编程语言 + +- [Go 1.14 实现高性能内存分配器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Finltn1q&aid=18914&nid=298) +- [Spring Boot 与微服务从 0 到 1 的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frbfhyll&aid=18651&nid=294) +- [微服务统一认证与授权的 Go 语言实现(上)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2tc96jt&aid=18636&nid=294) +- [iOS 基于静态库插桩的⼆进制重排启动优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnnmw2x1&aid=18512&nid=292) +- [Gbox:基于 Litho 的 Android 高性能动态业务容器,解决首页动态化的痛点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7t2itei&aid=18153&nid=286) +- [Go 微服务全链路跟踪详解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkc0iaka&aid=17814&nid=281) +- [小米 Go 开发实践:用 Go 构建高性能数据库中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo0y10it&aid=17812&nid=281) +- [Golang 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9mzp3bf&aid=17715&nid=280) +- [互联网架构微服务已经成为主流,Go 语言如何去打造呢?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsh3lncg&aid=17296&nid=274) +- [微服务中使用 OpenJ9 JVM 内存占用降 60%(相对 HotSpot)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftq492f&aid=17102&nid=272) +- [Go 并发设计模式之 Active Object](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fasw5qp&aid=17073&nid=271) +- [函数式编程让你忘记设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo09i73&aid=16878&nid=269) +- [AAC 系列(四):深入理解架构组件 ViewModel](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F88qvcp&aid=16648&nid=266) +- [自治对象才是好对象](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7ko3iw&aid=16434&nid=264) +- [轻松构建微服务之远程调用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F57dduv&aid=16356&nid=263) +- [拍拍贷消息系统原理与应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx5qrda&aid=16336&nid=263) +- [微服务化后缓存怎么做](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7q0a3u&aid=16189&nid=261) +- [Golang Failpoint 的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fep1en9&aid=16148&nid=260) +- [[译] 高性能 Go 服务的内存优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmacdlu&aid=15921&nid=257) +- [Golang 轻量级高并发 socket 框架 chitchat](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwmwus4&aid=15910&nid=257) +- [马蜂窝搜索基于 Golang 并发代理的一次架构升级](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbu5td2&aid=15817&nid=256) +- [Android 技术架构演进与未来](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6jrqfl&aid=15745&nid=255) +- [Android 架构组件:让天下没有难做的 App](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0qt8jk&aid=15678&nid=254) +- [NutsDB:纯 Go 编写的高性能内嵌型 KV 数据库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpadg21&aid=15650&nid=253) +- [指令集架构、机器码与 Go 语言](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbrbe04&aid=15306&nid=249) +- [让 Raft 变快 100 倍:Dragonboat 的写优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr7nlaa&aid=15210&nid=247) +- [Flutter 混合开发组件化与工程化架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwn7eo5&aid=15047&nid=245) +- [Go 分布式实时服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fetrnyn&aid=14984&nid=244) +- [被滥用的 GUI 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpgarge&aid=14906&nid=243) +- [Android 架构之长连接技术](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fheduhs&aid=14905&nid=243) +- [Android Architecture Component 和架构升级在铭师堂的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj7nzmk&aid=14837&nid=242) +- [杭州有赞招聘资深 Java 开发工程师/垂直业务架构师](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs16bsw&aid=13843&nid=239) +- [gorouter:简单高性能的 Go router](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2qyv4h&aid=14640&nid=238) +- [Android 架构:ViewModel 与 View 之间的通信](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb7eq8v&aid=14065&nid=230) +- [最佳实践:重构 AppDelegate(iOS)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpuxwzs&aid=14066&nid=230) +- [从 Go 高性能日志库 zap 看如何实现高性能 Go 组件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fegpgxv&aid=13936&nid=228) +- [Android 架构组件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbftpm0&aid=13930&nid=228) +- [[译] 微服务的 10 个挑战和解决方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbcqfzr&aid=13918&nid=228) +- [天池中间件大赛 Golang 版 Service Mesh 思路分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxcvqdy&aid=13803&nid=226) +- [MyPerf4J:针对高并发、低延迟应用设计的高性能且无侵入的实时 Java 方法性能监控和统计工具](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffn4v62&aid=13774&nid=225) +- [Spring Cloud 微服务版本灰度发布新神器](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0hkfi4&aid=13706&nid=224) +- [Python 后端架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv3s2la&aid=13674&nid=224) +- [使用 Android 架构组件实现 MVVM 模式的应用](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsdb5jf&aid=13668&nid=224) +- [Go 代码重构:23 倍的性能爆增](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9808ju&aid=13591&nid=223) +- [继承和面向接口(iOS 架构思想篇)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F09oh4x&aid=13551&nid=222) +- [苏宁数据中台基于 Spring Cloud 微服务架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpa4438&aid=13449&nid=221) +- [Go 微服务实战汇总](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fng7jym&aid=13356&nid=219) +- [基于可靠消息方案的分布式事务(二):Java 中的事务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F28xhz5&aid=13190&nid=217) +- [如何基于 Golang 设计一套微服务架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbkh1sp&aid=13122&nid=216) +- [从跨语言调用到 dubbo2.js](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1ragmw&aid=13098&nid=215) +- [什么时候能用上设计模式?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbeyk5y&aid=13075&nid=215) +- [秒杀架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzavy6s&aid=12999&nid=214) +- [罗辑思维 Go 语言微服务改造实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1kjbj5&aid=12924&nid=213) +- [[译] PHP-FPM 调优:为了高性能使用 pm static](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fw0d16z&aid=12922&nid=213) +- [Android 工程模块化平台的设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxq9rcw&aid=12846&nid=212) +- [苏宁易购 Android 架构演进史](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi992v2&aid=12792&nid=211) +- [Golang 高性能实战](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F155gol&aid=12800&nid=211) +- [浅析 iOS 中的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdvul4d&aid=12795&nid=211) +- [基于 Spring Cloud 的 Microservices 架构实战案例:架构拆解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzpvlor&aid=12710&nid=210) +- [基于 Spring Cloud 的微服务落地](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx0w7ai&aid=12709&nid=210) +- [跨平台长连接组件设计及可插拔改造](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjz9zjj&aid=12744&nid=210) +- [从 Spring Cloud 看一个微服务框架的 “五脏六腑”](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F206sbe&aid=12739&nid=210) +- [MMKV:基于 mmap 的 iOS 高性能通用 key-value 组件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fuimy8i&aid=12675&nid=209) +- [阿里架构师分享的 Java 程序员需要突破的技术要点](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqikhdp&aid=12559&nid=208) +- [swoolefy:基于 Swoole 扩展实现的高性能 MVC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpm3wgu&aid=12535&nid=207) +- [全面解析京东微服务平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F38d3c9&aid=12405&nid=206) +- [基于 Sanic 的微服务基础架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmfs5yn&aid=12312&nid=204) +- [Android Architecture Component 解析之 ViewModel](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxvtqse&aid=12287&nid=204) +- [Android Architecture Components 和可测试代码](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi3wyqv&aid=12214&nid=203) +- [guard:高性能熔断器 + 代理服务器(Golang)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr0qfju&aid=12180&nid=202) +- [Dubbo 作者聊设计原则(2011)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3vleiv&aid=12037&nid=201) +- [Android 应用架构前世今生](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjllh7k&aid=12054&nid=201) +- [TDD 开发容器化的 Python 微服务应用(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh7i1x8&aid=11888&nid=199) +- [[译] 2018 PHP 应用程序安全设计指北](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcqhkb2&aid=11892&nid=199) +- [探索 Android 架构组件 Room](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkenqnn&aid=11814&nid=198) +- [MultiHttp:高性能 PHP 封装的 HTTP Restful 多线程并发请求库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3jmpx4&aid=11786&nid=197) +- [Blade:高性能、简洁优雅的 Java Web 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl8iqmy&aid=11784&nid=197) +- [搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft6jibs&aid=11767&nid=197) +- [读懂唱吧 KTVHTTPCache 设计思想(iOS)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnf3zsh&aid=11744&nid=197) +- [Log4a:基于 mmap 的高性能、高可用的 Android 日志收集框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1dr63d&aid=11715&nid=196) +- [Android 高级进阶(源码剖析篇):Twitter 的高性能序列化框架 Serial(一)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv04t13&aid=11576&nid=195) +- [一文读懂连接池技术原理、设计与实现(Python)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnickqt&aid=11530&nid=194) +- [gkvdb 的介绍及设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmy98uz&aid=11518&nid=194) +- [Go 使用 grpc + http 打造高性能微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9we6bi&aid=11532&nid=194) +- [腾讯与阅文技术合作,微服务框架 Tars 再添 PHP](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8s8pwz&aid=11344&nid=191) +- [使用 Redis 实现分布式锁及其优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8h65sd&aid=11335&nid=191) +- [gRPC & Protocol Buffer 构建高性能接口实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnxrzow&aid=11323&nid=191) +- [TSF:腾讯出品的基于协程和 Swoole 驱动的高性能 PHP 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fx5mx32&aid=11269&nid=190) +- [带你领略 Clean 架构的魅力](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fajuu54&aid=11192&nid=189) +- [阿里云基于 Go 的微服务架构分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyxd30b&aid=11170&nid=189) +- [Colly:Go 实现的快速、优雅的高性能网页采集框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fltj9um&aid=11140&nid=188) +- [MultiHttp:高性能的 PHP 封装的 HTTP Restful 多线程并发请求库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fri3tnj&aid=11097&nid=187) +- [Biny:腾讯出品的高性能的超轻量级 PHP 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpixeg9&aid=11099&nid=187) +- [用 500 行 Golang 代码实现高性能的消息回调中间件](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fu6hhfn&aid=10977&nid=186) +- [dubbo 源码解析:集群容错架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg6a3fw&aid=11000&nid=186) +- [php-msf:基于 Swoole 的工程级企业微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbbht62&aid=10855&nid=184) +- [深入理解 iOS 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6kb78y&aid=10737&nid=183) +- [基于 Java、Kafka、ElasticSearch 的搜索框架的设计与实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffc0f0p&aid=10731&nid=183) +- [Android 应用架构组件实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmp85ri&aid=10653&nid=182) +- [如何用 Go 打造亿级实时分布式出行平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsntl6i&aid=10587&nid=181) +- [[译] 基于 Android Architecture Components 的应用架构指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fuk2he1&aid=10582&nid=181) +- [molten:PHP 应用透明链路追踪工具](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3ijcsx&aid=10558&nid=180) +- [swoft:基于 Swoole 协程 2.x 的高性能 PHP 微服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy7w5yu&aid=10553&nid=180) +- [浅谈 MVC、MVP 和 MVVM 架构模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy2np6x&aid=10539&nid=180) +- [谈谈 Tomcat 架构及启动过程](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhhl4bd&aid=10314&nid=177) +- [iOS 从 0 到 1 搭建高可用 App 框架(二)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fr7yjio&aid=10214&nid=176) +- [再谈 WebSocket,论架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdnygab&aid=10166&nid=175) +- [Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo9e9gh&aid=10095&nid=174) +- [两年 PHPer 聊下架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjzvfgf&aid=10083&nid=174) +- [iOS 架构实践:The Right Way to Architect iOS App with Swift](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2x5xil&aid=10007&nid=173) +- [Base 封装(一):我的最简 MVP 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqji3ft&aid=10003&nid=173) +- [iOS 动态功能部署我们是这样实现的:理论设计篇](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7k6g5g&aid=9945&nid=172) +- [iOS 架构设计:URL 缓存](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ff42gp4&aid=9879&nid=171) +- [[译] Google 官方推出应用开发架构指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbun0rg&aid=9747&nid=169) +- [针对 PHP 做的 Ragnar Fiery 分布式性能跟踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F462xte&aid=9698&nid=168) +- [[译] 为了更好地支持微服务,我们从 PHP 迁移到了 Go](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fver9l5&aid=9669&nid=168) +- [iOS 无埋点数据 SDK 的整体设计与技术实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj4639h&aid=9588&nid=167) +- [PHP 应用性能优化指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvtovqv&aid=9591&nid=167) +- [华尔街见闻基于 Golang 的微服务实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2hkd12&aid=9594&nid=167) +- [58 同城 iOS 客户端组件化演变历程](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6ch3h7&aid=9385&nid=164) +- [天弘基金 iOS App 架构优化之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqoz4i6&aid=9313&nid=163) +- [沪江学习 Android 端应用架构重构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4grbn9&aid=9310&nid=163) +- [Voyage:Java 实现的基于 Netty 的轻量、高性能分布式 RPC 服务框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Faclw19&aid=9215&nid=161) +- [iOS 设计模式资料整理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1f5d0d&aid=9203&nid=161) +- [[译] 用分层结构打造苗条 MVC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg7ion2&aid=9189&nid=161) +- [[译] GitHub 上 star 超过 2k 的 Android MVP 架构指南](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fljxg0a&aid=9167&nid=161) +- [分布式任务队列 Celery 介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Futsyhi&aid=9119&nid=160) +- [安居客 Android 项目架构演进](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0qntq9&aid=8930&nid=158) +- [Golang 高性能分布式游戏服务器框架 mqant](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5wma7d&aid=8911&nid=157) +- [Antares:分布式任务调度平台](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0w8lyo&aid=8776&nid=155) +- [Android 架构思考](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F215rg8&aid=8738&nid=155) +- [FastD:PHP 高性能 API 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg5ghje&aid=8708&nid=154) +- [Spring Cloud 构建微服务架构(一):服务注册与发现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj224c4&aid=8692&nid=154) +- [Gores:Go 语言编写的基于 Redis 的消息队列系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpts7bc&aid=8569&nid=152) +- [人人车 Android 客户端架构演进实录](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fz8sdtl&aid=8512&nid=152) +- [后台任务处理系统的架构演进和优化(Golang)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyua3wh&aid=8459&nid=151) +- [PHP 完整实战 23 种设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fba1gvr&aid=8275&nid=148) +- [Mybatis 源码解读:设计模式总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsvue4s&aid=8266&nid=148) +- [微服务架构的基础框架选择:Spring Cloud 还是 Dubbo?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm124s5&aid=8292&nid=148) +- [你知道途牛 Android 客户端架构是怎么优化的吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fa654o2&aid=8201&nid=147) +- [如何使用 PHP 构建一个高性能的弹幕后端服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fatxbdh&aid=8142&nid=146) +- [The Clean Architecture in PHP 读书笔记(九)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6b2lsp&aid=8093&nid=145) +- [没有单元测试,何谈重构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9c7psr&aid=8059&nid=144) +- [php-queue:PHP 开发的磁盘存储消息队列服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4tr157&aid=7892&nid=141) +- [JLiteSpider:轻量级的分布式 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2nh7g6&aid=7761&nid=139) +- [MVP 架构系列:豆瓣电影 Top 250](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F7dmd30&aid=7133&nid=130) +- [PHP 高级编程之消息队列](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fq5p960&aid=7023&nid=129) +- [Android 存储系统之架构篇](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh1z7r3&aid=7020&nid=129) +- [Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fblkw89&aid=7001&nid=128) +- [BLog4go:Go 实现的高性能日志库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Faja47z&aid=6868&nid=126) +- [用设计模式解析 RecyclerView](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Figxyp5&aid=6781&nid=125) +- [SeimiCrawler:敏捷、独立部署、支持分布式的 Java 爬虫框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft70i21&aid=6809&nid=125) +- [Android 架构资源集合](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ft65e9q&aid=6792&nid=125) +- [HackerNews_Kotlin:Google MVP 架构的 Kotlin 实践 Hacker News Android 客户端](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2bmhmb&aid=6741&nid=124) +- [设计模式:PHP 和 Go 语言实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fepgdgs&aid=6519&nid=121) +- [RPCX:类似 Dubbo 的分布式 RPC 框架](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzyeuuk&aid=6443&nid=120) +- [iOS MVVM 架构:界面与数据 I/O 逻辑分离的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8b4zfw&aid=6311&nid=119) +- [[译] PHP 中的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5jrs39&aid=5827&nid=113) +- [[译] 面向协议的 MVVM 架构介绍](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbw0v4g&aid=5773&nid=112) +- [App 环境分离的实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2kdmng&aid=5752&nid=112) +- [Service Oriented 的 iOS 应用架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcvphc9&aid=5751&nid=112) +- [微信 Android 客户端后台保活经验分享](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffuoqeh&aid=5747&nid=112) +- [深入分析 iBATIS 框架之系统架构与映射原理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fatdywd&aid=5746&nid=112) +- [实践移动端的 Flux 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fi5mf23&aid=5725&nid=111) +- [Java 单例真的写对了么?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0jkeod&aid=5665&nid=111) +- [滴滴出行 iOS 客户端架构演进之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnlyfll&aid=5563&nid=110) +- [Android App 的设计架构:MVC, MVP, MVVM 与架构经验谈](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F72fu1o&aid=5569&nid=110) +- [iOS 应用架构谈:组件化方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fs9jf1i&aid=5546&nid=109) +- [Sky Walking:对 Java 分布式应用程序集群业务运行情况进行追踪、告警和分析的系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fagpnck&aid=5541&nid=109) +- [iOS 开发性能提高](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fb5947s&aid=5431&nid=108) +- [Golang 微服务工具包](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1d5zn4&aid=5405&nid=107) +- [用 Swift 搭建数据驱动型 iOS 架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flf5p2m&aid=5361&nid=107) +- [设计模式实现(Java、C++、Golang)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzfu1m1&aid=5237&nid=105) +- [端游、手游服务端常用的架构是什么样的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo92cr2&aid=5223&nid=105) +- [微信红包的随机算法是怎样实现的?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ficutt3&aid=5222&nid=105) +- [[译] Dapper,大规模分布式系统的跟踪系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fuu90n0&aid=5099&nid=104) +- [Nucleus - 一个 Android MVP 架构库](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxtl4i9&aid=5175&nid=104) +- [[译] iOS 架构模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6qjp90&aid=5009&nid=103) +- [Android 应用开发架构概述](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn9rpfr&aid=4990&nid=103) +- [[译] 如何利用 Python 中的 @property 装饰器快速重构代码?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkj0g4l&aid=4655&nid=99) +- [Java Web 架构知识整理:记一次阿里面试经历](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqptaph&aid=4459&nid=97) +- [Java 应用一般架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fv339kl&aid=4152&nid=94) +- [[译] Android 架构演化之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg6l2kb&aid=4068&nid=93) +- [iOS 高性能图片架构与设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fnn74b&aid=3907&nid=91) +- [如何实现支持数亿用户的长连消息系统 (周洋)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqck4b&aid=3347&nid=85) +- [Android 系统架构之微服务架构 (MrSimple)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzkdfq&aid=2489&nid=74) +- [iOS 应用架构谈:网络层设计方案 (CasaTaloyum)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F213vr&aid=2431&nid=73) +- [iOS 应用架构谈:view 层的组织和调用方案 (@CasaTaloyum)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzb6d8&aid=2168&nid=68) +- [iOS 应用架构谈 (@CasaTaloyum)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzrno2&aid=2124&nid=67) +- [Android 源码设计模式分析 (@MrSimp1e)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqpbmg&aid=2006&nid=64) +- [iOS 设计模式解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp60yz&aid=3&nid=1) + +## 设计模式 + +- [设计模式太难了?看看这个 “说人话” 的版本再说!](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8ofy33k&aid=19349&nid=307) +- [设计模式太难了?看看这个 “说人话” 的版本再说!](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8ofy33k&aid=19293&nid=306) +- [[译] Spring 中的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fy5tucha&aid=19193&nid=304) +- [设计模式在外卖营销业务中的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6gqgvf1&aid=19089&nid=301) +- [Golang 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9mzp3bf&aid=17715&nid=280) +- [你真的懂 Builder 设计模式吗?论如何实现真正安全的 Builder 模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvjgdzt1&aid=17484&nid=277) +- [你想知道的 React 组件设计模式这里都有(上)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fh91pvf&aid=17190&nid=273) +- [Go 并发设计模式之 Half-Sync/Half-Async](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Feq68nw&aid=17116&nid=272) +- [Go 并发设计模式之 Active Object](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fasw5qp&aid=17073&nid=271) +- [函数式编程让你忘记设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fo09i73&aid=16878&nid=269) +- [[译] 微服务通信的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvnvqk7&aid=14937&nid=243) +- [被滥用的 GUI 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpgarge&aid=14906&nid=243) +- [微服务设计模式之 API 网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2bho18&aid=13613&nid=223) +- [[译] 你需要了解的 23 种 JavaScript 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1orta0&aid=13207&nid=217) +- [什么时候能用上设计模式?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbeyk5y&aid=13075&nid=215) +- [浅析 iOS 中的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fdvul4d&aid=12795&nid=211) +- [浅谈 Chromium 中的设计模式(一):Chromium 中模块分层和进程模型](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fn96o20&aid=12747&nid=210) +- [分布式系统数据层设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm0se1z&aid=12191&nid=203) +- [深入理解 iOS 设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6kb78y&aid=10737&nid=183) +- [你了解 CSS 设计模式吗?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvzmo7j&aid=10088&nid=174) +- [iOS 设计模式资料整理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1f5d0d&aid=9203&nid=161) +- [使用微服务架构重构支付网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj99pg0&aid=8947&nid=158) +- [当函数成为一等公民时,设计模式的变化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyphsdo&aid=8899&nid=157) +- [PHP 完整实战 23 种设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fba1gvr&aid=8275&nid=148) +- [Mybatis 源码解读:设计模式总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsvue4s&aid=8266&nid=148) +- [[译] 深入理解 React & Redux 原理套路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9ea82e&aid=7024&nid=129) +- [用设计模式解析 RecyclerView](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Figxyp5&aid=6781&nid=125) +- [别人再问你设计模式,叫他看这篇文章](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmw1p2q&aid=6560&nid=122) +- [设计模式:PHP 和 Go 语言实现](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fepgdgs&aid=6519&nid=121) +- [图说设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwux6na&aid=6415&nid=120) +- [[译] PHP 中的设计模式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F5jrs39&aid=5827&nid=113) +- [Java 单例真的写对了么?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F0jkeod&aid=5665&nid=111) +- [服务化设计模式实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Frryx7t&aid=5566&nid=110) +- [设计模式实现(Java、C++、Golang)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzfu1m1&aid=5237&nid=105) +- [这就是观察者模式 (@Android月)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fukeg6&aid=2700&nid=77) +- [Android 源码设计模式分析 (@MrSimp1e)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqpbmg&aid=2006&nid=64) +- [iOS 设计模式解析](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp60yz&aid=3&nid=1) + +## 重构 + +- [靠谱程序员必备技能:重构也要有方法论](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1m60x53&aid=19149&nid=303) +- [系统重构的道与术](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbbitt36&aid=18438&nid=291) +- [3000 字详解 Kylin 查询缓存重构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmwwbsa0&aid=18181&nid=287) +- [CMS 后台重构技术方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvb06zhh&aid=18079&nid=285) +- [[译] 手把手介绍函数式编程:从命令式重构到函数式](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwa8waj1&aid=17559&nid=278) +- [领域驱动设计在马蜂窝优惠中心重构中的实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fzm7h0w&aid=17007&nid=270) +- [记一次前端项目重构要点总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fp20k50&aid=16887&nid=269) +- [快看!原来重构如此简单](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fsni80t&aid=16295&nid=262) +- [携程国际 BU 的 SEO 重构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1a73tz&aid=14350&nid=234) +- [前端重构范式之 position](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F1f9hjy&aid=14289&nid=233) +- [面向体验的重构优化](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fyw7ikn&aid=14232&nid=232) +- [[译] 什么是代码整理?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fxvllvd&aid=14157&nid=231) +- [最佳实践:重构 AppDelegate(iOS)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpuxwzs&aid=14066&nid=230) +- [前端重构范式之 float layout](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fif6kcd&aid=13886&nid=227) +- [Go 代码重构:23 倍的性能爆增](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9808ju&aid=13591&nid=223) +- [重构 React 组件的实用清单](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpmw8k9&aid=13468&nid=221) +- [IntelliJ IDEA 复杂的重构操作](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4g28uc&aid=11929&nid=199) +- [IntelliJ IDEA 复杂的重构技巧](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm6223t&aid=11839&nid=198) +- [6 个月清洗近千亿条微信支付交易记录,他们要搞什么大事情?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2z2c8a&aid=11516&nid=194) +- [电商工作后台首页的商业价值重构与产品化设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F3s1cb0&aid=11469&nid=193) +- [巧用匿名函数重构你的代码](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F36bkj5&aid=11128&nid=188) +- [[译] 微服务从设计到部署(七):重构单体为微服务](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvii7xj&aid=11077&nid=187) +- [系统重构的 10 点经验总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkoyyyl&aid=10952&nid=186) +- [Spark 技术在唯品会财务系统重构中的实践总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F2bts6n&aid=10888&nid=185) +- [重构:靠谱程序员的必备技能](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fl0vos2&aid=9898&nid=171) +- [重构之十六字心法](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fwrkil7&aid=9618&nid=167) +- [沪江学习 Android 端应用架构重构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F4grbn9&aid=9310&nid=163) +- [如何重构 “箭头型” 代码](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fhqoj3c&aid=9324&nid=163) +- [使用微服务架构重构支付网关](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fj99pg0&aid=8947&nid=158) +- [没有单元测试,何谈重构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9c7psr&aid=8059&nid=144) +- [在重构脚手架中掌握 React / Redux / Webpack2 基本套路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpq17kb&aid=7739&nid=139) +- [[PPT] 一次重构引发的分布式服务管理](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbj8f2u&aid=6724&nid=124) +- [如何重构一个大型历史项目:百度经验改版总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fvypknr&aid=6604&nid=123) +- [重构过程中的过度设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fm7pko4&aid=6462&nid=121) +- [重构的七宗罪](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fmsc7fg&aid=5694&nid=111) +- [CSS 代码重构与优化之路](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftsm29i&aid=4926&nid=102) +- [[译] 如何利用 Python 中的 @property 装饰器快速重构代码?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fkj0g4l&aid=4655&nid=99) +- [前端技能训练:重构一 (@Phodal)](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fihikv&aid=2710&nid=77) + +## 集群 + +- [架构设计基础:单服务、集群、分布式的基本区别和联系](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqfdoann&aid=19231&nid=305) +- [Egg.js 打造高可用服务集群](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fjvrb95x&aid=17992&nid=284) +- [Zookeeper 集群如何高可用部署?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fpsflvg&aid=16363&nid=263) +- [滴滴 Elasticsearch 多集群架构实践](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F6ywapq&aid=16250&nid=262) +- [那些年用过的 Redis 集群架构](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fbx4tiy&aid=15297&nid=249) +- [分布式高性能 Redis 集群线上常见问题](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ffxnlcx&aid=14485&nid=236) +- [Node.js:浅析高并发与分布式集群](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Flqz7i8&aid=13806&nid=226) +- [你不知道的 RabbitMQ 集群架构全解](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F9g5txc&aid=13722&nid=225) +- [MySQL 高可用集群方案之 PXC](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcazqgv&aid=13222&nid=217) +- [集群资源调度系统设计架构总结](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fqgjwm8&aid=12690&nid=210) +- [dubbo 源码解析:集群容错架构设计](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fg6a3fw&aid=11000&nid=186) +- [微服务注册发现集群搭建:Registrator + Consul + Consul-template + nginx](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2F8ds6fl&aid=10390&nid=178) +- [ActiveMQ 高可用集群方案](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fcao9bv&aid=7144&nid=130) +- [如果有 10000 台机器,你想怎么玩?](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Ftbdmv6&aid=5491&nid=109) +- [Sky Walking:对 Java 分布式应用程序集群业务运行情况进行追踪、告警和分析的系统](https://weekly.manong.io/bounce?url=https%3A%2F%2Ftoutiao.io%2Fk%2Fagpnck&aid=5541&nid=109) diff --git a/content/posts/1.Learning/A3.Reflections/Algorithm/ArrayDoublePoint.md b/content/posts/1.Learning/A3.Reflections/Algorithm/ArrayDoublePoint.md new file mode 100644 index 0000000..2f1c0a5 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Algorithm/ArrayDoublePoint.md @@ -0,0 +1,6 @@ +--- +title: "数组双指针" +date: 2023-09-21T17:10:12+08:00 +tags: ["Algorithm"] +categories: ["Learning", "Reflections"] +--- \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListDoublePoint.md b/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListDoublePoint.md new file mode 100644 index 0000000..8494185 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListDoublePoint.md @@ -0,0 +1,110 @@ +--- +title: "链表双指针" +date: 2023-09-19T16:29:57+08:00 +tags: ["Algorithm"] +categories: ["Learning", "Reflections"] +--- + +到现在面试经历过很多次了,却很少有成功,之前拒掉了几次面试,现在非常后悔。 + +这里记录下之前面试的他们的算法题 + +## 1. 如何判断一个链表有环 + +1. 快慢指针可以解决这个问题 + +> 使用快慢指针。这里为什么会相遇?最坏的打算当慢指针走一圈的时候,快指针可以走两圈,所以刚好会在同一个点上面。 +> +> 如果最后指向null,则说明没有环,如果最后走到了相同点,则说明有环。 + +2. 如何判断该环的起点在什么地方 + +![image-20230919163443270](https://image.shijinping.cn/picgo/202309191634061.png) + +> 1. 可以假设 环起点 到相遇点的距离为 m +> 2. 那么head到 环起点 刚好是 k-m +> 3. 因为慢指针走了 k 步快指针走了 2k 步相遇了,那么相遇点到快指针的相遇点(N圈之后的相遇点)距离就变成了 2k-k=k 距离一样。那么剪掉相同的环起点到相遇点的 m 都变成了 k-m 步。这样,把任何一个指针的头指针指向 head,用相同的速度,再次相遇点,就是环起点。 + +## 2. 两条链表是否相交 + +要判断两个链表是否相交,可以判断有没有共同部分,那么共同部分怎么判断呢? + +1. 最原始的办法:使用map(映射)来记录每个node的信息,java中地址值不存在,可以直接判断引用是否一致。golang可以根据地址是否一致,也可以记录value是否一致(当然存在相同的value的情况就不行了) +2. 使用特殊手法,如下图 + +![image-20230919170716775](https://image.shijinping.cn/picgo/202309191707494.png) + +> 1. 双指针同时进行 +> 2. 迭代A链表,结束后,迭代B链表 +> 3. 迭代B链表,结束后,迭代A链表 +> 4. 在迭代的时候,判断两个指针是否一致,如果存在一致 + +具体代码可以是 + +```go + p1, p2 := headA, headB + for p1 != p2 { + if p1 == nil { + p1 = headB + } else { + p1 = p1.Next + + } + if p2 == nil { + p2 = headA + } else { + p2 = p2.Next + } + } + return p1 +``` + +这里有个问题,如果一直没有重复的,会怎么样呢? + +> 这个问题比较好回答,因为 A+B 和 B+A 之后,那么他们的总长度是相同的,相同的总长度,如果没有重合的话,肯定是nil,那么肯定满足 p1 = p2 的条件。 + +## 3. 合并多个链表 + +合并两个链表可以在程序中,对比两个链表的val来进行合并,但是合并多个链表,就存在不一样的问题了,所以需要其他的处理方式。 + +所以这里需要用到了priority队列,所以首先要完成优先队列 + +```go +type Queue []*ListNode + +func (q Queue) Len() int{ + return len(q) +} + +func (q Queue)Less(i,j int) bool { + return q[i].Val < q[j].Val +} + +func (q Queue)Swap(i, j int){ + q[i],q[j] = q[j], q[i] +} + +func (q *Queue) Push(v interface{}){ + *q = append(*q, v.(*LinkNode)) +} + +func (q *Queue) Pop() interface{} { + old:= *q + n:=len(*q) + v:=*q[n-1] + *q = old[:n-1] + return v +} +``` + +> 这里为什么对Queue的方法,即有Queue对象的,又有Queue指针的呢? +> +> 1. `Queue`本质上是个 *ListNode 数组,其Len/Less/Swap是比较常见的数组用来sort需要定义的函数, +> +> 2. 而Push、Pop则是使用数组来插入、获取的方法 +> +> 其中 1 实现的 sort/sort.go中的 `type Interface interface` 接口,所以需要使用的是Queue对象。 +> +> 而 2 实现的是对Queue的插入、获取方法,这些方法如果需要对指针对象进行操作,如果不是指针对象,而是复制对象,那不会影响原来的值,就没有意义。 +> +> 注:具体关于优先级别队列的,可以参照 [网上介绍](https://ieevee.com/tech/2018/01/29/go-heap.html) diff --git a/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListReverse.md b/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListReverse.md new file mode 100644 index 0000000..5fad1b5 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Algorithm/LinkListReverse.md @@ -0,0 +1,200 @@ +--- +title: "链表转换" +date: 2023-09-20T07:53:39+08:00 +tags: ["Algorithm"] +categories: ["Learning", "Reflections"] +--- + +这里没有记住,需要在吸收下 + +## 链表反转 + +[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/) + +### for循环处理 + +时间复杂度O(N)(循环整个链表),空间复杂度O(1),只有几个临时变量 + +image-20230920085359962 + +其实链表反转,无非就是上面这张图。 + +1. 记录current的next节点(因为这里current的next需要指向pre) +2. 把current的next指向pre +3. 把current节点变成pre节点 +4. 把next节点变成current节点 + +> 最后当current节点变成空时,pre节点就是反转后的链表 + +代码如下: + +```go + if head == nil || head.Next == nil { + return head + } + current := head // 把头指向当前 + var pre *ListNode // 做一个pre节点 + for current != nil { + next := current.Next // 1.记录当前的下一个节点 + current.Next = pre // 2.把当前的next指向pre + pre = current // 3.把current节点变成pre节点 + current = next // 4.把next节点变成current节点 + } + return pre +``` + +### 迭代处理 + +![image-20230920092045168](https://image.shijinping.cn/picgo/202309200920953.png) + +核心思想:“2”节点后面的额所有元素都进过反转了,但是head“1”节点的next还是指向了“2”,所以可以直接把“2”的next指向head,这样就有反转后的链表了 + +```go +if head == nil || head.Next == nil { + return head +} + +last := reverse(head.Next) +head.Next.Next = head +head.Next = nil +return last +``` + +## 反转链表中间部分 + +[92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/) + +### for 循环处理 + +![image-20230920093054992](https://image.shijinping.cn/picgo/202309200930649.png) + +这里分成三部分: + +1. 前段:不需要反转的 +2. 中段:需要反转的 +3. 后段:不需要反转的 + +如果这里left是0,那么就会出现前段为空,那么一般情况是加上dummy节点来处理。步骤分别是: + +1. 把p0的next的next指向current +2. 把p0的next是pre + +```go + if head == nil || head.Next == nil { + return head + } + + dummy := &ListNode{Next: head} + p0 := dummy + for i := 0; i < left-1; i++ { // 注意:这里需要left-1,而不是left,因为需要少一个 + p0 = p0.Next + } + + var pre *ListNode + current := p0.Next + + for i := 0; i < right-left+1; i++ { + next := current.Next + current.Next = pre + pre = current + current = next + } + p0.Next.Next = current // 把p0的next的next指向current + p0.Next = pre // 把p0的next是pre + return dummy.Next +``` + + + +### 迭代处理 + +```go + if head == nil || head.Next == nil { + return head + } + var successor *ListNode + + var reverseN func(head *ListNode, n int) *ListNode + reverseN = func(head *ListNode, n int) *ListNode { + if n == 1 { + successor = head.Next + return head + } + last := reverseN(head.Next, n-1) + head.Next.Next = head + head.Next = successor + return last + } + if left == 1 { + return reverseN(head, right) + } + head.Next = reverseBetween(head.Next, left-1, right-1) + return head +``` + +### 按照固定的K个长度进行反转 + +[25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/) + +这题还不会。。。 + +### 走一半后,反转链表 + +[234. 回文链表](https://leetcode.cn/problems/palindrome-linked-list/) + +#### 方法1,非正规 + +把链表转换成数组,用数据进行处理 + +```go + // 第一种:如果用slice来处理,耗时和内存占用都比较大 + // 执行耗时:124 ms,击败了50.65% 的Go用户 + // 内存消耗:8.3 MB,击败了73.55% 的Go用户 + s := make([]int, 0, 100000) // 这里cap为100000,因为最大长度是10的5次方 + for head != nil { + s = append(s, head.Val) + head = head.Next + } + left, right := 0, len(s)-1 + for left < right { + if s[left] != s[right] { + return false + } + left++ + right-- + } + return true +``` + +#### 方法2 + +> 1. 使用快慢指针获取链表的中间位置 +> 2. 反转后半部分 +> 3. 反转后的链表和原链表进行匹配 + +其中需要注意的部分是,怎么判断中间部分 + +![image-20230921170016832](https://image.shijinping.cn/picgo/202309211700384.png) + +这里的奇数部分需要做特殊处理,当fast不是nil,就说明是奇数,那么比对的是`2、1`这两个节点,所以slow需要往后移动一格 + +```go + fast, slow := head, head + for fast != nil && fast.Next != nil { + fast = fast.Next.Next + slow = slow.Next + } + if fast != nil { + slow = slow.Next // 这里就是上面图的特殊处理 + } + left, right := head, reverse(slow) // reverse方法就是普通的反转链表 + for right != nil { + if left.Val != right.Val { + return false + } + left = left.Next + right = right.Next + } + return true +``` + diff --git a/content/posts/1.Learning/A3.Reflections/DevOps/_index.md b/content/posts/1.Learning/A3.Reflections/DevOps/_index.md new file mode 100644 index 0000000..c7897f8 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/DevOps/_index.md @@ -0,0 +1,8 @@ +--- +title: "DevOps" +date: 2023-04-20T09:01:37+08:00 +tags: ["DevOps"] +categories: ["Learning", "Reflections"] +--- + +DevOps 运维相关的知识点 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/DevOps/mac_install_homepage.md b/content/posts/1.Learning/A3.Reflections/DevOps/mac_install_homepage.md new file mode 100644 index 0000000..e1bdf5c --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/DevOps/mac_install_homepage.md @@ -0,0 +1,105 @@ +--- +title: "Mac安装homepage" +date: 2024-03-15T21:38:06+08:00 +tags: ["DevOps"] +categories: ["Learning", "Reflections"] +--- + +## 1. homepage介绍 + +官网地址:[这里](https://gethomepage.dev/latest/) + +> 一个现代化、完全静态、快速、安全、完全代理、高度可定制的应用程序仪表板,集成了 100 多种服务,并可翻译成多种语言。通过 YAML 文件或 [Docker](coco://sendMessage?ext={"s%24wiki_link"%3A"https%3A%2F%2Fm.baike.com%2Fwikiid%2F1782721469276222823"}&msg=Docker) 标签发现轻松配置。 + +## 2. 为什么要写这个? + +因为官网提供的是docker、k8s等安装方式,并没有提供mac本地安装,而我想在自己电脑上有这么一个。所以就要用源码安装了。 + +## 3. 普通安装会出来什么问题? + +mac新版本用iTrem2的`nohup`启动后,退出iTrem2后,Session会关闭,导致`nohup`不成功 + +## 4. 如何处理? + +### 4.1 下载源码,切换分支 + +```shell +git clone https://github.com/gethomepage/homepage.git HomePage +git checkout tags/v0.8.9 +``` + +### 4.2 确定node版本,编译 + +```shel +# 应该在18以上,我是20 +# 到工作目录 +npm install -g pnpm +pnpm install +pnpm build +``` + +### 4.3 创建plist + +地址:`~/Library/LaunchAgents` + +名称:`wiki.micah.homepage.plist` 注意,这里必须plist结尾的 + +内容:`xxx`表示你的用户目录 + +```shell + + + + + + Label + wiki.micah.homepage + + RunAtLoad + + + KeepAlive + + + ThrottleInterval + 60 + + EnvironmentVariables + + HOME_DIR + /Users/xxx + APP_DIR + /Users/xxx/gethomepage/homepage + HOMEPAGE_ALLOWED_HOSTS + homepage.xxxx,localhost:3000 + + + ProgramArguments + + /bin/zsh + -c + -l + source $HOME_DIR/.zshrc; /Users/micah/xxx/bin/pnpm start + + WorkingDirectory + /Users/xxx/gethomepage/homepage + + StandardOutPath + /Users/xxx/homepage.micah.wiki.node.info.log + + StandardErrorPath + /Users/xxx/logs/homepage.micah.wiki.node.error.log + + + +``` + +### 4.4 加入到启动项目中 + +```shell +# 加入到启动项目 +launchctl load ~/Library/LaunchAgents/wiki.micah.homepage.plist +# 从启动项目删除 +launchctl unload ~/Library/LaunchAgents/wiki.micah.homepage.plist +``` + diff --git a/content/posts/1.Learning/A3.Reflections/DevOps/mac_use_system_localized.md b/content/posts/1.Learning/A3.Reflections/DevOps/mac_use_system_localized.md new file mode 100644 index 0000000..5a94905 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/DevOps/mac_use_system_localized.md @@ -0,0 +1,63 @@ +--- +title: "Mac电脑如何配置有格式的文件夹" +date: 2023-04-20T09:01:37+08:00 +tags: ["DevOps"] +categories: ["Learning", "Reflections"] +--- + +```shell +# 文件名命名 +1. 从下面json多语言化中选择一个Key作为文件夹名 +2. 在新建的文件夹名下,创建一个文件`touch .localized` + +# 下面的文件地址: `/System/Library/CoreServices/SystemFolderLocalizations/zh_CN.lproj` +# 现在是二进制的,需要转换为其他格式,命令如下: +plutil -convert json SystemFolderLocalizations.strings # 该命令需要有执行权限的地方,不如拷贝到download下 + +# 更改图标 +1. 右击查看“显示简介” +2. 命令行cd到`/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources` 然后输入 `open .` +3. 找到最喜欢的图标,然后`cmd+c`,在简介中的最上面图标点击后`cmd+v` + +``` + +```json +{ + "Saved Searches": "已存储的搜索", + "Relocated Items": "迁移的项目", + "Deleted Users": "已删除的用户", + "Favorites": "个人收藏", + "Public": "公共", + "Compositions": "Compositions", + "Groups": "群组", + "Documents": "文稿", + "Sites": "站点", + "Network": "网络", + "System": "系统", + "My Network": "我的网络", + "Shared Items": "共享的项目", + "My Applications": "我的应用程序", + "Movies": "影片", + "Mail Downloads": "邮件下载", + "Servers": "服务器", + "Server": "服务器", + "Pictures": "图片", + "Shared": "共享", + "Recovered files": "恢复的文件", + "Configuration": "配置", + "Utilities": "实用工具", + "Security": "安全性", + "Incompatible Software": "不兼容的软件", + "Desktop": "桌面", + "Music": "音乐", + "Faxes": "传真", + "Downloads": "下载", + "Users": "用户", + "Guest": "客人", + "Drop Box": "投件箱", + "Web Receipts": "网页收据", + "Library": "资源库", + "Local": "本地", + "Applications": "应用程序" +} +``` \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/DevOps/pic-app.md b/content/posts/1.Learning/A3.Reflections/DevOps/pic-app.md new file mode 100644 index 0000000..1fdf03f --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/DevOps/pic-app.md @@ -0,0 +1,364 @@ +--- +title: "图片服务整体架构" +date: 2022-06-09T15:09:21+08:00 +tags: ["CDN"] +categories: ["Learning", "Reflections"] +--- + +## 1.背景 + +面向海外用户设计图片类app的后端架构。 + +## 2. 目标 + +1. 考虑跨地区访问图片列表。 + +2. 图片容灾和备份服务。 + +3. 用户访问突增的解决方案。 + +4. 海外服务政策相关注意事项。 + +## 3. 方案(图片) + +ps:这里先统一考虑图片的设计过程,图片解决后,再考虑业务后台过程 + +### 3.1 自研 + +#### 方案设计 + +![v1.drawio](https://image.shijinping.cn/picgo/202206101026771.png) + +1. 分布式文件系统:采用开源系统进行搭建分布式文件系统 +2. 文件系统服务:可以新增图片时可以生成索引返回给业务,当业务只需要根据索引,就能查询到对应的文件内容 +3. 业务层:上传服务主要负责图片的上传、而列表服务则是需要根据请求,获取列表及数据 +4. 接入层:接收用户的请求,把请求代理到业务上 + +这么设计,可以实现一个图片类的应用。在实际中会有什么问题? + +1. 不同区域的用户,体验不一样,用户离部署的节点越近,用户体验更好 + +因为根据之前的经验,地域对于网络的延迟影响很大。大致从ping上就能体现 + +| 地区1 | 地区2 | ping时间 | +| ----- | ----- | -------- | +| 上海 | 广州 | 30ms | +| 上海 | 上海 | 10ms | +| 上海 | 美国 | 100ms | + +2. 从终端的成功率上看,由于网络上的丢包、延迟,成功率会低很多,特别是图片(目前图片1~3M都是比较正常的),这么大的图片,在过程中,发生丢包、延迟,失败率可想而知,会特别的高。 + +这种场景,我们可以考虑下,访问国外某些网站的时候,经常是失败,体验非常差 + +#### 改进点 + +那么需要怎么改进呢? + +比较容易想到的就是,既然是距离远,那么直接在对应的地方部署一个服务,不就行了么? + +![v2.1.drawio](https://image.shijinping.cn/picgo/202206101104619.png) + +这样各地的用户,通过dns的调度,访问对应的接入层,接入层只访问当前区域的服务(同一个区域),这样就减少了网络上的问题。解决了用户体验。但是,好像跟需求不是太耦合。。。需求是``跨区域访问``。 + +那么要怎么样实现跨区域访问呢? + +![v2.3.drawio](https://image.shijinping.cn/picgo/202206101109613.png) + +从图上可以看出来,如果底层数据实现了数据同步,那么是不是就可以了? + +比如亚洲用户发布内容,那么我们把数据同步给其他集群,这样其他集群就可以访问到亚洲用户的信息了 + +要怎么实现同步呢?目前了解到**``FastDFS``**可以实现分布式任务系统的,他是采用binlog进行同步,在log中有个标志位用户记录该条记录是``C: 增加 D: 删除 A: 添加 M: 修改 U: 更新整个文件 T: 截断文件`` 等,当亚洲区域进行添加时,会发送日志给美洲、欧洲,他们也会根据binlog的日志添加,这里需要注意:同步数据采用的标识与写入的是不一样的,采用小写,目的是为了区别是否需要同步给其他集群。 + +这里还没有对FastDFS跨区同步进行测试过,还不确定具体的延迟能够到达多少(有待验证)。 + +理论上,上面的方案是可以实现的,那么我们会有什么问题呢? + +1. 所有图片数据,都存在多份,每个数据都需要进行公网的同步。 +2. 文件传入与数据传输需要保证一致,不能有数据了,没有文件 + +那么我们有没有其他方案进行呢?下面我们来看下 + +![v2.4.drawio](https://image.shijinping.cn/picgo/202206101614227.png) + +对于图片,可以采用CDN加速。 + +对于API接口了解到市面上,有一种产品,叫做“全站加速”或者“动态加速”,也就是cdn不进行缓存,直接访问,这样的话,我们可以直接让用户访问,这样的话,所有数据都访问了中心区域的数据,通过“动态加速”把用户和源进行连接,核心是增加了数据传输的稳定性,降低失败率。 + +这种方式存在什么问题: + +1. 数据量问题: + + a) 扩容问题:这个也不算特别问题,是项目一般都会遇到 + + b) 冷热数据:如果统一的采用一套文件系统,那么会导致数据积累越来越多,文件系统会不停的扩大 + +3. 当然还有其他的一些需要考虑的点,比如高请求量下“文件内容缓存”、容灾备份等还没有详细讲 + +### 3.2 外部功能 + +既然自研中,考虑了外部功能,那么市面上是否有外部的功能,可以实现全球图片访问问题呢? + +答案是肯定的:CDN+文件系统,这个方案目前也是比较成熟。 + +![V3.drawio](https://image.shijinping.cn/picgo/202206101440291.png) + +该方案乍看一下,与自研的最早方案类似(主要关注左侧部分),都是全球直接接入“一层”,但实际上是不一样的: + +1. CDN会覆盖全球节点,当用户接入时,能够就近访问,通过CDN的内网,访问“文件系统” +2. 文件系统可以自研,也可以采用云产品。 + +#### 3.2.1 CDN + +用一个图来说明下 + +![V4-cdn.drawio](https://image.shijinping.cn/picgo/202206101455593.png) + +访问顺序:A -> B -> C -> D -> E + +A. 边缘节点A(无数据,回源)-> 中心节点A (无数据,回源)-> 源站 -> 中心节点A(缓存)-> 边缘节点A(缓存) + +B. 边缘节点A(有缓存,直接返回) + +C. 边缘节点B(无数据,回源)-> 中心节点A(有缓存,直接返回)-> 边缘节点B(缓存) + +D. 边缘节点C(无数据,回源)-> 中心节点B (无数据,回源)-> 源站 -> 中心节点B(缓存)-> 边缘节点C(缓存) + +E. 边缘节点D(无数据,回源)-> 中心节点B(有缓存,直接返回)-> 边缘节点D(缓存) + +所以第一次访问时,会比较慢,但是面向用户群体属于该区域,则大部分的体验,还是挺快的 + +#### 3.2.2 源站 + +目前各大云厂商,都提供了存储,并且针对与存储,并且容量没有限制 + +### 3.3 对比 + +那么,我们对两种方案价格进行对比下(初步对比,数据可能不准确): + +| | 价格 | 技术 | +| ------------- | ------------------------------------------------------------ | --------------------------------------------------------- | +| 自研+数据同步 | (机器500G(700元/月)+宽带10M(650元/月))* 2 =2700(元/月) | 1. 同步数据服务
2. 文件系统服务
3. 冷热数据分离服务 | +| 自研+CDN分发 | 机器500G(700元/月)+宽带10M(650元/月)+CDN2T(900元/月)=2150(元/月) | 1. 文件系统服务
2. 冷热数据分离服务 | +| 云厂商 | Bucket500G(200元/月)+回源流量1T(300元/月)+CDN2T(900元/月)=1400(元/月) | 无 | + +### 3.4 选型 + +他们的**``优势``**分别是什么呢? + +| | 自研+数据同步 | 自研+CDN分发 | 云厂商 | +| :------------- | ---------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 价格 | 高 | 中 | 低 | +| 突发流量(发) | 自主扩容 | 自主扩容 | 自动 | +| 突发流量(查) | 提升带宽、降级 | 自动 | 自动 | +| 访问速度 | 依赖于同步数据时间 | 首次依赖于回源速度,后面速度较快 | 首次依赖于回源速度,后面速度较快 | +| 是否支持容灾 | 多地备份 | 无 | 无 | +| 容灾备份成本 | 已经实现 | 1. 需要把文件系统全量同步到不同的区域,来实现容灾,整体成本,存储量 * 2
2. 需要实现文件同步服务代码 | bucket异地备份,存储成本*2,(2M以下的内容,一般分钟级别的延迟) | +| 冷热数据处理 | 需要开发冷热数据分离(大致方案在最下面问题中) | 需要开发冷热数据分离 | 已提供设置 | +| 负载均衡 | 自主控制 | 自动 | 自动 | + +从上面的对比得出: + +1. 初期项目+公司内没有对应的技术栈 + + 选择**``云厂商``** + +2. 公司已经有成熟的技术栈 + + 选择**``自研+CDN分发``** + +3. 公司在全球的节点部署比较成熟,并且有相应的稳定网络 + + 选择**``全部自研``** + +## 4. 后台 + +从图片的架构选型过程,对于后台的架构选型可以有两种 + +### 4.1 方案 + +#### 4.1.1 全球加速访问同一个区域 + +![V4.1.drawio](https://image.shijinping.cn/picgo/202206101644750.png) + +该方案整体上没有特别的点,主要是采用了``全球加速``来提升访问服务的稳定性,当访问用户离服务区域远,延迟会比较高 + +#### 4.1.2 多区域提供服务 + +![V4.2.drawio](https://image.shijinping.cn/picgo/202206101922413.png) + +这里的核心问题,其实就是数据如何同步。 + +接下来就对这块进行拆解 + + + +问1:**如果能够控制一个人,都是在同一个区域,那么是不是就会简单很多呢?** + +答案是肯定的。如果一个人只是在同一个区域操作,那么只需要把这个人的数据直接同步到其他区域即可。 + +所以就需要在人身上,打上对应的标记,那么怎么标记?(在我的概念中,95%的人在一个相对的时间段内,都是在同一个地方。具体哪里看到,有点忘记了) + +答1:**我们把用户注册,当作该用户所在的区域** + +这样做,我们基本上可以让95%的用户能够就近访问。那么还有5%的人怎么办的?这个问题后面再讲。 + + + +问2:各个区域,要如何实现同步呢? + +答2:可以同步的有多个地方: + +存储:直接使用存储自带的,比如MySQL、Redis都有自己的复制思路 + +业务:用中间件方式,比如kafka这种,多区域采用不同的消费者,来实现数据同步 + +存储同步,相对技术比较成熟,可以直接使用,可能出现的问题: + +1. A->B->A这种情况 +2. 如果我关系链同步到了,但是元数据还未同步,这个情况怎么办? + +业务同步,由于本身是业务触发,所以对于业务上来说,所以可以解决存储同步的问题 + +1. 当A发起同步B时,B接受到同步,则不用发起再像A的同步 +2. 可以先同步用户信息变更、再同步元数据变更、最后同步关系链 + +当然同步也会存在一些共性问题: + +1. 网络问题:这个目前来说,我了解的主要有两种: + + a)打专线,让各个区域的网络联通起来。 + + b)利用云厂商的内部网络,在他们的基础上进行处理 + + 这两个办法,都是增加网络的稳定性,来减少丢包重传这种情况 + +2. 数据延迟:比如分钟内的延迟 + + 延迟本身受区域距离、业务复杂度的影响,当前需求的场景下,我觉得如果能够达到这样的延迟,也是可以接受的。 + + + +问3: 是否需要全部区域进行复制? + +答3: 这个我觉得可以优化 + +当一个用户所有的订阅者,所属的区域是同一个区域,那么分发到其他区域,是没有意义的。因为其他区域不会找你的信息(没有关系链找到该用户),除非通过搜索这种,对于这种跨区需求,频率非常少,当本地不存在该信息时,可以远程拉取(可能首次出现了没有内容),但是如果存在了订阅该用户,则该用户就会往该区域同步信息。 + + + +问4: 上面提到的,假设用户归属是新加坡,但是去欧洲出差半年,那么该用户每次都会需要从接入层转发到另外区域去获取数据么?(图上接入层的虚线部分) + +答4: 答案是否定的。如果每次都要从另外区域去拉取,那么这部分用户基本上体验会很差,为了改善这个问题,用户上是可以挂在**``交集属性``** 就是说,本来用户属于区域A,但是这个时候用户挂在了交集属性“区域B”,那么,在后续有关注的用户有操作,也会同步到该区域。 + + + +问5:如果数据修改顺序是A->B->C,但是同步后,到区域B的数据为A->C->B 那么数据就会造成不一致吧? + +答5: 该问题也比较容易解决,可以在数据上增加版本好,同步后,用版本号大的覆盖版本号小的 + +#### 4.2 选型 + +做一个简单的对比 + +| | 方案1 | 方案2 | +| -------- | ---------------------------- | ---------------------------------- | +| 技术 | 简单,只考虑单区域即可 | 方案复杂 | +| 容灾方案 | 单区域多AZ | 多区域多AZ | +| 突发流量 | 扩机器(设计上服务无状态) | 突发集群扩机器(设计上服务无状态) | +| 体验 | 非服务所在区域,访问会有延迟 | 相对于1,服务会更好 | + +那么该选哪个方案呢? + +这个还是跟实际场景有关系 + +方案1:刚开始推广,能够覆盖大部分的用户。 + +方案2:产品相对比较成熟,用户在全球范围内,都有比较大的一个占比,团队也有一定的规模。或者在现有一个比较大群体下,新增的一个业务 + + + +## 5 接口设计 + +#### 5.1 发布 + +![流程图.drawio](https://image.shijinping.cn/picgo/202206091537135.png) + +接口定义 + +```java +PublishRsp publish(long uid, PublishReq post); +``` + +注: 图片基于CDN的分发,用户上传后,给后台的只是一个URI地址。 + +#### 5.2 订阅列表 + +![订阅查看.drawio](https://image.shijinping.cn/picgo/202206091641054.png) + +接口定义 + +```java +// 获取用户自己的时间线 +TimelineRsp get(long uid, TimelineReq req); + +// 获取某个用户(target)的时间线(这里会有两种情况,一个是target本人获取,一个是其他用户查看target的时间线,主要权限区别) +TimelineRsp getOneUser(long uid, long target, TimelineReq req); +``` + +## 6. 关于海外政策相关 + +1. 预设标签分类,对于每个图片进行分类打标,不同的政策可以根据不同的标签进行过滤 + +2. 对于访问的图片(服务端吐出去的图片地址),可以进行异步检测。这种场景适用于: + + a)为了弥补预设标签后,又增加了某些标签,历史数据特别大,如果全量扫,可能需要几个月。 + + b)临时性的政策,比如国家突然规定封杀某个信息。 + +## 7. 问题 + +1. 如果一个用户,被很多人关注,应该分发模式会导致服务压力过大 + + 如果这种情况,其实不适合写扩散,因为量大容易引起服务异常,所以在这种情况下,就需要推拉结合的模式 + +2. 关于对发表后的内容操作(如评论)如何同步 + + 这块的操作,大体上应该和内容分发类似,但是细节可能不一样,因为这里存在多地写的情况,可以考虑因果关系,全量评论同步。当然同步后,需要做到去重复。(这里相对复杂点) + +3. 如何预防黑产利用漏洞,盗用流量资源 + + a) 对上传资源的监控,通过回掉来确认资源是否被使用 + + b) 对资源进行加密,CDN侧增加鉴权,鉴权不通过,则直接拒绝 + +4. 冷热数据分离 + + 根据日期进行分离,可以分成1天、7天、30天、半年、一年以上的数据进行统计,根据占比和访问请求,来规划冷热数据分离,冷数据可以采用更低的资源进行存储,减少成本 + + + + + +## 其他资料 + +海外服务政策相关注意事项 + +​ a) 采集信息:IP信息及地区信息(为了让用户更快速的访问) + +​ b) 用户内容:昵称等(用户之间的必要通信信息) + +​ c) 日志数据:订阅关系、元数据、访问日期、时间戳等(确保安全的提供服务) + + + +各个区域公网的ping延迟 + +美国西部 1 (硅谷) + +![image-20220610005713371](https://image.shijinping.cn/picgo/202206100057426.png) + +美国东部 1 (弗吉尼亚) + +![image-20220610005808192](https://image.shijinping.cn/picgo/202206100058236.png) + diff --git a/content/posts/1.Learning/A3.Reflections/DevOps/ubuntu_init.md b/content/posts/1.Learning/A3.Reflections/DevOps/ubuntu_init.md new file mode 100644 index 0000000..e1ca1d3 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/DevOps/ubuntu_init.md @@ -0,0 +1,24 @@ +--- +title: "Ubuntu服务器初始化" +date: 2023-09-30T18:21:47+08:00 +tags: ["ubuntu"] +categories: ["Learning", "Reflections"] +--- + +# 初始化需要的步骤 + +## 1. 更新 + +```shell +sudo apt upgrade +``` + +## 2. 安装软件 + +```shell +sudo apt-get install nginx +# 修改启动用户为root +vi /etc/nginx/nginx.conf # 第一行 +# user root; +``` + diff --git a/content/posts/1.Learning/A3.Reflections/Golang/BaseTech.md b/content/posts/1.Learning/A3.Reflections/Golang/BaseTech.md new file mode 100644 index 0000000..e8157a8 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Golang/BaseTech.md @@ -0,0 +1,11 @@ +--- +title: "基础知识" +date: 2023-02-01T14:26:42+08:00 +tags: ["Golang"] +categories: ["Learning", "StudyNotes"] +--- + +1. 数组与切片 +2. 范型 +3. String.Builder + diff --git a/content/posts/1.Learning/A3.Reflections/Golang/DesignPattern.md b/content/posts/1.Learning/A3.Reflections/Golang/DesignPattern.md new file mode 100644 index 0000000..ec2b692 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Golang/DesignPattern.md @@ -0,0 +1,28 @@ +--- +title: "设计模式" +date: 2023-02-01T14:26:42+08:00 +tags: ["Golang"] +categories: ["Learning", "StudyNotes"] +--- + +## 1. 单一职责 + +类的职责单一,对外只提供一个功能,而引起类变化的原因都应该只有一个。 + + + +## 2. 开闭 + +类的改动是通过增加代码进行的,而不是修改源代码。 + + + +## 3. 里氏代换原则 + +任何抽象类出现的地方都可以用他的实现类替换,实际就是虚拟机制,语言级别实现面向对象功能。 + + + +## 4. 依赖倒转原则 + +依赖于抽象接口,不要依赖具体的实现类,也就是针对接口编程。 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Golang/GoRPCBase.md b/content/posts/1.Learning/A3.Reflections/Golang/GoRPCBase.md new file mode 100644 index 0000000..8770d03 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Golang/GoRPCBase.md @@ -0,0 +1,226 @@ +--- +title: "Go RPC相关及基础信息" +date: 2023-09-15T14:26:42+08:00 +tags: ["Golang"] +categories: ["Learning", "StudyNotes"] + +--- + +## Go 的RPC 相关的基础信息 + +## 1. 环境配置(MacOS) + +### 1.1 protoc 安装 + +```bash +# 1. brew 安装 +brew search protobuf +brew install protobuf # 可以指定版本protobuf@21 + +# 验证是否安装成功 +protoc --version + +# 2. 源码安装 +https://github.com/protocolbuffers/protobuf/releases #下载对应的版本,放入GOPATH中的bin目录下 +``` + +### 1.2 protoc-gen-go 安装 + +```bash +go install google.golang.org/protobuf/cmd/protoc-gen-go@latest +# 安装过程中会出现无法下载,需要自行“走强” + +# 验证 +protoc-gen-go help +# protoc-gen-go: unknown argument "help" (this program should be run by protoc, not directly) +# ps:我觉得只要识别到,就应该安装成功了 +``` + +### 1.3 protoc-gen-go-grpc 安装 + +```bash +go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest +# 同 protoc-gen-go + +# 验证 +protoc-gen-go-grpc -version +# protoc-gen-go-grpc 1.3.0 +``` + +## 2. Proto转成桩代码 + +### 2.1 proto 生成 + +> 参考地址:https://protobuf.dev/ + +```protobuf +syntax = "proto3"; +import public "google/protobuf/timestamp.proto"; + +option go_package = "./news"; +option java_multiple_files = true; +option java_package = "wiki.micah.news"; +option java_outer_classname = "News"; + +package news; + +message News { + int64 id = 1; + + string title = 2; + + string keyword = 3; + + string desc = 4; + + google.protobuf.Timestamp happen_time = 5; + + int32 state = 6; + + google.protobuf.Timestamp create_time = 7; + + google.protobuf.Timestamp update_time = 8; +} + +message NewsRequest { + string name = 1; +} + +message NewsResponse { + repeated News news_list = 1; +} + +service SearchService { + rpc Search (NewsRequest) returns (NewsResponse); +} +``` + +### 2.2 git 仓库打分支 + +```bash +# 打tag +git tag -a v0.1.0-alpha -m "预发布" +# 推送tag到目标上 +git push origin v0.1.0-alpha +``` + +## 3. 程序编写 + +### 3.1 go.mod编写 + +```go +require ( + github.com/supermicah/Protobufs v0.1.2-alpha + google.golang.org/grpc v1.58.1 +) +``` + +### 3.2 client 编写 + +根据grpc的helloworld进行编写 + +```go +package main + +import ( + "context" + "flag" + "log" + "time" + + pb "github.com/supermicah/Protobufs/news/micah/wiki/news" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +const ( + defaultName = "world" +) + +var ( + addr = flag.String("addr", "localhost:50051", "the address to connect to") +) + +func main() { + flag.Parse() + // Set up a connection to the server. + conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + log.Fatalf("did not connect: %v", err) + } + defer func() { _ = conn.Close() }() + c := pb.NewSearchServiceClient(conn) + + // Contact the server and print out its response. + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + r, err := c.Search(ctx, &pb.NewsRequest{Name: "你好"}) + if err != nil { + log.Fatalf("could not greet: %v", err) + } + log.Printf("NewsList: %s", r) +} + +``` + +### 3.3 server编写 + +```go +package main + +import ( + "context" + "flag" + "fmt" + "google.golang.org/protobuf/types/known/timestamppb" + "log" + "net" + + pb "github.com/supermicah/Protobufs/news/micah/wiki/news" + "google.golang.org/grpc" +) + +var ( + port = flag.Int("port", 50051, "The server port") +) + +// server is used to implement helloworld.GreeterServer. +type server struct { + pb.UnimplementedSearchServiceServer +} + +// Search implements helloworld.GreeterServer +func (s *server) Search(ctx context.Context, in *pb.NewsRequest) (*pb.NewsResponse, error) { + log.Printf("Received: %v", in.GetName()) + newsList := make([]*pb.News, 0) + newsList = append(newsList, &pb.News{ + Id: 1, + Title: "test", + Keyword: "test", + Desc: "test", + HappenTime: ×tamppb.Timestamp{Seconds: 1, Nanos: 1}, + State: 0, + CreateTime: ×tamppb.Timestamp{Seconds: 2, Nanos: 2}, + UpdateTime: ×tamppb.Timestamp{Seconds: 3, Nanos: 3}, + }) + return &pb.NewsResponse{NewsList: newsList}, nil +} + +func main() { + flag.Parse() + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + s := grpc.NewServer() + pb.RegisterSearchServiceServer(s, &server{}) + log.Printf("server listening at %v", lis.Addr()) + if err := s.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} +``` + +### 3.4 整体项目结构 + +![image-20230915214227611](https://image.shijinping.cn/picgo/202309152142382.png) diff --git a/content/posts/1.Learning/A3.Reflections/Golang/_index.md b/content/posts/1.Learning/A3.Reflections/Golang/_index.md new file mode 100644 index 0000000..3efdbc9 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Golang/_index.md @@ -0,0 +1,8 @@ +--- +title: "Golang" +date: 2022-05-20T20:27:49+08:00 +tags: ["Golang"] +categories: ["Learning", "Reflections"] +--- + +Golang 相关 diff --git a/content/posts/1.Learning/A3.Reflections/Java/_index.md b/content/posts/1.Learning/A3.Reflections/Java/_index.md new file mode 100644 index 0000000..6cd3b78 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/_index.md @@ -0,0 +1,8 @@ +--- +title: "Java" +date: 2023-04-15T16:14:19+08:00 +tags: ["Java"] +categories: ["Learning", "Reflections"] +--- + +Java相关 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Java/java-atomic.md b/content/posts/1.Learning/A3.Reflections/Java/java-atomic.md new file mode 100644 index 0000000..0da72aa --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/java-atomic.md @@ -0,0 +1,58 @@ +--- +title: "JavaAtomic工具类" +date: 2023-08-25T22:21:01+08:00 +tags: ["java"] +categories: ["Learning", "Reflections"] + +--- + +# Atomic*工具类 + +## AtomicBoolean + +### 1. 成员变量 + +```java +// 对应的类中的成员变量句柄 +private static final VarHandle VALUE; +// 存储变量的值 +private volatile int value; +``` + +### 2. 核心 + +set时使用句柄(VarHandle)来进行设置value,获取时使用value进行获取 + +## AtomicInteger + +### 1. 成员变量 + +```java +private static final Unsafe U = Unsafe.getUnsafe(); +private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value"); +private volatile int value; +``` + +### 2.核心 + +与Boolean类似 + +## AtomicLong + +### 1. 成员变量 + +```java + +``` + +# Atomic*Array工具类 + +## AtomicIntegerArray + +### 1. 成员变量 + +```java +private static final VarHandle AA = MethodHandles.arrayElementVarHandle(int[].class); +private final int[] array; +``` + diff --git a/content/posts/1.Learning/A3.Reflections/Java/java-jmm.md b/content/posts/1.Learning/A3.Reflections/Java/java-jmm.md new file mode 100644 index 0000000..e873429 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/java-jmm.md @@ -0,0 +1,28 @@ +--- +title: "Java内存模型" +date: 2022-06-02T10:21:01+08:00 +tags: ["java"] +categories: ["Learning", "Reflections"] +--- + +# Java内存模型(JMM) + +## 概念 + +> Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 +> +> Java内存模型(不仅仅是JVM内存分区):调用栈和本地变量存放在线程栈上,对象存放在堆上。 + +## 堆栈存放规则 +![JMM-ae7349b6](https://image.shijinping.cn/picgo/202206021021081.jpg) + +1. 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。 +2. 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。 +3. 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上。 +4. 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。 +5. 静态成员变量跟随着类定义一起也存放在堆上。 +6. 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个成员变量的私有拷贝。 + + +## 资料地址 +1. [EnjoyMoving](https://zhuanlan.zhihu.com/p/29881777) \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Java/java-thread.md b/content/posts/1.Learning/A3.Reflections/Java/java-thread.md new file mode 100644 index 0000000..be7054e --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/java-thread.md @@ -0,0 +1,123 @@ +--- +title: "Java线程" +date: 2022-06-02T10:22:45+08:00 +tags: ["java"] +categories: ["Learning", "Reflections"] +--- + +# 线程 + +## 概念 +1. Java线程是什么 +> Java的线程,是运行在JVM的程序上的基本执行单元, Java针对线程抽象出Thread对象的概念。 + +2. Java线程分类 +> Thread分为守护线程和非守护线程,当JVM启动时,伴随一个非守护线程的运行,我们称之为主线程/main函数,当JVM所有的非守护线程都销毁时,JVM实例也会销毁; + +3. Java线程生命周期 +> Java线程包含6个状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED + +4. 多线程优缺点 +> JVM支持多线程,正确使用多线程能大大提高程序的服务能力,同时也引入程序的复杂度和线程安全问题(不正确使用)。 + +## 状态`Thread.State` +> 一个线程在指定的时刻上,只能存在一个状态;JVM的线程状态和操作系统的线程状态不是一一对应的。了解线程状态可用于分析线程问题/监控,不建议通过判断线程状态来进行逻辑处理 + +![Thread-20b08934](https://image.shijinping.cn/picgo/202206021024473.png) + +* `NEW` (新建) +> 一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.) + +尚未启动的线程处于这一状态,即尚未调用start() +```Java +Theard t = new Theard(); +``` + +* `RUNNABLE` (可运行) +> 一个正在 Java 虚拟机中执行的线程处于这一状态。(A thread executing in the Java virtual machine is in this state.) + +JVM中可执行的线程处于这一状态 +```Java +Theard t = new Theard(); +t.start(); +``` + +* `BLOCKED` (阻塞) +> 一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state.) + +线程等待监视器锁时处于这一状态,如 synchronized,通俗理解:当因为获取不到锁而无法进入同步块时,线程处于 BLOCKED 状态。 + +* `WAITING` (等待) +> 一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态。(A thread that is waiting indefinitely for another thread to perform a particular action is in this state.) + +正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态,如 `Object.wait()`、`Thread.join()`、`LockSupport.park()`。特别动作分别为:`notify/notifyAll`、线程完结、、`LockSupport.unpark()` + +* `TIMED_WAITING` (计时等待) +> 一个正在限时等待另一个线程执行一个动作的线程处于这一状态。(A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.) + +限时等待另一个线程执行一个动作的线程处于这一状态,如:`Thread.sleep(long millis)`、`Object.wait(long millis`,`Object.wait(long millis)`、`Thread.join(long millis)`、`LockSupport.parkNanos(Object blocker, long nanos) `、 `LockSupport.parkUntil(Object blocker, long nanos)` + +* `TERMINATED` (终止) +> 一个已经退出的线程处于这一状态。(A thread that has exited is in this state.) + +已经退出的线程处于这一状态 + +## 方法 +* 常用新建线程 + +```Java +// 1. 默认新建 +Thread t1 = new Thread(); + +// 2. 传入runnable方法 +Thread t2 = new Thread(new Runnable() { + public void run() { + synchronized (xxx) { + // todo + } + } +}); + +// 3. 传入默认名称 +Thread t3 = new Thread("thread-name"); + +// 还有些是其他方法,详细Thread类 + +``` + +* 线程开始 + +```Java +/** + * Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. + */ +start(); +``` +该方法代码实现是调用 `start0();` 方法,但实际上是调用Thread中的 `run()` 方法; + +* 退出(内部方法) + +```Java +/** + * This method is called by the system to give a Thread + * a chance to clean up before it actually exits. + */ +exit(); +``` + +```Java +/** + * 只是在当前线程中打了一个停止的标记,并不是直接将线程停止 + */ +interrupt(); +``` + + + + +## 其他 +线程优先级别 + + +## 资料索引 +1. [国栋的osChina](https://my.oschina.net/goldenshaw?tab=newest&catalogId=3277710) \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Java/spring-security.md b/content/posts/1.Learning/A3.Reflections/Java/spring-security.md new file mode 100644 index 0000000..2a7ea98 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/spring-security.md @@ -0,0 +1,2214 @@ +--- +title: "SpringSecurity" +date: 2023-10-08T11:02:46+08:00 +tags: ["java"] +categories: ["Learning", "Reflections"] +--- + +# SpringSecurity从入门到精通 + +## 课程介绍 + +本课件由[三更草堂](https://www.bilibili.com/video/BV1mm4y1X7Hc/?p=41&spm_id_from=pageDriver&vd_source=067df4c4078ab51487a2fc9a2d763ceb)录制, 如果侵权,请联系micah.shi@gmail.com + +![image-20211219121555979](https://image.shijinping.cn/picgo/202310081104919.png) + +## 0. 简介 + +​ **Spring Security** 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架**Shiro**,它提供了更丰富的功能,社区资源也比Shiro丰富。 + +​ 一般来说中大型的项目都是使用**SpringSecurity** 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。 + +​ 一般Web应用的需要进行**认证**和**授权**。 + +​ **认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户** + +​ **授权:经过认证后判断当前用户是否有权限进行某个操作** + +​ 而认证和授权也是SpringSecurity作为安全框架的核心功能。 + + + +## 1. 快速入门 + +### 1.1 准备工作 + +​ 我们先要搭建一个简单的SpringBoot工程 + +① 设置父工程 添加依赖 + +~~~~xml + + org.springframework.boot + spring-boot-starter-parent + 2.5.0 + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + +~~~~ + +② 创建启动类 + +~~~~java +@SpringBootApplication +public class SecurityApplication { + + public static void main(String[] args) { + SpringApplication.run(SecurityApplication.class,args); + } +} + +~~~~ + +③ 创建Controller + +~~~~java +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/hello") + public String hello(){ + return "hello"; + } +} + +~~~~ + + + +### 1.2 引入SpringSecurity + +​ 在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例。 + +~~~~xml + + org.springframework.boot + spring-boot-starter-security + +~~~~ + +​ 引入依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认登陆页面,默认用户名是user,密码会输出在控制台。 + +​ 必须登陆之后才能对接口进行访问。 + + + +## 2. 认证 + +### 2.1 登陆校验流程 + +![image-20211215094003288](https://image.shijinping.cn/picgo/202310081105451.png) + +### 2.2 原理初探 + +​ 想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。 + + + +#### 2.2.1 SpringSecurity完整流程 + +​ SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 + +![image-20211214144425527](https://image.shijinping.cn/picgo/202310081105223.png) + +​ 图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。 + +**UsernamePasswordAuthenticationFilter**:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。 + +**ExceptionTranslationFilter:**处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。 + +**FilterSecurityInterceptor:**负责权限校验的过滤器。 + +​ + +​ 我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 + +![image-20211214145824903](https://image.shijinping.cn/picgo/202310081105245.png) + + + + + +#### 2.2.2 认证流程详解 + +![image-20211214151515385](https://image.shijinping.cn/picgo/202310081105285.png) + +概念速查: + +Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。 + +AuthenticationManager接口:定义了认证Authentication的方法 + +UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。 + +UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。 + + + + + +### 2.3 解决问题 + +#### 2.3.1 思路分析 + +登录 + +​ ①自定义登录接口 + +​ 调用ProviderManager的方法进行认证 如果认证通过生成jwt + +​ 把用户信息存入redis中 + +​ ②自定义UserDetailsService + +​ 在这个实现类中去查询数据库 + +校验: + +​ ①定义Jwt认证过滤器 + +​ 获取token + +​ 解析token获取其中的userid + +​ 从redis中获取用户信息 + +​ 存入SecurityContextHolder + +#### 2.3.2 准备工作 + +①添加依赖 + +~~~~xml + + + org.springframework.boot + spring-boot-starter-data-redis + + + + com.alibaba + fastjson + 1.2.33 + + + + io.jsonwebtoken + jjwt + 0.9.0 + +~~~~ + +② 添加Redis相关配置 + +~~~~java +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson.parser.ParserConfig; +import org.springframework.util.Assert; +import java.nio.charset.Charset; + +/** + * Redis使用FastJson序列化 + * + * @author sg + */ +public class FastJsonRedisSerializer implements RedisSerializer +{ + + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + static + { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } + + public FastJsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz); + } + + + protected JavaType getJavaType(Class clazz) + { + return TypeFactory.defaultInstance().constructType(clazz); + } +} +~~~~ + +~~~~java +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } +} +~~~~ + +③ 响应类 + +~~~~java +import com.fasterxml.jackson.annotation.JsonInclude; + +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ResponseResult { + /** + * 状态码 + */ + private Integer code; + /** + * 提示信息,如果有错误时,前端可以获取该字段进行提示 + */ + private String msg; + /** + * 查询到的结果数据, + */ + private T data; + + public ResponseResult(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public ResponseResult(Integer code, T data) { + this.code = code; + this.data = data; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public ResponseResult(Integer code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } +} +~~~~ + +④工具类 + +~~~~java +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +/** + * JWT工具类 + */ +public class JwtUtil { + + //有效期为 + public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000 一个小时 + //设置秘钥明文 + public static final String JWT_KEY = "sangeng"; + + public static String getUUID(){ + String token = UUID.randomUUID().toString().replaceAll("-", ""); + return token; + } + + /** + * 生成jtw + * @param subject token中要存放的数据(json格式) + * @return + */ + public static String createJWT(String subject) { + JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间 + return builder.compact(); + } + + /** + * 生成jtw + * @param subject token中要存放的数据(json格式) + * @param ttlMillis token超时时间 + * @return + */ + public static String createJWT(String subject, Long ttlMillis) { + JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间 + return builder.compact(); + } + + private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) { + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + SecretKey secretKey = generalKey(); + long nowMillis = System.currentTimeMillis(); + Date now = new Date(nowMillis); + if(ttlMillis==null){ + ttlMillis=JwtUtil.JWT_TTL; + } + long expMillis = nowMillis + ttlMillis; + Date expDate = new Date(expMillis); + return Jwts.builder() + .setId(uuid) //唯一的ID + .setSubject(subject) // 主题 可以是JSON数据 + .setIssuer("sg") // 签发者 + .setIssuedAt(now) // 签发时间 + .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥 + .setExpiration(expDate); + } + + /** + * 创建token + * @param id + * @param subject + * @param ttlMillis + * @return + */ + public static String createJWT(String id, String subject, Long ttlMillis) { + JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间 + return builder.compact(); + } + + public static void main(String[] args) throws Exception { + String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJjYWM2ZDVhZi1mNjVlLTQ0MDAtYjcxMi0zYWEwOGIyOTIwYjQiLCJzdWIiOiJzZyIsImlzcyI6InNnIiwiaWF0IjoxNjM4MTA2NzEyLCJleHAiOjE2MzgxMTAzMTJ9.JVsSbkP94wuczb4QryQbAke3ysBDIL5ou8fWsbt_ebg"; + Claims claims = parseJWT(token); + System.out.println(claims); + } + + /** + * 生成加密后的秘钥 secretKey + * @return + */ + public static SecretKey generalKey() { + byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY); + SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); + return key; + } + + /** + * 解析 + * + * @param jwt + * @return + * @throws Exception + */ + public static Claims parseJWT(String jwt) throws Exception { + SecretKey secretKey = generalKey(); + return Jwts.parser() + .setSigningKey(secretKey) + .parseClaimsJws(jwt) + .getBody(); + } + + +} +~~~~ + +~~~~java +import java.util.*; +import java.util.concurrent.TimeUnit; + +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public long deleteObject(final Collection collection) + { + return redisTemplate.delete(collection); + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 删除Hash中的数据 + * + * @param key + * @param hkey + */ + public void delCacheMapValue(final String key, final String hkey) + { + HashOperations hashOperations = redisTemplate.opsForHash(); + hashOperations.delete(key, hkey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} +~~~~ + +~~~~java +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class WebUtils +{ + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + return null; + } +} +~~~~ + +⑤实体类 + +~~~~java +import java.io.Serializable; +import java.util.Date; + + +/** + * 用户表(User)实体类 + * + * @author 三更 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User implements Serializable { + private static final long serialVersionUID = -40356785423868312L; + + /** + * 主键 + */ + private Long id; + /** + * 用户名 + */ + private String userName; + /** + * 昵称 + */ + private String nickName; + /** + * 密码 + */ + private String password; + /** + * 账号状态(0正常 1停用) + */ + private String status; + /** + * 邮箱 + */ + private String email; + /** + * 手机号 + */ + private String phonenumber; + /** + * 用户性别(0男,1女,2未知) + */ + private String sex; + /** + * 头像 + */ + private String avatar; + /** + * 用户类型(0管理员,1普通用户) + */ + private String userType; + /** + * 创建人的用户id + */ + private Long createBy; + /** + * 创建时间 + */ + private Date createTime; + /** + * 更新人 + */ + private Long updateBy; + /** + * 更新时间 + */ + private Date updateTime; + /** + * 删除标志(0代表未删除,1代表已删除) + */ + private Integer delFlag; +} +~~~~ + + + +#### 2.3.3 实现 + +##### 2.3.3.1 数据库校验用户 + +​ 从之前的分析我们可以知道,我们可以自定义一个UserDetailsService,让SpringSecurity使用我们的UserDetailsService。我们自己的UserDetailsService可以从数据库中查询用户名和密码。 + +###### 准备工作 + +​ 我们先创建一个用户表, 建表语句如下: + +~~~~mysql +CREATE TABLE `sys_user` ( + `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_name` VARCHAR(64) NOT NULL DEFAULT 'NULL' COMMENT '用户名', + `nick_name` VARCHAR(64) NOT NULL DEFAULT 'NULL' COMMENT '昵称', + `password` VARCHAR(64) NOT NULL DEFAULT 'NULL' COMMENT '密码', + `status` CHAR(1) DEFAULT '0' COMMENT '账号状态(0正常 1停用)', + `email` VARCHAR(64) DEFAULT NULL COMMENT '邮箱', + `phonenumber` VARCHAR(32) DEFAULT NULL COMMENT '手机号', + `sex` CHAR(1) DEFAULT NULL COMMENT '用户性别(0男,1女,2未知)', + `avatar` VARCHAR(128) DEFAULT NULL COMMENT '头像', + `user_type` CHAR(1) NOT NULL DEFAULT '1' COMMENT '用户类型(0管理员,1普通用户)', + `create_by` BIGINT(20) DEFAULT NULL COMMENT '创建人的用户id', + `create_time` DATETIME DEFAULT NULL COMMENT '创建时间', + `update_by` BIGINT(20) DEFAULT NULL COMMENT '更新人', + `update_time` DATETIME DEFAULT NULL COMMENT '更新时间', + `del_flag` INT(11) DEFAULT '0' COMMENT '删除标志(0代表未删除,1代表已删除)', + PRIMARY KEY (`id`) +) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户表' +~~~~ + +​ 引入MybatisPuls和mysql驱动的依赖 + +~~~~xml + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + mysql + mysql-connector-java + +~~~~ + +​ 配置数据库信息 + +~~~~yml +spring: + datasource: + url: jdbc:mysql://localhost:3306/sg_security?characterEncoding=utf-8&serverTimezone=UTC + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver +~~~~ + +​ 定义Mapper接口 + +~~~~java +public interface UserMapper extends BaseMapper { +} +~~~~ + +​ 修改User实体类 + +~~~~java +类名上加@TableName(value = "sys_user") ,id字段上加 @TableId +~~~~ + +​ 配置Mapper扫描 + +~~~~java +@SpringBootApplication +@MapperScan("com.sangeng.mapper") +public class SimpleSecurityApplication { + public static void main(String[] args) { + ConfigurableApplicationContext run = SpringApplication.run(SimpleSecurityApplication.class); + System.out.println(run); + } +} +~~~~ + +​ 添加junit依赖 + +~~~~java + + org.springframework.boot + spring-boot-starter-test + +~~~~ + +​ 测试MP是否能正常使用 + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@SpringBootTest +public class MapperTest { + + @Autowired + private UserMapper userMapper; + + @Test + public void testUserMapper(){ + List users = userMapper.selectList(null); + System.out.println(users); + } +} +~~~~ + + + +###### 核心代码实现 + +创建一个类实现UserDetailsService接口,重写其中的方法。更加用户名从数据库中查询用户信息 + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserMapper userMapper; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + //根据用户名查询用户信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserName,username); + User user = userMapper.selectOne(wrapper); + //如果查询不到数据就通过抛出异常来给出提示 + if(Objects.isNull(user)){ + throw new RuntimeException("用户名或密码错误"); + } + //TODO 根据用户查询权限信息 添加到LoginUser中 + + //封装成UserDetails对象返回 + return new LoginUser(user); + } +} +~~~~ + +因为UserDetailsService方法的返回值是UserDetails类型,所以需要定义一个类,实现该接口,把用户信息封装在其中。 + +```java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginUser implements UserDetails { + + private User user; + + + @Override + public Collection getAuthorities() { + return null; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUserName(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} +``` + +注意:如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密码前加{noop}。例如 + +![image-20211216123945882](https://image.shijinping.cn/picgo/202310081105018.png) + +这样登陆的时候就可以用sg作为用户名,1234作为密码来登陆了。 + + + +##### 2.3.3.2 密码加密存储 + +​ 实际项目中我们不会把密码明文存储在数据库中。 + +​ 默认使用的PasswordEncoder要求数据库中的密码格式为:{id}password 。它会根据id去判断密码的加密方式。但是我们一般不会采用这种方式。所以就需要替换PasswordEncoder。 + +​ 我们一般使用SpringSecurity为我们提供的BCryptPasswordEncoder。 + +​ 我们只需要使用把BCryptPasswordEncoder对象注入Spring容器中,SpringSecurity就会使用该PasswordEncoder来进行密码校验。 + +​ 我们可以定义一个SpringSecurity的配置类,SpringSecurity要求这个配置类要继承WebSecurityConfigurerAdapter。 + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + + @Bean + public PasswordEncoder passwordEncoder(){ + return new BCryptPasswordEncoder(); + } + +} +~~~~ + +##### 2.3.3.3 登陆接口 + +​ 接下我们需要自定义登陆接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。 + +​ 在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。 + +​ 认证成功的话要生成一个jwt,放入响应中返回。并且为了让用户下回请求时能通过jwt识别出具体的是哪个用户,我们需要把用户信息存入redis,可以把用户id作为key。 + +~~~~java +@RestController +public class LoginController { + + @Autowired + private LoginServcie loginServcie; + + @PostMapping("/user/login") + public ResponseResult login(@RequestBody User user){ + return loginServcie.login(user); + } +} + +~~~~ + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + + @Bean + public PasswordEncoder passwordEncoder(){ + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + //关闭csrf + .csrf().disable() + //不通过Session获取SecurityContext + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + // 对于登录接口 允许匿名访问 + .antMatchers("/user/login").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } +} +~~~~ + +​ + +~~~~java +@Service +public class LoginServiceImpl implements LoginServcie { + + @Autowired + private AuthenticationManager authenticationManager; + @Autowired + private RedisCache redisCache; + + @Override + public ResponseResult login(User user) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword()); + Authentication authenticate = authenticationManager.authenticate(authenticationToken); + if(Objects.isNull(authenticate)){ + throw new RuntimeException("用户名或密码错误"); + } + //使用userid生成token + LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); + String userId = loginUser.getUser().getId().toString(); + String jwt = JwtUtil.createJWT(userId); + //authenticate存入redis + redisCache.setCacheObject("login:"+userId,loginUser); + //把token响应给前端 + HashMap map = new HashMap<>(); + map.put("token",jwt); + return new ResponseResult(200,"登陆成功",map); + } +} + +~~~~ + + + +##### 2.3.3.4 认证过滤器 + +​ 我们需要自定义一个过滤器,这个过滤器会去获取请求头中的token,对token进行解析取出其中的userid。 + +​ 使用userid去redis中获取对应的LoginUser对象。 + +​ 然后封装Authentication对象存入SecurityContextHolder + + + +~~~~java +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + @Autowired + private RedisCache redisCache; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + //获取token + String token = request.getHeader("token"); + if (!StringUtils.hasText(token)) { + //放行 + filterChain.doFilter(request, response); + return; + } + //解析token + String userid; + try { + Claims claims = JwtUtil.parseJWT(token); + userid = claims.getSubject(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("token非法"); + } + //从redis中获取用户信息 + String redisKey = "login:" + userid; + LoginUser loginUser = redisCache.getCacheObject(redisKey); + if(Objects.isNull(loginUser)){ + throw new RuntimeException("用户未登录"); + } + //存入SecurityContextHolder + //TODO 获取权限信息封装到Authentication中 + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(loginUser,null,null); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + //放行 + filterChain.doFilter(request, response); + } +} +~~~~ + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + + @Bean + public PasswordEncoder passwordEncoder(){ + return new BCryptPasswordEncoder(); + } + + + @Autowired + JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + //关闭csrf + .csrf().disable() + //不通过Session获取SecurityContext + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + // 对于登录接口 允许匿名访问 + .antMatchers("/user/login").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + + //把token校验过滤器添加到过滤器链中 + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } +} + +~~~~ + + + +##### 2.3.3.5 退出登陆 + +​ 我们只需要定义一个登陆接口,然后获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。 + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Service +public class LoginServiceImpl implements LoginServcie { + + @Autowired + private AuthenticationManager authenticationManager; + @Autowired + private RedisCache redisCache; + + @Override + public ResponseResult login(User user) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword()); + Authentication authenticate = authenticationManager.authenticate(authenticationToken); + if(Objects.isNull(authenticate)){ + throw new RuntimeException("用户名或密码错误"); + } + //使用userid生成token + LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); + String userId = loginUser.getUser().getId().toString(); + String jwt = JwtUtil.createJWT(userId); + //authenticate存入redis + redisCache.setCacheObject("login:"+userId,loginUser); + //把token响应给前端 + HashMap map = new HashMap<>(); + map.put("token",jwt); + return new ResponseResult(200,"登陆成功",map); + } + + @Override + public ResponseResult logout() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + Long userid = loginUser.getUser().getId(); + redisCache.deleteObject("login:"+userid); + return new ResponseResult(200,"退出成功"); + } +} + +~~~~ + + + + + +## 3. 授权 + +### 3.0 权限系统的作用 + +​ 例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并使用添加书籍信息,删除书籍信息等功能。 + +​ 总结起来就是**不同的用户可以使用不同的功能**。这就是权限系统要去实现的效果。 + +​ 我们不能只依赖前端去判断用户的权限来选择显示哪些菜单哪些按钮。因为如果只是这样,如果有人知道了对应功能的接口地址就可以不通过前端,直接去发送请求来实现相关功能操作。 + +​ 所以我们还需要在后台进行用户权限的判断,判断当前用户是否有相应的权限,必须具有所需权限才能进行相应的操作。 + +​ + +### 3.1 授权基本流程 + +​ 在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。 + +​ 所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。 + +​ 然后设置我们的资源所需要的权限即可。 + +### 3.2 授权实现 + +#### 3.2.1 限制访问资源所需权限 + +​ SpringSecurity为我们提供了基于注解的权限控制方案,这也是我们项目中主要采用的方式。我们可以使用注解去指定访问对应的资源所需的权限。 + +​ 但是要使用它我们需要先开启相关配置。 + +~~~~java +@EnableGlobalMethodSecurity(prePostEnabled = true) +~~~~ + +​ 然后就可以使用对应的注解。@PreAuthorize + +~~~~java +@RestController +public class HelloController { + + @RequestMapping("/hello") + @PreAuthorize("hasAuthority('test')") + public String hello(){ + return "hello"; + } +} +~~~~ + +#### 3.2.2 封装权限信息 + +​ 我们前面在写UserDetailsServiceImpl的时候说过,在查询出用户后还要获取对应的权限信息,封装到UserDetails中返回。 + +​ 我们先直接把权限信息写死封装到UserDetails中进行测试。 + +​ 我们之前定义了UserDetails的实现类LoginUser,想要让其能封装权限信息就要对其进行修改。 + +~~~~java +package com.sangeng.domain; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Data +@NoArgsConstructor +public class LoginUser implements UserDetails { + + private User user; + + //存储权限信息 + private List permissions; + + + public LoginUser(User user,List permissions) { + this.user = user; + this.permissions = permissions; + } + + + //存储SpringSecurity所需要的权限信息的集合 + @JSONField(serialize = false) + private List authorities; + + @Override + public Collection getAuthorities() { + if(authorities!=null){ + return authorities; + } + //把permissions中字符串类型的权限信息转换成GrantedAuthority对象存入authorities中 + authorities = permissions.stream(). + map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + return authorities; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUserName(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} + +~~~~ + +​ LoginUser修改完后我们就可以在UserDetailsServiceImpl中去把权限信息封装到LoginUser中了。我们写死权限进行测试,后面我们再从数据库中查询权限信息。 + +~~~~java +package com.sangeng.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.sangeng.domain.LoginUser; +import com.sangeng.domain.User; +import com.sangeng.mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserMapper userMapper; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserName,username); + User user = userMapper.selectOne(wrapper); + if(Objects.isNull(user)){ + throw new RuntimeException("用户名或密码错误"); + } + //TODO 根据用户查询权限信息 添加到LoginUser中 + List list = new ArrayList<>(Arrays.asList("test")); + return new LoginUser(user,list); + } +} + +~~~~ + + + +#### 3.2.3 从数据库查询权限信息 + +##### 3.2.3.1 RBAC权限模型 + +​ RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。 + +​ ![image-20211222110249727](https://image.shijinping.cn/picgo/202310081106442.png) + +##### 3.2.3.2 准备工作 + +~~~~sql +CREATE DATABASE /*!32312 IF NOT EXISTS*/`sg_security` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; + +USE `sg_security`; + +/*Table structure for table `sys_menu` */ + +DROP TABLE IF EXISTS `sys_menu`; + +CREATE TABLE `sys_menu` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `menu_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '菜单名', + `path` varchar(200) DEFAULT NULL COMMENT '路由地址', + `component` varchar(255) DEFAULT NULL COMMENT '组件路径', + `visible` char(1) DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` char(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) DEFAULT '#' COMMENT '菜单图标', + `create_by` bigint(20) DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + `update_by` bigint(20) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `del_flag` int(11) DEFAULT '0' COMMENT '是否删除(0未删除 1已删除)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='菜单表'; + +/*Table structure for table `sys_role` */ + +DROP TABLE IF EXISTS `sys_role`; + +CREATE TABLE `sys_role` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `name` varchar(128) DEFAULT NULL, + `role_key` varchar(100) DEFAULT NULL COMMENT '角色权限字符串', + `status` char(1) DEFAULT '0' COMMENT '角色状态(0正常 1停用)', + `del_flag` int(1) DEFAULT '0' COMMENT 'del_flag', + `create_by` bigint(200) DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + `update_by` bigint(200) DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; + +/*Table structure for table `sys_role_menu` */ + +DROP TABLE IF EXISTS `sys_role_menu`; + +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(200) NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `menu_id` bigint(200) NOT NULL DEFAULT '0' COMMENT '菜单id', + PRIMARY KEY (`role_id`,`menu_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; + +/*Table structure for table `sys_user` */ + +DROP TABLE IF EXISTS `sys_user`; + +CREATE TABLE `sys_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '用户名', + `nick_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '昵称', + `password` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '密码', + `status` char(1) DEFAULT '0' COMMENT '账号状态(0正常 1停用)', + `email` varchar(64) DEFAULT NULL COMMENT '邮箱', + `phonenumber` varchar(32) DEFAULT NULL COMMENT '手机号', + `sex` char(1) DEFAULT NULL COMMENT '用户性别(0男,1女,2未知)', + `avatar` varchar(128) DEFAULT NULL COMMENT '头像', + `user_type` char(1) NOT NULL DEFAULT '1' COMMENT '用户类型(0管理员,1普通用户)', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建人的用户id', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` int(11) DEFAULT '0' COMMENT '删除标志(0代表未删除,1代表已删除)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; + +/*Table structure for table `sys_user_role` */ + +DROP TABLE IF EXISTS `sys_user_role`; + +CREATE TABLE `sys_user_role` ( + `user_id` bigint(200) NOT NULL AUTO_INCREMENT COMMENT '用户id', + `role_id` bigint(200) NOT NULL DEFAULT '0' COMMENT '角色id', + PRIMARY KEY (`user_id`,`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +~~~~ + +~~~~mysql +SELECT + DISTINCT m.`perms` +FROM + sys_user_role ur + LEFT JOIN `sys_role` r ON ur.`role_id` = r.`id` + LEFT JOIN `sys_role_menu` rm ON ur.`role_id` = rm.`role_id` + LEFT JOIN `sys_menu` m ON m.`id` = rm.`menu_id` +WHERE + user_id = 2 + AND r.`status` = 0 + AND m.`status` = 0 +~~~~ + + + + + + + +~~~~java +package com.sangeng.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 菜单表(Menu)实体类 + * + * @author makejava + * @since 2021-11-24 15:30:08 + */ +@TableName(value="sys_menu") +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Menu implements Serializable { + private static final long serialVersionUID = -54979041104113736L; + + @TableId + private Long id; + /** + * 菜单名 + */ + private String menuName; + /** + * 路由地址 + */ + private String path; + /** + * 组件路径 + */ + private String component; + /** + * 菜单状态(0显示 1隐藏) + */ + private String visible; + /** + * 菜单状态(0正常 1停用) + */ + private String status; + /** + * 权限标识 + */ + private String perms; + /** + * 菜单图标 + */ + private String icon; + + private Long createBy; + + private Date createTime; + + private Long updateBy; + + private Date updateTime; + /** + * 是否删除(0未删除 1已删除) + */ + private Integer delFlag; + /** + * 备注 + */ + private String remark; +} +~~~~ + + + +##### 3.2.3.3 代码实现 + +​ 我们只需要根据用户id去查询到其所对应的权限信息即可。 + +​ 所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。 + +~~~~java +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sangeng.domain.Menu; + +import java.util.List; + +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +public interface MenuMapper extends BaseMapper { + List selectPermsByUserId(Long id); +} +~~~~ + +​ 尤其是自定义方法,所以需要创建对应的mapper文件,定义对应的sql语句 + +~~~~xml + + + + + + + +~~~~ + +​ 在application.yml中配置mapperXML文件的位置 + +~~~~yaml +spring: + datasource: + url: jdbc:mysql://localhost:3306/sg_security?characterEncoding=utf-8&serverTimezone=UTC + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: localhost + port: 6379 +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + +~~~~ + + + +​ 然后我们可以在UserDetailsServiceImpl中去调用该mapper的方法查询权限信息封装到LoginUser对象中即可。 + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserMapper userMapper; + + @Autowired + private MenuMapper menuMapper; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserName,username); + User user = userMapper.selectOne(wrapper); + if(Objects.isNull(user)){ + throw new RuntimeException("用户名或密码错误"); + } + List permissionKeyList = menuMapper.selectPermsByUserId(user.getId()); +// //测试写法 +// List list = new ArrayList<>(Arrays.asList("test")); + return new LoginUser(user,permissionKeyList); + } +} +~~~~ + + + + + +## 4. 自定义失败处理 + +​ 我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。 + +​ 在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。 + +​ 如果是认证过程中出现的异常会被封装成AuthenticationException然后调用**AuthenticationEntryPoint**对象的方法去进行异常处理。 + +​ 如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用**AccessDeniedHandler**对象的方法去进行异常处理。 + +​ 所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置给SpringSecurity即可。 + + + +①自定义实现类 + +~~~~java +@Component +public class AccessDeniedHandlerImpl implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { + ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(), "权限不足"); + String json = JSON.toJSONString(result); + WebUtils.renderString(response,json); + + } +} + +~~~~ + +~~~~java +/** + * @Author 三更 B站: https://space.bilibili.com/663528522 + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + ResponseResult result = new ResponseResult(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录"); + String json = JSON.toJSONString(result); + WebUtils.renderString(response,json); + } +} + +~~~~ + + + + + +②配置给SpringSecurity + +​ + +​ 先注入对应的处理器 + +~~~~java + @Autowired + private AuthenticationEntryPoint authenticationEntryPoint; + + @Autowired + private AccessDeniedHandler accessDeniedHandler; +~~~~ + +​ 然后我们可以使用HttpSecurity对象的方法去配置。 + +~~~~java + http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint). + accessDeniedHandler(accessDeniedHandler); +~~~~ + + + +## 5. 跨域 + +​ 浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。 同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。 + +​ 前后端分离项目,前端项目和后端项目一般都不是同源的,所以肯定会存在跨域请求的问题。 + +​ 所以我们就要处理一下,让前端能进行跨域请求。 + +①先对SpringBoot配置,运行跨域请求 + +~~~~java +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + // 设置允许跨域的路径 + registry.addMapping("/**") + // 设置允许跨域请求的域名 + .allowedOriginPatterns("*") + // 是否允许cookie + .allowCredentials(true) + // 设置允许的请求方式 + .allowedMethods("GET", "POST", "DELETE", "PUT") + // 设置允许的header属性 + .allowedHeaders("*") + // 跨域允许时间 + .maxAge(3600); + } +} +~~~~ + +②开启SpringSecurity的跨域访问 + +由于我们的资源都会收到SpringSecurity的保护,所以想要跨域访问还要让SpringSecurity运行跨域访问。 + +~~~~java + @Override + protected void configure(HttpSecurity http) throws Exception { + http + //关闭csrf + .csrf().disable() + //不通过Session获取SecurityContext + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + // 对于登录接口 允许匿名访问 + .antMatchers("/user/login").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + + //添加过滤器 + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + + //配置异常处理器 + http.exceptionHandling() + //配置认证失败处理器 + .authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler); + + //允许跨域 + http.cors(); + } + +~~~~ + + + + + +## 6. 遗留小问题 + +### 其它权限校验方法 + +​ 我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。SpringSecurity还为我们提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。 + +​ + +​ 这里我们先不急着去介绍这些方法,我们先去理解hasAuthority的原理,然后再去学习其他方法你就更容易理解,而不是死记硬背区别。并且我们也可以选择定义校验方法,实现我们自己的校验逻辑。 + +​ hasAuthority方法实际是执行到了SecurityExpressionRoot的hasAuthority,大家只要断点调试既可知道它内部的校验原理。 + +​ 它内部其实是调用authentication的getAuthorities方法获取用户的权限列表。然后判断我们存入的方法参数数据在权限列表中。 + + + +​ hasAnyAuthority方法可以传入多个权限,只有用户有其中任意一个权限都可以访问对应资源。 + +~~~~java + @PreAuthorize("hasAnyAuthority('admin','test','system:dept:list')") + public String hello(){ + return "hello"; + } +~~~~ + + + +​ hasRole要求有对应的角色才可以访问,但是它内部会把我们传入的参数拼接上 **ROLE_** 后再去比较。所以这种情况下要用用户对应的权限也要有 **ROLE_** 这个前缀才可以。 + +~~~~java + @PreAuthorize("hasRole('system:dept:list')") + public String hello(){ + return "hello"; + } +~~~~ + + + +​ hasAnyRole 有任意的角色就可以访问。它内部也会把我们传入的参数拼接上 **ROLE_** 后再去比较。所以这种情况下要用用户对应的权限也要有 **ROLE_** 这个前缀才可以。 + +~~~~java + @PreAuthorize("hasAnyRole('admin','system:dept:list')") + public String hello(){ + return "hello"; + } +~~~~ + + + + + +### 自定义权限校验方法 + +​ 我们也可以定义自己的权限校验方法,在@PreAuthorize注解中使用我们的方法。 + +~~~~java +@Component("ex") +public class SGExpressionRoot { + + public boolean hasAuthority(String authority){ + //获取当前用户的权限 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + List permissions = loginUser.getPermissions(); + //判断用户权限集合中是否存在authority + return permissions.contains(authority); + } +} +~~~~ + +​ 在SPEL表达式中使用 @ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的hasAuthority方法 + +~~~~java + @RequestMapping("/hello") + @PreAuthorize("@ex.hasAuthority('system:dept:list')") + public String hello(){ + return "hello"; + } +~~~~ + + + +### 基于配置的权限控制 + +​ 我们也可以在配置类中使用使用配置的方式对资源进行权限控制。 + +~~~~java + @Override + protected void configure(HttpSecurity http) throws Exception { + http + //关闭csrf + .csrf().disable() + //不通过Session获取SecurityContext + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + // 对于登录接口 允许匿名访问 + .antMatchers("/user/login").anonymous() + .antMatchers("/testCors").hasAuthority("system:dept:list222") + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + + //添加过滤器 + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + + //配置异常处理器 + http.exceptionHandling() + //配置认证失败处理器 + .authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler); + + //允许跨域 + http.cors(); + } +~~~~ + + + + + + + +### CSRF + +​ CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一。 + +​ https://blog.csdn.net/freeking101/article/details/86537087 + +​ SpringSecurity去防止CSRF攻击的方式就是通过csrf_token。后端会生成一个csrf_token,前端发起请求的时候需要携带这个csrf_token,后端会有过滤器进行校验,如果没有携带或者是伪造的就不允许访问。 + +​ 我们可以发现CSRF攻击依靠的是cookie中所携带的认证信息。但是在前后端分离的项目中我们的认证信息其实是token,而token并不是存储中cookie中,并且需要前端代码去把token设置到请求头中才可以,所以CSRF攻击也就不用担心了。 + + + + + +### 认证成功处理器 + +​ 实际上在UsernamePasswordAuthenticationFilter进行登录认证的时候,如果登录成功了是会调用AuthenticationSuccessHandler的方法进行认证成功后的处理的。AuthenticationSuccessHandler就是登录成功处理器。 + +​ 我们也可以自己去自定义成功处理器进行成功后的相应处理。 + +~~~~java +@Component +public class SGSuccessHandler implements AuthenticationSuccessHandler { + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + System.out.println("认证成功了"); + } +} + +~~~~ + +~~~~java +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthenticationSuccessHandler successHandler; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.formLogin().successHandler(successHandler); + + http.authorizeRequests().anyRequest().authenticated(); + } +} + +~~~~ + + + +### 认证失败处理器 + +​ 实际上在UsernamePasswordAuthenticationFilter进行登录认证的时候,如果认证失败了是会调用AuthenticationFailureHandler的方法进行认证失败后的处理的。AuthenticationFailureHandler就是登录失败处理器。 + +​ 我们也可以自己去自定义失败处理器进行失败后的相应处理。 + +~~~~java +@Component +public class SGFailureHandler implements AuthenticationFailureHandler { + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + System.out.println("认证失败了"); + } +} +~~~~ + + + +~~~~java +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthenticationSuccessHandler successHandler; + + @Autowired + private AuthenticationFailureHandler failureHandler; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.formLogin() +// 配置认证成功处理器 + .successHandler(successHandler) +// 配置认证失败处理器 + .failureHandler(failureHandler); + + http.authorizeRequests().anyRequest().authenticated(); + } +} + +~~~~ + + + +### 登出成功处理器 + +~~~~java +@Component +public class SGLogoutSuccessHandler implements LogoutSuccessHandler { + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + System.out.println("注销成功"); + } +} + +~~~~ + +~~~~java +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthenticationSuccessHandler successHandler; + + @Autowired + private AuthenticationFailureHandler failureHandler; + + @Autowired + private LogoutSuccessHandler logoutSuccessHandler; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.formLogin() +// 配置认证成功处理器 + .successHandler(successHandler) +// 配置认证失败处理器 + .failureHandler(failureHandler); + + http.logout() + //配置注销成功处理器 + .logoutSuccessHandler(logoutSuccessHandler); + + http.authorizeRequests().anyRequest().authenticated(); + } +} +~~~~ + + + + + +### 其他认证方案畅想 + + + + + +## 7. 源码讲解 + +​ 投票过50更新源码讲解 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/Java/springboot-problem.md b/content/posts/1.Learning/A3.Reflections/Java/springboot-problem.md new file mode 100644 index 0000000..58d91a9 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/Java/springboot-problem.md @@ -0,0 +1,42 @@ +--- +title: "Springboot问题汇总" +date: 2023-10-14T21:43:48+08:00 +tags: ["java"] +categories: ["Learning", "Reflections"] +--- + +### 1. 编写starter时,引用后无法获取到bean + +> 环境:使用版本Springboot3.1.4版本 + +问题:之前写starter的时候,一直是按照网上的教程,大部分是Springboot2.x版本,但自己使用了最新版本Springboot3.1.4版本,所以一直不成功。 + +深入代码查看后,发现以下跟老版本不一致。 + +新版本: + +``` +SpringBootApplication --> EnableAutoConfiguration --> AutoConfigurationImportSelector.getCandidateConfigurations --> ImportCandidates.load --> LOCATION --> "META-INF/spring/%s.imports" +``` + +老版本: + +``` +SpringBootApplication --> EnableAutoConfiguration --> AutoConfigurationImportSelector.getCandidateConfigurations --> SpringFactoriesLoader.loadFactoryNames --> Factories_RESOURCE_LOCATION --> "META-INF/spring.factories" +``` + +所以按照新版 ` META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 进行编写的,可以正常识别。 + +注意: + +这里的内容也不一样了,之前是需要写入一行,新版本支持多行格式 + +```java +Enumeration urls = findUrlsInClasspath(classLoaderToUse, location); +List importCandidates = new ArrayList<>(); +while (urls.hasMoreElements()) { // 如果有多行,直接支持了,把所有的都加入到importCandidates中去了 + URL url = urls.nextElement(); + importCandidates.addAll(readCandidateConfigurations(url)); +} +``` + diff --git a/content/posts/1.Learning/A3.Reflections/MyBatis/_index.md b/content/posts/1.Learning/A3.Reflections/MyBatis/_index.md new file mode 100644 index 0000000..fe5400d --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/MyBatis/_index.md @@ -0,0 +1,9 @@ +--- +title: "MyBatis" +date: 2023-04-15T16:14:19+08:00 +tags: ["MyBatis"] +categories: ["Learning", "Reflections"] + +--- + +MyBatis相关 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/MyBatis/mybatis.md b/content/posts/1.Learning/A3.Reflections/MyBatis/mybatis.md new file mode 100644 index 0000000..3540e34 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/MyBatis/mybatis.md @@ -0,0 +1,105 @@ +--- +title: "mybatis" +date: 2022-07-06T16:43:01+08:00 +tags: ["mybatis"] +categories: ["Learning", "Reflections"] +--- + +``` +阅读准备参考:https://www.jianshu.com/p/e739afb8fe31 +需要导入模块:需要将mybatis-parent模块导入。mybatis-parent模块链接 https://github.com/mybatis/parent + +1.兵马未动,日志先行 +org.apache.ibatis.logging +org.apache.ibatis.logging.commons +org.apache.ibatis.logging.jdbc +org.apache.ibatis.logging.jdk14 +org.apache.ibatis.logging.log4j +org.apache.ibatis.logging.log4j2 +org.apache.ibatis.logging.nologging +org.apache.ibatis.logging.slf4j +org.apache.ibatis.logging.stdout +对象适配器设计模式 +设计模式可参考http://www.cnblogs.com/liuling/archive/2013/04/12/adapter.html + +2.异常 +org.apache.ibatis.exceptions + +3.缓存 +org.apache.ibatis.cache +org.apache.ibatis.cache.decorators +org.apache.ibatis.cache.impl + +4.解析 +org.apache.ibatis.parsing +xml解析,${} 格式的字符串解析 +源码分析可以参考http://www.cnblogs.com/sunzhenchao/p/3161093.html + +5.类型处理器 +org.apache.ibatis.type +实现java和jdbc中的类型之间转换 +源码分析可以参考http://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html + +6.IO +org.apache.ibatis.io +通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类 + +7.反射 +org.apache.ibatis.reflection +org.apache.ibatis.reflection.factory +org.apache.ibatis.reflection.invoker +org.apache.ibatis.reflection.property +org.apache.ibatis.reflection.wrapper +可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类 + +8.数据源 +org.apache.ibatis.datasource +org.apache.ibatis.datasource.jndi +org.apache.ibatis.datasource.pooled +org.apache.ibatis.datasource.unpooled + +9.事务 +org.apache.ibatis.transaction +org.apache.ibatis.transaction.jdbc +org.apache.ibatis.transaction.managed + +10.会话 +org.apache.ibatis.session +org.apache.ibatis.session.defaults + +11.jdbc单元测试工具 +org.apache.ibatis.jdbc + +12.构建 +org.apache.ibatis.builder +org.apache.ibatis.builder.annotation +org.apache.ibatis.builder.xml + +13.映射 +org.apache.ibatis.mapping + +14.脚本 +org.apache.ibatis.scripting +org.apache.ibatis.scripting.defaults +org.apache.ibatis.scripting.xmltags + +15.注解 +org.apache.ibatis.annotations + +16.绑定 +org.apache.ibatis.binding + +17.执行器 +org.apache.ibatis.executor +org.apache.ibatis.executor.keygen +org.apache.ibatis.executor.loader +org.apache.ibatis.executor.loader.cglib +org.apache.ibatis.executor.loader.javassist +org.apache.ibatis.executor.parameter +org.apache.ibatis.executor.result +org.apache.ibatis.executor.resultset +org.apache.ibatis.executor.statement + +18.插件 +org.apache.ibatis.plugin +``` \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/_index.md b/content/posts/1.Learning/A3.Reflections/_index.md new file mode 100644 index 0000000..503031f --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/_index.md @@ -0,0 +1,12 @@ +--- +title: "思考总结" +date: 2023-04-15T11:04:48+08:00 +categories: ["Learning", "Reflections"] +--- + +指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果 + +包含的分类: + +* 观点思考 +* 人生感悟 \ No newline at end of file diff --git a/content/posts/1.Learning/A3.Reflections/universe1.md b/content/posts/1.Learning/A3.Reflections/universe1.md new file mode 100644 index 0000000..57d1c97 --- /dev/null +++ b/content/posts/1.Learning/A3.Reflections/universe1.md @@ -0,0 +1,18 @@ +--- +title: "宇宙遐想" +date: 2023-02-16T00:24:42+08:00 +tags: ["宇宙","地球"] +categories: ["Learning", "Reflections"] +--- + +以下内容属于遐想,并非真实 + +​ 在宇宙诞生之前,存在着无限寿命的灵魂,它们融合后形成了宇宙。这时宇宙中出现了一个强大的“帝国文明”,由于“帝国文明”的庞大,也出现了一些坏人,因此遥远的地球被用作监狱。地球被建立了一个保护罩,防止这些坏人逃离并被植入两个概念:向往光明和留在地球。随着时间的推移,“帝国文明”内部发生动乱,叛乱者也被送到地球监狱。 + +​ 由于这些灵魂无法在地球上生存,它们只能寄生于地球上的生物,如类人猿。这些灵魂植入寄生体后,保护罩会封存它们的记忆,并将它们送回地球上进行寄生。 + +​ 直到另一个“领地文明”出现后,与“帝国文明”进行了战争,而地球正好位于两个文明的交叉地带。当交战开始时,领地文明发现了地球,想破坏保护罩救出地球上的灵魂。他们派出了3000勇士,但貌似没有成功。在这些勇士的领导下,地球上的苏美尔文明、埃及文明等得以诞生。 + +​ 最终,领地文明战胜了帝国文明,但地球不适合灵魂居住,因此领地文明并未继续投入资源,只会巡查并维护整个宇宙的稳定。当地球上出现核信号时,会有飞船来扫描并确认安全后离去。 + +​ 而地球外层保护罩存在周期性减弱,当减弱时,会出现一些引领地球快速发展的人物,如牛顿、莱布尼茨、胡克、哈雷、列夫托尔斯泰和亚历山大等。 \ No newline at end of file diff --git a/content/posts/1.Learning/A4.PersonalPlanning/2023年终总结.md b/content/posts/1.Learning/A4.PersonalPlanning/2023年终总结.md new file mode 100644 index 0000000..9869f25 --- /dev/null +++ b/content/posts/1.Learning/A4.PersonalPlanning/2023年终总结.md @@ -0,0 +1,8 @@ +--- +title: "2023年终" +date: 2023-11-05T22:22:21+08:00 +tags: ["Summary"] +categories: ["Learning", "PersonalPlanning"] +--- + +2022年是我的本命年,5月份知道 \ No newline at end of file diff --git a/content/posts/1.Learning/A4.PersonalPlanning/Procrastination.md b/content/posts/1.Learning/A4.PersonalPlanning/Procrastination.md new file mode 100644 index 0000000..f6b41e0 --- /dev/null +++ b/content/posts/1.Learning/A4.PersonalPlanning/Procrastination.md @@ -0,0 +1,44 @@ +--- +title: "拖延症解决办法" +date: 2023-09-23T14:43:21+08:00 +tags: ["Mind"] +categories: ["Learning", "PersonalPlanning"] + +--- + +对于拖延症,不知道怎么去解决,其实很多办法都能够帮助自己 + +下面是xmind对应的拖延症的一个思路 + +```markdown + +# 任务名称 + +## 一、时间管理 + +### 1. 评分标准 + +### 2. 作业管理 + +## 二、任务管理 + +### 1. 任务拆解 + +### 2. 生产力工具 + +### 3. 完成后的激励 + +## 三、环境 + +### 1. 消除分心 + +### 2. 减少干扰 + +## 四、态度 + +### 1. 合理安排 + +### 2. 量力而行 +``` + +用上面的任务,来解决拖延症的问题,尝试尝试 diff --git a/content/posts/1.Learning/A4.PersonalPlanning/_index.md b/content/posts/1.Learning/A4.PersonalPlanning/_index.md new file mode 100644 index 0000000..4311814 --- /dev/null +++ b/content/posts/1.Learning/A4.PersonalPlanning/_index.md @@ -0,0 +1,12 @@ +--- +title: "个人规划" +date: 2023-04-15T13:47:36+08:00 +categories: ["Learning", "PersonalPlanning"] +--- + +指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果 + +包含的分类: + +* 观点思考 +* 人生感悟 \ No newline at end of file diff --git a/content/posts/1.Learning/_index.md b/content/posts/1.Learning/_index.md new file mode 100644 index 0000000..ced9e51 --- /dev/null +++ b/content/posts/1.Learning/_index.md @@ -0,0 +1,18 @@ +--- +title: "学习" +date: 2023-04-15T10:40:41+08:00 +categories: ["Learning"] +--- + +这个分类是关于个人学习的,包括记录学习笔记、读书笔记、思考总结以及制定个人规划等内容。 + +包含的分类: + +* 学习笔记 (Study Notes) +* 读书笔记 (Reading Notes) +* 思考总结 (Reflections) +* 个人规划 (Personal Planning) + +想要系统性地掌握某项技巧,应该有以下的一套思路,之前经常只是第一步,没有做到后面几步。 + +![image-20230606141712998](https://image.shijinping.cn/picgo/image-20230606141712998.png) \ No newline at end of file diff --git a/content/posts/2.Work/B1.TaskManagement/CloudStorageUtil.md b/content/posts/2.Work/B1.TaskManagement/CloudStorageUtil.md new file mode 100644 index 0000000..f4d40f9 --- /dev/null +++ b/content/posts/2.Work/B1.TaskManagement/CloudStorageUtil.md @@ -0,0 +1,21 @@ +--- +title: "云存储工具" +date: 2023-10-12T13:36:49+08:00 +categories: ["Work", "TaskManagement"] +--- + +## 目标 + +1. 支持oss、obs厂商,支持横向扩展 +2. 基于spi方式接入 +3. 支持厂商存储切换,屏蔽底层实现 + +## 调查内容 + +### 1. 如何实现spi + +* Configuration +* 配置类 + +### 2. 做什么东西 + diff --git a/content/posts/2.Work/B1.TaskManagement/_index.md b/content/posts/2.Work/B1.TaskManagement/_index.md new file mode 100644 index 0000000..5448d4c --- /dev/null +++ b/content/posts/2.Work/B1.TaskManagement/_index.md @@ -0,0 +1,15 @@ +--- +title: "任务管理" +date: 2023-04-15T13:51:42+08:00 +categories: ["Work", "TaskManagement"] +--- + +指工作中对任务的管理和分配,旨在提高工作效率和任务完成质量 + +包含的分类: + +* 任务分配 +* 任务进度跟踪 +* 任务优先级排序 +* 任务提醒 +* 任务归档记录 \ No newline at end of file diff --git a/content/posts/2.Work/B2.Scheduling/_index.md b/content/posts/2.Work/B2.Scheduling/_index.md new file mode 100644 index 0000000..c89cefe --- /dev/null +++ b/content/posts/2.Work/B2.Scheduling/_index.md @@ -0,0 +1,14 @@ +--- +title: "日程安排" +date: 2023-04-15T13:52:35+08:00 +categories: ["Work", "Scheduling"] +--- + +指对工作和生活中的日程进行安排和规划,以保证时间利用的最大化和效率的最大化 + +包含的分类: + +* 日程规划 +* 日程提醒 +* 日程分享 +* 日程调整 diff --git a/content/posts/2.Work/B3.TeamManagement/_index.md b/content/posts/2.Work/B3.TeamManagement/_index.md new file mode 100644 index 0000000..1e631e4 --- /dev/null +++ b/content/posts/2.Work/B3.TeamManagement/_index.md @@ -0,0 +1,15 @@ +--- +title: "团队管理" +date: 2023-04-15T14:14:54+08:00 +categories: ["Work", "TeamManagement"] +--- + +指对团队的管理和领导,包括协调、沟通、激励等 + +包含的分类: + +* 团队成员管理 +* 团队协作工具选择 +* 团队沟通管理 +* 团队目标设定 +* 团队绩效考核 diff --git a/content/posts/2.Work/B4.ReportWriting/_index.md b/content/posts/2.Work/B4.ReportWriting/_index.md new file mode 100644 index 0000000..78b42e7 --- /dev/null +++ b/content/posts/2.Work/B4.ReportWriting/_index.md @@ -0,0 +1,15 @@ +--- +title: "报告撰写" +date: 2023-04-15T14:16:05+08:00 +categories: ["Work", "ReportWriting"] +--- + +指工作中撰写各类报告的能力,包括调研报告、年度报告、销售报告等 + +包含的分类: + +* 报告内容规划 +* 报告数据收集 +* 报告分析 +* 报告撰写 +* 报告修改 diff --git a/content/posts/2.Work/_index.md b/content/posts/2.Work/_index.md new file mode 100644 index 0000000..7397b9c --- /dev/null +++ b/content/posts/2.Work/_index.md @@ -0,0 +1,14 @@ +--- +title: "工作" +date: 2023-04-15T10:41:35+08:00 +categories: ["Work"] +--- + +这个分类是关于职业工作的,包括任务管理、日程安排、团队管理和报告撰写等内容,有助于提高工作效率。 + +包含的分类: + +* 任务管理 (Task Management) +* 日程安排 (Scheduling) +* 团队管理 (Team Management) +* 报告撰写 (Report Writing) \ No newline at end of file diff --git a/content/posts/3.Lifestyle/C1.Health/_index.md b/content/posts/3.Lifestyle/C1.Health/_index.md new file mode 100644 index 0000000..e284027 --- /dev/null +++ b/content/posts/3.Lifestyle/C1.Health/_index.md @@ -0,0 +1,17 @@ +--- +title: "健康管理" +date: 2023-04-15T10:44:23+08:00 +categories: ["Lifestyle", "Health"] +--- + +指对自身身体健康和精神健康的管理,包括运动、饮食、心理健康等 + +包含的分类: + +* 饮食习惯 + +* 运动计划 + +* 睡眠监测 + +* 医疗记录 diff --git a/content/posts/3.Lifestyle/C2.FamilyAffairs/_index.md b/content/posts/3.Lifestyle/C2.FamilyAffairs/_index.md new file mode 100644 index 0000000..edac4cb --- /dev/null +++ b/content/posts/3.Lifestyle/C2.FamilyAffairs/_index.md @@ -0,0 +1,15 @@ +--- +title: "家庭事务" +date: 2023-04-15T10:47:51+08:00 +categories: ["Lifestyle", "FamilyAffairs"] +--- + +指家庭生活中需要处理的事务,包括孩子教育、家务分工、家庭财务等 + +包含的分类: + +* 家务安排 + +* 购物清单 + +* 家庭预算 diff --git a/content/posts/3.Lifestyle/C3.TravelPlanning/_index.md b/content/posts/3.Lifestyle/C3.TravelPlanning/_index.md new file mode 100644 index 0000000..e624f06 --- /dev/null +++ b/content/posts/3.Lifestyle/C3.TravelPlanning/_index.md @@ -0,0 +1,17 @@ +--- +title: "旅行规划" +date: 2023-04-15T10:51:28+08:00 +categories: ["Lifestyle", "TravelPlanning"] +--- + +指旅行前的规划和安排,包括交通、住宿、景点等 + +包含的分类: + +* 目的地探索 + +* 行程安排 + +* 预订记录 + +* 游记分享 diff --git a/content/posts/3.Lifestyle/C4. Food/_index.md b/content/posts/3.Lifestyle/C4. Food/_index.md new file mode 100644 index 0000000..3178d1b --- /dev/null +++ b/content/posts/3.Lifestyle/C4. Food/_index.md @@ -0,0 +1,14 @@ +--- +title: "美食" +date: 2023-04-15T10:53:03+08:00 +categories: ["Lifestyle", "Food"] +--- + +指对各种美食的探索和品尝 + +包含的分类: + +* 菜谱收集 +* 餐厅推荐 +* 食材采购 +* 烹饪记录 \ No newline at end of file diff --git a/content/posts/3.Lifestyle/C5.WeightLoss/_index.md b/content/posts/3.Lifestyle/C5.WeightLoss/_index.md new file mode 100644 index 0000000..3605d26 --- /dev/null +++ b/content/posts/3.Lifestyle/C5.WeightLoss/_index.md @@ -0,0 +1,15 @@ +--- +title: "减肥" +date: 2023-04-15T10:54:24+08:00 +categories: ["Lifestyle", "WeightLoss"] +--- + +指对身体体重的管理和控制,包括健康饮食、运动减肥等 + +包含的分类: + +* 饮食计划 +* 运动记录 +* 体重监测 +* 健康饮食建议 + diff --git a/content/posts/3.Lifestyle/_index.md b/content/posts/3.Lifestyle/_index.md new file mode 100644 index 0000000..3afdc78 --- /dev/null +++ b/content/posts/3.Lifestyle/_index.md @@ -0,0 +1,19 @@ +--- +title: "生活" +date: 2023-04-15T10:42:42+08:00 +categories: ["Lifestyle"] +--- + +这个分类是关于日常生活的,包括健康管理、家庭事务、旅行规划、美食和减肥等内容,有助于提高生活品质和健康状况。 + +包含的分类: + +* 健康管理 (Health) + +* 家庭事务 (FamilyAffairs) + +* 旅行规划 (TravelPlanning) + +* 美食 (Food) + +* 减肥 (WeightLoss) \ No newline at end of file diff --git a/content/posts/4.Entertainment/_index.md b/content/posts/4.Entertainment/_index.md new file mode 100644 index 0000000..86ecdba --- /dev/null +++ b/content/posts/4.Entertainment/_index.md @@ -0,0 +1,12 @@ +--- +title: "娱乐" +date: 2023-04-15T10:42:22+08:00 +categories: ["Entertainment"] +--- + +这个分类是关于休闲娱乐的,包括记录电影、游戏等方面的内容,以及汽车和摩托车等车辆方面的兴趣爱好。 + +包含的分类: + +* 电影/游戏 +* 汽车/摩托 \ No newline at end of file diff --git a/content/posts/5.Daily/2023-05/2023-05-05.md b/content/posts/5.Daily/2023-05/2023-05-05.md new file mode 100644 index 0000000..f6c3449 --- /dev/null +++ b/content/posts/5.Daily/2023-05/2023-05-05.md @@ -0,0 +1,7 @@ +--- +title: "2023-05-05" +date: 2023-05-05T22:13:54+08:00 +categories: ["Daily"] +--- + +玩了两天的魔兽世界,还想去玩,但是zoom的失败,给我打击非常的大。现在就想找点事情做做,今天想到了重装系统,这个有个鸟用。。 diff --git a/content/posts/5.Daily/2023-05/2023-05-23.md b/content/posts/5.Daily/2023-05/2023-05-23.md new file mode 100644 index 0000000..e4bc8de --- /dev/null +++ b/content/posts/5.Daily/2023-05/2023-05-23.md @@ -0,0 +1,9 @@ +--- +title: "2023-05-23" +date: 2023-05-23T12:47:30+08:00 +categories: ["Daily"] +--- + +每日记录 + +开始要好好看书了 diff --git a/content/posts/5.Daily/2023-07/2023-07-20.md b/content/posts/5.Daily/2023-07/2023-07-20.md new file mode 100644 index 0000000..2f6e327 --- /dev/null +++ b/content/posts/5.Daily/2023-07/2023-07-20.md @@ -0,0 +1,10 @@ +--- +title: "2023-07-20" +date: 2023-07-20T21:10:25+08:00 +categories: ["Daily"] +--- + +# 2023-07-20 日志 + +坑爹的github,无法使用了,phone code 发送失败,让移动的查了下,发现也不行。太坑了 + diff --git a/content/posts/5.Daily/2023-08/2023-08-19.md b/content/posts/5.Daily/2023-08/2023-08-19.md new file mode 100644 index 0000000..45e6310 --- /dev/null +++ b/content/posts/5.Daily/2023-08/2023-08-19.md @@ -0,0 +1,8 @@ +--- +title: "2023-08-19" +date: 2023-08-19T09:30:02+08:00 +tags: [""] +categories: ["Daily"] +--- + +加油加油,争取找到一份满意的工作 diff --git a/content/posts/5.Daily/2023-08/2023-08-30.md b/content/posts/5.Daily/2023-08/2023-08-30.md new file mode 100644 index 0000000..ab838d1 --- /dev/null +++ b/content/posts/5.Daily/2023-08/2023-08-30.md @@ -0,0 +1,7 @@ +--- +title: "2023-08-30" +date: 2023-08-30T16:49:09+08:00 +categories: ["Daily"] +--- + +游卡HR面失败,业务不匹配 diff --git a/content/posts/5.Daily/2023-09/2023-09-14.md b/content/posts/5.Daily/2023-09/2023-09-14.md new file mode 100644 index 0000000..e488584 --- /dev/null +++ b/content/posts/5.Daily/2023-09/2023-09-14.md @@ -0,0 +1,19 @@ +--- +title: "2023-09-14" +date: 2023-09-14T09:08:50+08:00 +categories: ["Daily"] +--- + +# 面试题目 + +1. MySQL的合理集群配置 +2. Kafka的breaker配置,属于cap满足什么 +3. Https的认证过程,https的整个流程 +4. 7层协议 +5. docker的网卡 +6. Helm是什么东西 +7. 微服务的内容(谷歌)istlo +8. Nginx如何优雅的关闭,Golang如何优雅的关闭 +9. Zookeeper与ectd的区别 + +面试(2023-09-13下午三点)过程很好,但是却没有消息。心里又失落了 diff --git a/content/posts/5.Daily/2023-09/2023-09-23.md b/content/posts/5.Daily/2023-09/2023-09-23.md new file mode 100644 index 0000000..d896ee9 --- /dev/null +++ b/content/posts/5.Daily/2023-09/2023-09-23.md @@ -0,0 +1,62 @@ +--- +title: "2023-09-23" +date: 2023-09-23T15:15:09+08:00 +categories: ["Daily"] +--- + +# 梳理我可以做什么 + +## 一、时间管理 + +### 1. 评分标准 + +* 输出一份pdf或者是文档 +* 分析优先级别 +* 指定完成时间 + +### 2. 作业管理 + +* 工作要找什么样的 +* 副业要做什么样的,是否可行 + +## 二、任务管理 + +### 1. 任务拆解 + +* 方向头脑风暴 +* 具体细节明确 +* 实施方案是如何的 + +### 2. 生产力工具 + +* 网络 +* 电脑 +* 朋友 + +### 3. 完成后的激励 + +* 看一本电影 +* 玩一会游戏 + +## 三、环境 + +### 1. 消除分心 + +* 把自己心态调整好 +* 让自己处于明朗的环境中 + +### 2. 减少干扰 + +* 施小肉不在的时候 + +## 四、态度 + +### 1. 合理安排 + +* 时间:2023-09-24周末完成大纲 +* 细节:下周二完成网上的调查,下周四摸索线下的调查 + +### 2. 量力而行 + +* 第一点:改变自己的态度 +* 第二点:去做事情 diff --git a/content/posts/5.Daily/2023-09/2023-09-25.md b/content/posts/5.Daily/2023-09/2023-09-25.md new file mode 100644 index 0000000..50ec923 --- /dev/null +++ b/content/posts/5.Daily/2023-09/2023-09-25.md @@ -0,0 +1,5 @@ +--- +title: "2023-09-25" +date: 2023-09-25T16:18:23+08:00 +categories: ["Daily"] +--- diff --git a/content/posts/5.Daily/2023-10/2023-10-10.md b/content/posts/5.Daily/2023-10/2023-10-10.md new file mode 100644 index 0000000..1f58e4d --- /dev/null +++ b/content/posts/5.Daily/2023-10/2023-10-10.md @@ -0,0 +1,7 @@ +--- +title: "2023-10-10" +date: 2023-10-10T16:47:47+08:00 +categories: ["Daily"] +--- + +今天入职了外包,心情非常的低落,真的不知道自己原来混的这么惨 diff --git a/content/posts/5.Daily/_index.md b/content/posts/5.Daily/_index.md new file mode 100644 index 0000000..0eab4f3 --- /dev/null +++ b/content/posts/5.Daily/_index.md @@ -0,0 +1,8 @@ +--- +title: "每日记录" +date: 2023-04-15T10:42:22+08:00 +categories: ["Daily"] + +--- + +每日记录,按照每月进行拼写 \ No newline at end of file diff --git a/content/posts/TODO.md b/content/posts/TODO.md new file mode 100644 index 0000000..1ffb039 --- /dev/null +++ b/content/posts/TODO.md @@ -0,0 +1,27 @@ +--- +title: "TodoList" +date: 2023-09-25T16:19:17+08:00 +tags: [""] +categories: ["Tech"] +--- + +# Todo List + +- [x] 整理看奥运线路及计划 +- [x] 学习Vue +- [ ] 梳理人脉关系 +- [ ] 拍视频应该怎么弄 + + + + + +生活 + +工作 + +学习 + +拖延 + +休息 \ No newline at end of file diff --git a/content/posts/_index.md b/content/posts/_index.md new file mode 100644 index 0000000..1c12405 --- /dev/null +++ b/content/posts/_index.md @@ -0,0 +1,81 @@ +--- +title: "Micah" +date: 2022-05-21T20:27:49+08:00 +--- + +My Word, My WIKI. + +## 学习 (Learning) (关于个人学习的,包括记录学习笔记、读书笔记、思考总结以及制定个人规划等内容) + + * 学习笔记 (Study Notes) (指记录自己在学习过程中的笔记,包括课堂笔记、阅读笔记、笔记总结等) + * 课程笔记 + * 学习技巧 + * 讲座笔记 + * 读书笔记 (Reading Notes) (指读书时记录的笔记,包括书摘、注释、心得等) + * 书籍摘录 + * 书评心得 + * 思考总结 (Reflections) (指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果) + * 观点思考 + * 人生感悟 + * 个人规划 (Personal Planning) (指个人未来发展方向的规划,包括目标设定、时间安排、职业规划等) + * 目标设定 + * 行动计划 + +## 工作 (Work) (关于职业工作的,包括任务管理、日程安排、团队管理和报告撰写等内容,有助于提高工作效率) + + * 任务管理 (Task Management) (指工作中对任务的管理和分配,旨在提高工作效率和任务完成质量) + * 任务分配 + * 任务进度跟踪 + * 任务优先级排序 + * 任务提醒 + * 任务归档记录 + * 日程安排 (Scheduling) (指对工作和生活中的日程进行安排和规划,以保证时间利用的最大化和效率的最大化) + * 日程规划 + * 日程提醒 + * 日程分享 + * 日程调整 + * 团队管理 (Team Management) (指对团队的管理和领导,包括协调、沟通、激励等) + * 团队成员管理 + * 团队协作工具选择 + * 团队沟通管理 + * 团队目标设定 + * 团队绩效考核 + * 报告撰写 (Report Writing) (指工作中撰写各类报告的能力,包括调研报告、年度报告、销售报告等) + * 报告内容规划 + * 报告数据收集 + * 报告分析 + * 报告撰写 + * 报告修改 + +## 生活 (Lifestyle) (关于日常生活的,包括健康管理、家庭事务、旅行规划、美食和减肥等内容,有助于提高生活品质和健康状况) + + * 健康管理 (Health) (指对自身身体健康和精神健康的管理,包括运动、饮食、心理健康等) + * 饮食习惯 + * 运动计划 + * 睡眠监测 + * 医疗记录 + * 家庭事务 (Family Affairs) (指家庭生活中需要处理的事务,包括孩子教育、家务分工、家庭财务等) + * 家务安排 + * 购物清单 + * 家庭预算 + * 旅行规划 (Travel Planning) (指旅行前的规划和安排,包括交通、住宿、景点等) + * 目的地探索 + * 行程安排 + * 预订记录 + * 游记分享 + * 美食 (Food) (指对各种美食的探索和品尝) + * 菜谱收集 + * 餐厅推荐 + * 食材采购 + * 烹饪记录 + * 减肥 (Weight Loss) (指对身体体重的管理和控制,包括健康饮食、运动减肥等) + * 饮食计划 + * 运动记录 + * 体重监测 + * 健康饮食建议 + +## 娱乐 (Entertainment) (关于休闲娱乐的,包括记录电影、游戏等方面的内容,以及汽车和摩托车等车辆方面的兴趣爱好) + + * 电影/游戏 (Movies/Games) (指休闲娱乐中观看电影和玩游戏的活动) + * 汽车/摩托 (Cars/Motorcycles) (指对汽车和摩托车的兴趣爱好和了解) + diff --git a/hugo.toml b/hugo.toml index 10bfad7..0213486 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,4 +1,12 @@ -baseURL = 'https://example.org/' +baseURL = 'https://micah.wiki/' locale = 'en-us' -title = 'My New Hugo Project' +title = "Micah's Space" theme = 'ananke' + +[markup] + [markup.goldmark] + [markup.goldmark.extensions] + strikethrough = false + [markup.goldmark.extensions.extras] + [markup.goldmark.extensions.extras.delete] + enable = true \ No newline at end of file