Skip to content

Commit c941692

Browse files
committed
[dcos update]jwt&sso
1 parent d22f123 commit c941692

24 files changed

+58
-61
lines changed

docs/distributed-system/api-gateway.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ category: 分布式
55

66
## 何为网关?为什么要网关?
77

8-
![微服务-网关](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E7%BD%91%E5%85%B3.png)
9-
108
微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。
119

12-
综上:**一般情况下,网关都会提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、容灾、日志、监控这些功能。**
10+
![网关示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/api-gateway-overview.png)
11+
12+
一般情况下,网关可以为我们提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、降级熔断、日志、监控等功能。
1313

1414
上面介绍了这么多功能,实际上,网关主要做了一件事情:**请求过滤**
1515

@@ -27,7 +27,7 @@ Zuul 主要通过过滤器(类似于 AOP)来过滤请求,从而实现网
2727

2828
```xml
2929
<dependency>
30-
<groupId>org.springframework.cloud</groupId>
30+
<groupId>org.springframework.cloud</groupId>
3131
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
3232
</dependency>
3333
<dependency>

docs/distributed-system/distributed-id.md

+17-21
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,31 @@ category: 分布式
55

66
## 分布式 ID 介绍
77

8-
### 何为 ID?
8+
### 什么是 ID?
99

1010
日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。
1111

12-
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/up-79beb853b8319f850638c9708f83039dfda.png)
13-
1412
我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID 对应且仅对应
1513

1614
简单来说,**ID 就是数据的唯一标识**
1715

18-
### 何为分布式 ID?
16+
### 什么是分布式 ID?
1917

2018
分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。
2119

2220
我简单举一个分库分表的例子。
2321

24-
我司的一个项目,使用的是单机 MySQL 。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。
25-
26-
单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)。
22+
我司的一个项目,使用的是单机 MySQL 。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)。
2723

2824
在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。**我们如何为不同的数据节点生成全局唯一主键呢?**
2925

30-
![](https://oscimg.oschina.net/oscnet/up-d78d9d5362c71f4713a090baf7ec65d2b6d.png)
31-
3226
这个时候就需要生成**分布式 ID**了。
3327

28+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/id-after-the-sub-table-not-conflict.png)
29+
3430
### 分布式 ID 需要满足哪些要求?
3531

36-
![](https://img-blog.csdnimg.cn/20210610082309988.png)
32+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/distributed-id-requirements.png)
3733

3834
分布式 ID 作为分布式系统中必不可少的一环,很多地方都要用到分布式 ID。
3935

@@ -59,7 +55,7 @@ category: 分布式
5955

6056
这种方式就比较简单直白了,就是通过关系型数据库的自增主键产生来唯一的 ID。
6157

62-
![](https://img-blog.csdnimg.cn/20210610081957287.png)
58+
![数据库主键自增](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/the-primary-key-of-the-database-increases-automatically.png)
6359

6460
以 MySQL 举例,我们通过下面的方式即可。
6561

@@ -121,7 +117,7 @@ CREATE TABLE `sequence_id_generator` (
121117

122118
`current_max_id` 字段和`step`字段主要用于获取批量 ID,获取的批量 id 为: `current_max_id ~ current_max_id+step`
123119

124-
![](https://img-blog.csdnimg.cn/20210610081149228.png)
120+
![数据库号段模式](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/database-number-segment-mode.png)
125121

126122
`version` 字段主要用于解决并发问题(乐观锁),`biz_type` 主要用于表示业务类型。
127123

@@ -171,7 +167,7 @@ id current_max_id step version biz_type
171167

172168
#### NoSQL
173169

174-
![](https://img-blog.csdnimg.cn/2021061008245858.png)
170+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/nosql-distributed-id.png)
175171

176172
一般情况下,NoSQL 方案使用 Redis 多一些。我们通过 Redis 的 `incr` 命令即可实现对 id 原子顺序递增。
177173

@@ -199,7 +195,7 @@ OK
199195

200196
除了 Redis 之外,MongoDB ObjectId 经常也会被拿来当做分布式 ID 的解决方案。
201197

202-
![](https://img-blog.csdnimg.cn/20210207103320582.png)
198+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/mongodb9-objectId-distributed-id.png)
203199

204200
MongoDB ObjectId 一共需要 12 个字节存储:
205201

@@ -228,7 +224,7 @@ UUID.randomUUID()
228224

229225
[RFC 4122](https://tools.ietf.org/html/rfc4122) 中关于 UUID 的示例是这样的:
230226

231-
![](https://img-blog.csdnimg.cn/20210202110824430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
227+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/rfc-4122-uuid.png)
232228

233229
我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。
234230

@@ -241,7 +237,7 @@ UUID.randomUUID()
241237

242238
下面是 Version 1 版本下生成的 UUID 的示例:
243239

244-
![](https://img-blog.csdnimg.cn/20210202113013477.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
240+
![Version 1 版本下生成的 UUID 的示例](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/version1-uuid.png)
245241

246242
JDK 中通过 `UUID``randomUUID()` 方法生成的 UUID 的版本默认为 4。
247243

@@ -277,7 +273,7 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
277273
- **第 42~52 位** :一共 10 位,一般来说,前 5 位表示机房 ID,后 5 位表示机器 ID(实际项目中可以根据实际情况调整)。这样就可以区分不同集群/机房的节点。
278274
- **第 53~64 位** :一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。
279275

280-
![](https://oscimg.oschina.net/oscnet/up-a7e54a77b5ab1d9fa16d5ae3a3c50c5aee9.png)
276+
![Snowflake 示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/snowflake-distributed-id-schematic-diagram.png)
281277

282278
如果你想要使用 Snowflake 算法的话,一般不需要你自己再造轮子。有很多基于 Snowflake 算法的开源实现比如美团 的 Leaf、百度的 UidGenerator,并且这些开源实现对原有的 Snowflake 算法进行了优化。
283279

@@ -296,13 +292,13 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
296292

297293
不过,UidGenerator 对 Snowflake(雪花算法)进行了改进,生成的唯一 ID 组成如下。
298294

299-
![](https://oscimg.oschina.net/oscnet/up-ad5b9dd0077a949db923611b2450277e406.png)
295+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/uidgenerator-distributed-id-schematic-diagram.png)
300296

301297
可以看出,和原始 Snowflake(雪花算法)生成的唯一 ID 的组成不太一样。并且,上面这些参数我们都可以自定义。
302298

303299
UidGenerator 官方文档中的介绍如下:
304300

305-
![](https://oscimg.oschina.net/oscnet/up-358b1a4cddb3675018b8595f66ece9cae88.png)
301+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/uidgenerator-introduction-official-documents.png)
306302

307303
自 18 年后,UidGenerator 就基本没有再维护了,我这里也不过多介绍。想要进一步了解的朋友,可以看看 [UidGenerator 的官方介绍](https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md)
308304

@@ -353,8 +349,8 @@ Tinyid 的原理比较简单,其架构如下图所示:
353349

354350
Tinyid 的优缺点这里就不分析了,结合数据库号段模式的优缺点和 Tinyid 的原理就能知道。
355351

356-
## 分布式 ID 生成方案总结
352+
## 总结
357353

358-
这篇文章中,我基本上已经把最常见的分布式 ID 生成方案都总结了一波。
354+
通过这篇文章,我基本上已经把最常见的分布式 ID 生成方案都总结了一波。
359355

360356
除了上面介绍的方式之外,像 ZooKeeper 这类中间件也可以帮助我们生成唯一 ID。**没有银弹,一定要结合实际项目来选择最适合自己的方案。**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-08-27T02:35:21.450Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="8fezQQz9yxfoljgvKI9c" version="13.4.5" type="device"><diagram id="Pys6DZk7E9bcndFZZQeS" name="Page-1">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</diagram></mxfile>
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-08-27T03:12:28.380Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="H2vgeN-ViHZieW4ml3QZ" version="13.4.5" type="device"><diagram id="4dBRQqYbX6Ulh3KiuhDa" name="Page-1">7VpZc+MoEP41qtp5sEuHJduPlo9sbe1uTa03O48pImGJBIEG4Wt+/YJAsi6PlcOTqUnKD4EGuqG/vkAxnHlyuGEgjf+iIcSGbYYHw1kYtm1Zpif+SMpRUSaurQgRQ6GedCKs0TeoiaamblEIs9pETinmKK0TA0oIDHiNBhij+/q0DcV1qSmIYIuwDgBuU7+gkMf6FPb4RP8doiguJFveVI0koJisT5LFIKT7CslZGs6cUcpVKznMIZbKK/Si1q3OjJYbY5DwPgu2t8d/zb//WU13iN1aq9uZffw20Fx2AG/1gfVm+bHQACThTCpS9AglgujHPMGiZ4lm9gh5IM9pyk5xQtlpb0/LgmFN43qzN5AmkLOjmLA/6dnVuosrKi5oDGLA0a6OE9BwRyW7UsJnisRObLMwTUfz0YbpFP2CRUa3LIB6VVWvDUb25AIjDlgEeYuRaFSOfSLlsD0BQvuFEIYgi2H4y+E5ei08W4yujKfzbl3youb7Qji6ZAtXhtBtIyY0vNZdynhMI0oAXp6oPqNbEuZ+KKE6zfmT0lQj+wA5P+oUCbacvq4fK+V+51SjnsbyYkd23zSejjr8z8Nc6jEFpAar93Urs7cfUEyZ4czk4aP73yy5RAg3q41Pue5FAUL4YAMShI9qQQIJpmpWIvAOdFswB4kA3i9FbBmCTIwQuG8Olsup2KLEsJSU5dYi5VjjoZseqkPqGHKMUJYAXBnba+eWg46pzMbEwvwgG0gRiETtlRwe+ABgFBE1huGGV0aQMG+ieZrFTvIRzgDJNoJTwZPoI+wpC+vyyoX3IHiMcp8ZNLRvu67SR7XxqSIuhAFlwkIpacoLUZZioIFBBKNiYIMp4I3ZXql8L8oR2jLpU3cJONwJA9M2I0xQmY2a1AoMckeCvo8Rh2sF3mIvSukXx/QdZIL3dx31UI/e2t9sT/crQd8ad0T9pl9WXbvmlE/1QO+sB0rjzIv9HPFFFQRnDOSvSjI3IKg76hlnazhX3ZlaQF8MB92eZ5u9LNesGK9Zsd/WNjIO07NWVpKVxn5e47Oa1fOkbX1dJYd9LeObXC6/Ms7oY3kdtBvaikEq5yWHSN6IhyJ07IMYMD4EhFCex507uUZHyoUOkxjcQ/yZZkgFpgVTZ/VTmecgW+6EjjMtg2k+ojuYmq+Q+5+Pl90TL8u9FmBW1x32I2F/JOxfNmHbzaeLN8/YVscd9ee/8Vz7JvPcl4TLT0zTfhfj17oSWT3eJN5zUnSaDvn2SdH9qKHfTQ3dNL/RW9fQVtcN7vwbZoBBlqHgBwf3H/SmaY6GjfesSb/g3YdVMw9c+WnMGn/gWvic2wRj9FxcO1hdD9f/HkY0+eLC2Zr6Myf2vtrOsfMrYC1ZXI7Pnq7zW4F+6RoT15jNjeXI8OfGdJxTVoYvGqucMvsD7MCN/M5bSL1nL5Q5NvyFMbVkY+Yb02kp6kGIyj8pDwPyxAhfjeZ5rTPXGVRfMDYI4wapqGYCKKsVQZAxHQUAz/RAgsIwr4W70ke9Ps5LIb/Me03h4gC6ThbBV/XnZYZ3/PxXL5LMHv7XykEdLtm/KrI6rimTrrLo6XlJdE9f0pVbnP4fwVn+Dw==</diagram></mxfile>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-08-27T03:06:20.012Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="suTAClOu8menI9C0PB9o" version="13.4.5" type="device"><diagram id="SA46lcTlQrTDV4wgisz-" name="Page-1">1Zhbb6M4FMc/jaXZh1RcAphHSJPujDSzD9Wqs48GTsBTg1Mgl86n32PjJJCQVUebaNpESsw5vsA5P/9tQ9xZuXuo2ar4KjMQxLGyHXHviePYtuXjn7K8dhbqOZ0hr3lmKh0Nj/wnGKNlrGueQTOo2EopWr4aGlNZVZC2Axura7kdVltKMRx1xXI4MzymTJxbn3jWFuYpnOBo/xN4XuxHtv2w85RsX9k8SVOwTG57JndO3FktZduVyt0MhArePi5du8UF7+HGaqjatzRIoVj9Vb08ffv5MmXBy+Mz24gJ7XrZMLE2D2xutn3dR6CW6yoD1YlN3Hhb8BYeVyxV3i3mHG1FWwrjPjykhRdLLsRMClnrjtylp76qUlvLZ+h5fP1RLWTV9uzdR7V4hjYtTLe5YE1jyudBMHHZQN3CrmcyQXkAWUJbv2IV4/VdkyBDqBOY6+0x39N9Eotert2pMTLDWH7o+5gGLJhM/EJW7JGs+AKHjZNBbvyXtaJHh23S6LkTYQXbX+10bPZ+LOX6f+4R6pGIqkJsE2qpQjgl0YLMpySmymJGwhtPDu0uM2G9gYl+8gaA9DOpnsFMf3uPwoKVXKi0zOS65lDjTXyD7QhZy6WTpmNkZX7ie/51QAmsISiuew6KPQaKfytOnJtxEpIoJiFy4iskooDMkQ2XxPcfEw/wL+ARhIl1JR2hwRCP6W/Hw72hjERzQsOjnnxAKsDOPAjGqAj9wGVXEg16Ihqe4/1mKqa3Fw2kYqHXlEAvLh8SjyVNYVw0EupNvWttPsL3JhrezfDwSeiTONQ7jTmJF9pCSeh+aE4yBnQ5yomfUkiWV5IR+t72HuFFTgpXncdMeI8glNkEqmySCJk+q/NRNimAZbzKu4ulTNdNH5sR1hK5U6ipNhq2RNYZ1BM0dy1OWaSGRTyM1TmvjBVK/LXQhb93Hl7pKoJXMNlHTte7c3q9Lg0OyiNYK4mDYVObZVYq5MwNFiA20PKUoa8CDMyJv2vVq6UuG1Y1kwZq3rFirWTDWy7N7daAw/ENdL60w0s78uSTZ3ddHP//GJ98JjXNilWXkrMSjFddLmCH9bIbJWP0UIK7S18fSvQ2UxVmag1xrM/3Ksy4tIQzfVyhJMItqa20I45JZCtLjGXdCKUkirS+RCSMh5XxtIP5XPQkpgvGMEBoVvhekB6crO2JvgwmfSUrOFEIY2KC55jQ+xQlALXEjdXURwJEZBwlzzI1zKigDSXvoowNxE6wBETM0udctz69xZ7i0SstZf7JOdo5l6jDkbkvUc4VJOqfL/ETldXOY/M8/Pr97+r7D/ofx2j1+Fc5Sc80bTMSBmbXE2NhoS3RF7ZhD+r11WEBrf/nmIE6gIW2KqidVngY6gcOpd+U3aVVD+XuMd81zG/HdOT9UKy/us+WdZJ5PhEG0+UC1CPoX+bcOdnRT0eWYjrCuf3rnOPl8QWh9vVes7rzfwE=</diagram></mxfile>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-08-27T03:08:13.594Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="VHbD_06wMAHpJu5GbBDK" version="13.4.5" type="device"><diagram id="ZbQv6ca3t_mRK-NZ940w" name="Page-1">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</diagram></mxfile>

0 commit comments

Comments
 (0)