1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[dcos update]jwt&sso

This commit is contained in:
guide 2022-08-27 12:16:32 +08:00
parent d22f123a55
commit c941692e6c
24 changed files with 63 additions and 66 deletions

View File

@ -5,11 +5,11 @@ category: 分布式
## 何为网关?为什么要网关?
![微服务-网关](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)
微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。
综上:**一般情况下,网关都会提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、容灾、日志、监控这些功能。**
![网关示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/api-gateway-overview.png)
一般情况下,网关可以为我们提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、降级熔断、日志、监控等功能。
上面介绍了这么多功能,实际上,网关主要做了一件事情:**请求过滤** 。
@ -27,7 +27,7 @@ Zuul 主要通过过滤器(类似于 AOP来过滤请求从而实现网
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>

View File

@ -5,35 +5,31 @@ category: 分布式
## 分布式 ID 介绍
### 何为 ID
### 什么是 ID
日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/up-79beb853b8319f850638c9708f83039dfda.png)
我们现实生活中也有各种 ID比如身份证 ID 对应且仅对应一个人、地址 ID 对应且仅对应
简单来说,**ID 就是数据的唯一标识**。
### 何为分布式 ID
### 什么是分布式 ID
分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。
我简单举一个分库分表的例子。
我司的一个项目,使用的是单机 MySQL 。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。
单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC
我司的一个项目,使用的是单机 MySQL 。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC
在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。**我们如何为不同的数据节点生成全局唯一主键呢?**
![](https://oscimg.oschina.net/oscnet/up-d78d9d5362c71f4713a090baf7ec65d2b6d.png)
这个时候就需要生成**分布式 ID**了。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/id-after-the-sub-table-not-conflict.png)
### 分布式 ID 需要满足哪些要求?
![](https://img-blog.csdnimg.cn/20210610082309988.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/distributed-id-requirements.png)
分布式 ID 作为分布式系统中必不可少的一环,很多地方都要用到分布式 ID。
@ -59,7 +55,7 @@ category: 分布式
这种方式就比较简单直白了,就是通过关系型数据库的自增主键产生来唯一的 ID。
![](https://img-blog.csdnimg.cn/20210610081957287.png)
![数据库主键自增](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/the-primary-key-of-the-database-increases-automatically.png)
以 MySQL 举例,我们通过下面的方式即可。
@ -121,7 +117,7 @@ CREATE TABLE `sequence_id_generator` (
`current_max_id` 字段和`step`字段主要用于获取批量 ID获取的批量 id 为: `current_max_id ~ current_max_id+step`
![](https://img-blog.csdnimg.cn/20210610081149228.png)
![数据库号段模式](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/database-number-segment-mode.png)
`version` 字段主要用于解决并发问题(乐观锁),`biz_type` 主要用于表示业务类型。
@ -171,7 +167,7 @@ id current_max_id step version biz_type
#### NoSQL
![](https://img-blog.csdnimg.cn/2021061008245858.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/nosql-distributed-id.png)
一般情况下NoSQL 方案使用 Redis 多一些。我们通过 Redis 的 `incr` 命令即可实现对 id 原子顺序递增。
@ -199,7 +195,7 @@ OK
除了 Redis 之外MongoDB ObjectId 经常也会被拿来当做分布式 ID 的解决方案。
![](https://img-blog.csdnimg.cn/20210207103320582.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/mongodb9-objectId-distributed-id.png)
MongoDB ObjectId 一共需要 12 个字节存储:
@ -228,7 +224,7 @@ UUID.randomUUID()
[RFC 4122](https://tools.ietf.org/html/rfc4122) 中关于 UUID 的示例是这样的:
![](https://img-blog.csdnimg.cn/20210202110824430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/rfc-4122-uuid.png)
我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。
@ -241,7 +237,7 @@ UUID.randomUUID()
下面是 Version 1 版本下生成的 UUID 的示例:
![](https://img-blog.csdnimg.cn/20210202113013477.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
![Version 1 版本下生成的 UUID 的示例](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/version1-uuid.png)
JDK 中通过 `UUID``randomUUID()` 方法生成的 UUID 的版本默认为 4。
@ -277,7 +273,7 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
- **第 42~52 位** :一共 10 位,一般来说,前 5 位表示机房 ID后 5 位表示机器 ID实际项目中可以根据实际情况调整。这样就可以区分不同集群/机房的节点。
- **第 53~64 位** :一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。
![](https://oscimg.oschina.net/oscnet/up-a7e54a77b5ab1d9fa16d5ae3a3c50c5aee9.png)
![Snowflake 示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/snowflake-distributed-id-schematic-diagram.png)
如果你想要使用 Snowflake 算法的话,一般不需要你自己再造轮子。有很多基于 Snowflake 算法的开源实现比如美团 的 Leaf、百度的 UidGenerator并且这些开源实现对原有的 Snowflake 算法进行了优化。
@ -296,13 +292,13 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
不过UidGenerator 对 Snowflake(雪花算法)进行了改进,生成的唯一 ID 组成如下。
![](https://oscimg.oschina.net/oscnet/up-ad5b9dd0077a949db923611b2450277e406.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/uidgenerator-distributed-id-schematic-diagram.png)
可以看出,和原始 Snowflake(雪花算法)生成的唯一 ID 的组成不太一样。并且,上面这些参数我们都可以自定义。
UidGenerator 官方文档中的介绍如下:
![](https://oscimg.oschina.net/oscnet/up-358b1a4cddb3675018b8595f66ece9cae88.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/distributed-system/uidgenerator-introduction-official-documents.png)
自 18 年后UidGenerator 就基本没有再维护了,我这里也不过多介绍。想要进一步了解的朋友,可以看看 [UidGenerator 的官方介绍](https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md)。
@ -353,8 +349,8 @@ Tinyid 的原理比较简单,其架构如下图所示:
Tinyid 的优缺点这里就不分析了,结合数据库号段模式的优缺点和 Tinyid 的原理就能知道。
## 分布式 ID 生成方案总结
## 总结
这篇文章,我基本上已经把最常见的分布式 ID 生成方案都总结了一波。
通过这篇文章,我基本上已经把最常见的分布式 ID 生成方案都总结了一波。
除了上面介绍的方式之外,像 ZooKeeper 这类中间件也可以帮助我们生成唯一 ID。**没有银弹,一定要结合实际项目来选择最适合自己的方案。**

View File

@ -0,0 +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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -0,0 +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>

View File

@ -0,0 +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>

View File

@ -0,0 +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>

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2022-08-27T03:15:10.950Z" 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="l6lXO6AyrE02C_dMUUYN" version="13.4.5" type="device"><diagram id="AoLO9L31ap1mW669uqHp" name="Page-1">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</diagram></mxfile>

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2022-08-27T03:13:28.105Z" 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="at0PplrikUR0x77rzQlI" version="13.4.5" type="device"><diagram id="KqvGlcIrSy4YJwzD9Kjx" name="Page-1">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</diagram></mxfile>

View File

@ -11,11 +11,11 @@ tag:
我们非常有必要将这两个理论搞懂,并且能够用自己的理解给别人讲出来。
## CAP理论
## CAP 理论
[CAP 理论/定理](https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)起源于 2000年由加州大学伯克利分校的Eric Brewer教授在分布式计算原理研讨会PODC上提出因此 CAP定理又被称作 **布鲁尔定理Brewers theorem**
[CAP 理论/定理](https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)起源于 2000 年,由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会PODC上提出因此 CAP 定理又被称作 **布鲁尔定理Brewers theorem**
2年后麻省理工学院的Seth Gilbert和Nancy Lynch 发表了布鲁尔猜想的证明CAP理论正式成为分布式领域的定理。
2 年后,麻省理工学院的 Seth Gilbert Nancy Lynch 发表了布鲁尔猜想的证明CAP 理论正式成为分布式领域的定理。
### 简介
@ -47,7 +47,7 @@ CAP 理论的提出者布鲁尔在提出 CAP 猜想的时候,并没有详细
>
> 简而言之就是CAP 理论中分区容错性 P 是一定要满足的,在此基础上,只能满足可用性 A 或者一致性 C。
因此,**分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。** 比如 ZooKeeper、HBase 就是 CP 架构Cassandra、Eureka 就是 AP 架构Nacos 不仅支持 CP 架构也支持 AP 架构。
因此,**分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。** 比如 ZooKeeper、HBase 就是 CP 架构Cassandra、Eureka 就是 AP 架构Nacos 不仅支持 CP 架构也支持 AP 架构。
**为啥不可能选择 CA 架构呢?** 举个例子:若系统出现“分区”,系统中的某个节点在进行写操作。为了保证 C 必须要禁止其他节点的读写操作,这就和 A 发生冲突了。如果为了保证 A其他节点的读写操作正常的话那就和 C 发生冲突了。
@ -89,7 +89,7 @@ CAP 理论的提出者布鲁尔在提出 CAP 猜想的时候,并没有详细
## BASE 理论
[BASE 理论](https://dl.acm.org/doi/10.1145/1394127.1394128)起源于 2008 年, 由eBay的架构师Dan Pritchett在ACM上发表。
[BASE 理论](https://dl.acm.org/doi/10.1145/1394127.1394128)起源于 2008 年, 由 eBay 的架构师 Dan Pritchett ACM 上发表。
### 简介
@ -115,7 +115,7 @@ CAP 理论这节我们也说过了:
![BASE理论三要素](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAxOC81LzI0LzE2MzkxNDgwNmQ5ZTE1YzY?x-oss-process=image/format,png)
#### 1. 基本可用
#### 基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性。但是,这绝不等价于系统不可用。
@ -124,11 +124,11 @@ CAP 理论这节我们也说过了:
- **响应时间上的损失**: 正常情况下,处理用户请求需要 0.5s 返回结果,但是由于系统出现故障,处理用户请求的时间变为 3 s。
- **系统功能上的损失**:正常情况下,用户可以使用系统的全部功能,但是由于系统访问量突然剧增,系统的部分非核心功能无法使用。
#### 2. 软状态
#### 软状态
软状态指允许系统中的数据存在中间状态(**CAP 理论中的数据不一致**),并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
#### 3. 最终一致性
#### 最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
@ -146,7 +146,7 @@ CAP 理论这节我们也说过了:
> - **读时修复** : 在读取数据时,检测数据的不一致,进行修复。比如 Cassandra 的 Read Repair 实现,具体来说,在向 Cassandra 系统查询数据的时候,如果检测到不同节点 的副本数据不一致,系统就自动修复数据。
> - **写时修复** : 在写入数据,检测数据的不一致时,进行修复。比如 Cassandra 的 Hinted Handoff 实现。具体来说Cassandra 集群的节点之间远程写数据的时候,如果写失败 就将数据缓存下来,然后定时重传,修复数据的不一致性。
> - **异步修复** : 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。
> - **异步修复** : 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。
比较推荐 **写时修复**,这种方式对性能消耗比较低。

View File

@ -39,7 +39,7 @@ RBAC 即基于角色的权限访问控制Role-Based Access Control。这
简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系,如下图
![RBAC](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/booksRBAC.png)
![RBAC 权限模型示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/security/design-of-authority-system/rbac.png)
**在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。**
@ -55,7 +55,7 @@ RBAC 即基于角色的权限访问控制Role-Based Access Control。这
## 什么是 Cookie ? Cookie 的作用是什么?
![](https://img-blog.csdnimg.cn/20210615162505880.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/security/cookie-sessionId.png)
`Cookie``Session` 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
@ -136,7 +136,7 @@ public String readAllCookies(HttpServletRequest request) {
关于这种认证方式更详细的过程如下:
![](./images/basis-of-authority-certification/session-cookie.png)
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/security/session-cookie-authentication-process.png)
1. 用户向服务器发送用户名、密码、验证码用于登陆系统。
2. 服务器验证通过后,服务器为用户创建一个 `Session`,并将 `Session` 信息存储起来。
@ -203,31 +203,31 @@ XSS 中攻击者会用各种方式将恶意代码注入到其他用户的页面
推荐阅读:[如何防止 CSRF 攻击?—美团技术团队](https://tech.meituan.com/2018/10/11/fe-security-csrf.html)
## 什么是 Token?什么是 JWT?
## 什么是 JWT?JWT 由哪些部分组成?
我们在前面的问题中探讨了使用 `Session` 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 `Session` 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 `Session` 信息服务器的可用性、不适合移动端(依赖 `Cookie`)等等。
[JWT 基础概念详解](./jwt-intro.md)
**有没有一种不需要自己存放 `Session` 信息就能实现身份验证的方式呢?**
## 如何基于 JWT 进行身份验证? 如何防止 JWT 被篡改?
有的!我们基于 `Token`(令牌) 来做身份验证即可!我们这里说的是 Acesss Token指的是访问资源接口API时所需要的凭证比如说你访问 Github 的一些 API 的时候,需要带上一个 Token 来表明你有权访问。
[JWT 基础概念详解](./jwt-intro.md)
JWT JSON Web Token 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称也可以看出JWT 本身也是 Token一种规范化之后的 JSON 结构的 Token。
JWT 由 Header、Payload、Signature签名 这三部分组成,本质上就是一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者可以验证它的真实性。
通过 JWT ,服务器端就不需要保存 `Session` 了,只用在客户端保存服务端返回的 `Token` 就可以了,扩展性得到提升。
可以看出,**JWT 更符合设计 RESTful API 时的「Stateless无状态」原则** 。
下面是 [RFC 7519](https://tools.ietf.org/html/rfc7519) 对 JWT 做的较为正式的定义。
> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519)
## 什么是 SSO?
## 什么是 SSO?
SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东国际、京东生鲜等子系统。
![sso](./images/basis-of-authority-certification/sso.png)
![SSO 示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/security/sso.png)
## SSO 有什么好处?
- **用户角度** :用户能够做到一次登录多次使用,无需记录多套用户名和密码,省心。
- **系统管理员角度** : 管理员只需维护好一个统一的账号中心就可以了,方便。
- **新系统开发角度:** 新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时。
## 如何设计实现一个 SSO 系统?
[SSO 单点登录详解](./sso-intro.md)
## 什么是 OAuth 2.0
@ -239,10 +239,6 @@ OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了
另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。
微信支付账户相关参数:
![](./images/basis-of-authority-certification/微信支付-fnglfdlgdfj.jpeg)
下图是 [Slack OAuth 2.0 第三方登录](https://api.slack.com/legacy/oauth)的示意图:
![](https://img-blog.csdnimg.cn/20210615151716340.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -127,7 +127,7 @@ HMACSHA256(
在基于 JWT 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。
![jwt](./images/basis-of-authority-certification/jwt.png)
![ JWT 身份验证示意图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/system-design/jwt/jwt-authentication%20process.png)
简化后的步骤如下:

View File

@ -11,10 +11,9 @@ tag:
### 什么是 SSO
SSO 英文全称 Single Sign On单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike.baidu.com/item/SSO/3451380
SSO 英文全称 Single Sign On单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
例如访问在网易账号中心https://reg.163.com/ )登录之后
访问以下站点都是登录状态
例如你登录网易账号中心https://reg.163.com/ )之后访问以下站点都是登录状态。
- 网易直播 [https://v.163.com](https://v.163.com/)
- 网易博客 [https://blog.163.com](https://blog.163.com/)