# 开放平台 **Repository Path**: QuanbIn30/open-platform ## Basic Information - **Project Name**: 开放平台 - **Description**: 开放平台的代码,啊啊啊啊 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2023-02-08 - **Last Updated**: 2023-02-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目架构 > 整体是一个分布式的微服务的架构,使用springboot2.1x版本和springcloud G.x版本 ## 基础的拆分 1. 注册中心 openplatform-eureka 2. 配置中心 openplatform-config 3. 缓存服务 openplatform-cache ## 缓存 > 关于缓存的key的问题, key是唯一的,所以我们必须得有一个能区分数据的唯一标示,比如主键之类的,另外还要考虑我们这个数据在什么地方获取 获取的方式什么,一般来说 用户传递的参数中都会包含唯一的标识, 比如在我们的路由映射中,用户传递是别名,别名肯定是唯一的,所以它可以做key ## 网关 > 我们期望的网关是这样的: 我告诉你我要请求什么功能的名字,然后网关根据名字帮我们把请求转到一个真正的服务上面 ,并且具体到地址,我们经过分析的得知,首先得传递一个名字,第二,这个名字和真正的服务以及地址之间需要有一个映射关系 ## 路由的更新 > 我们已经把路由数据放到了本地,还少一步刷新,就是通过管理平台操作了路由信息数据后更新网关中的数据 我们可以使用mq通知的方式来实现吧,直接从缓存中拉取最新的数据,覆盖掉本地的 但是上面的方式太粗鲁了,我们要细腻一些,优雅一些,根据不同的操作来做不同的事情 比如管理平台做的是添加,网关中就直接是加载添加的那一条数据然后加到本地map 如果更新,更新哪个数据就从缓存中查询哪个数据,替换掉本地map中的数据 删除亦然 ## 安全 关于请求的数据安全问题 经过测试我们发现我们的请求很容易被抓包,被人分析数据,变的不安全,为了提升安全性,我们要加一些策略 #### 1. 校验手段 1. MDx 基于消息摘要算法的一种校验手段,不属于加密,虽然我们经常称呼它为加密,属于理论不可逆算法,就是根据明文可以算出md5值,但是根据md5值不能转回明文,包括后面的SHA家族也是一样 主要使用场景就是做密码的校验和签名校验 2. SHA,和MD5类似,只不过算法更精密,安全性能更高,长度更长,现在建议在安全要求比较高的场景下使用这个 #### 2 加密手段 > 在算法中,加密必须有对应的解密手段,一般情况下,使用密码的地方都是加密,加密分为两种, 对称加密和非对称加密 1. 加密密码和解密码是一样的称之为对称加密,常见的加密算法 des aes ,wifi密码就是aes (wpa wpa2) 2. 加密密码和解密码不一样的就是非对称加密, 常见的有RSA DSA >非对称分为两个密码 一个是公开的公钥,一个是私钥 ,公钥加密的数据需要使用对应的私钥来解密,反之亦然,公钥是公开的,可以给任何人 #### 历史 xxx锄奸队,要干掉某个叛逃的人,为什么要干掉他,无非两个原因, 1.他手中有所谓的xxx名单.2 他手中有密码本 密码本就是早期的加解密手段,密码本是一个对应关系 比如 a-z b-f c-d d-y, 那我们收到的是zfd实际内容就是abc,这种方式是置换加密 再往后就除了置换数据之外用矩阵进行位置的迁移,再往后加上了密码做位运算,算法内部按照顺序加密,然后逆向顺序解密 ### 时间戳 >客户端在发起请求的时候都要将当前的系统时间作为时间戳传递到服务端,服务端要时间戳的主要目的有两个 第一个是防止客户端和服务端存在时间差,第二个目的是防止请求在中途被拦截篡改数据,因为拦截和篡改是需要时间的,所以我们对请求做了时间限制,两者时间差超过多少的就认为被拦截篡改了 ## 幂等性 >幂等指的是相同的操作总是会得到相同的结果,比如我们查询id为1的数据,不管查询多少次,结果都是一样的,添加不是,添加属于非幂等性操作,因为我们添加完成后刷新页面会再次添加一条数据,数据的id会发生变化 这种类型的操作就是非幂等性的 >但是在实际开发中,我们会对这一类非幂等性的操作做出幂等性要求 ### 下单 下单需要做防止重复刷新下单,也就是我得知道你这次的下单是不是刷新来的,而不是手动点提交过来的 刷新是指的已经手动提交过一次了 我们可以通过在服务器生成一个只有一次的数据,返回给客户端,客户端发起请求的时候携带过来,我们判断一下,这个数据有没有,有的话就删除并继续操作 没有就代表已经提交过了,现在是刷新的请求 方式2:刷新传递的参数和之前的参数是完全一模一样的,所以我们可以使用签名的方式来进行判断,首次提交的时候生成的签名,去redis中查看有没有这个key,没有就代表是第一次请求,有就代表已经提交过了 ### MQ动态更新路由 >要求需要根据操作的类型来进行对应的操作,比如webmaster做的是添加, gateway就只查询新添加的那一条数据更新回本地, gateway更新也是只更新webmaster更新的数据 webmaster删除什么数据,gateway就删除什么数据 ## 计费 我们有一些接口是需要收费的,所以我们需要在处理之前就要看一下用户有没有足够的钱,有的话最后要扣掉, 但是后面可能会出现异常,在出现异常的情况下,应该给用户返回钱 计费的方式会有很多,比如每次都计费,也可以每隔一段时间比如一小时统计一次费用 ## 接口的请求次数限流 >我们的一些接口虽然是免费的,不限制幂等性的,但是也不能一直无限制调用,我们需要进行限制, 比如同一个接口一分钟只能调用1次,一小时只能调用5次,一个用户一个月最多调用所有的免费接口不能超过多少次 利用redis的有序set, 分数就是存放时候的时间的毫秒值,每次放之前先看看在我们允许的时间差范围内有没有超出指定的数量 比如我们是10:00:00放的,那么我们要求肯定是09:59:00到10:00:00之间是没有数据的,而这两个时间可以转换为毫秒值来进行分数区间的判断 也就是我们有序set中的分数就是时间的毫秒值 ## 权限 >权限框架的作用: 判断用户是否有权限访问正在访问的地址 >核心内容: 当前的用户是谁 ,当前访问的地址是什么, 地址需要什么权限, 用户有什么权限 #### 粗粒度版本 ### 开放平台回顾 1. 什么是开放平台? 2. 开放平台的架构? 分布式的微服务 3. 主要的模块: 1. 注册中心,服务的注册和发现的. 2. 配置中心,保存各种配置文件的 3. 缓存中心, 主要是操作缓存的 4. 通用的commons, 封装了一些了通用的常量或者是一些自定义的异常等 5. 网关模块,作为程序的唯一的入口,通过动态路由实现服务的转发,中间包含各种策略,内置了mq来实现动态刷新规则的功能 6. 管理模块, 主要作用是对开放平台中的一些数据进行管理,比如路由表,比如系统参数,实际上限流策略等都是通过管理平台修改的 7. 登录中心, 作为统一的登录入口, 通过jwt实现去中心化的校验 ### 日志 >我们需要记录每个应用访问过的数据信息,目的是为了后续的时候做一些统计,计算等,记录日志是一个非必要的核心操作,也就是说在应用的整个请求流程中,记录日志属于可有可无的,几遍不记录日志,对业务本身也没有任何的影响 这个时候日志就可以做成异步操作,或者是将一个操作转成多个操作同时执行,来提升效率,但是最终还要同步等待结果的也可以做成异步的