Gitee

架构设计 | 接口幂等性原则,防重复提交Token管理

风格不统一 提交于 2020-08-19 13:53:34
本文源码: GitHub·点这里 || GitEE·点这里 一、幂等性概念 1、幂等简介 编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。就是说,一次和多次请求某一个资源会产生同样的作用影响。 2、HTTP请求 遵循Http协议的请求,越来越强调Rest请求风格,可以更好的规范和理解接口的设计。 GET:用于获取资源,不应有副作用,所以是幂等的; POST:用于创建资源,重复提交POST请求可能产生两个不同的资源,有副作用不满足幂等性; PUT:用于更新操作,重复提交PUT请求只会对其URL中指定的资源有副作用,满足幂等性; DELETE:用于删除资源,有副作用,但它应该满足幂等性; HEAD:和GET本质是一样的,但HEAD不含有呈现数据,仅是HTTP头信息,没有副作用,满足幂等性; OPTIONS:用于获取当前URL所支持的请求方法,满足幂等性; 二、场景业务分析 1、订单支付 实际开发中,经常会面对订单支付问题,基本流程如下: 客户端发起订单支付请求 ; 支付前系统本地相关业务处理 ; 请求第三方支付服务执行扣款; 第三方支付返回处理结果; 本地服务基于支付结果响应客户端; 该业务流程中要处理相当复杂的问题,比如事务,分布式事务,接口延迟超时,客户端重复提交等等,这里只基于幂等接口角度来看该流程,其他问题后续再聊。 2、幂等接口

《Java8实战》笔记(09):默认方法

泄露秘密 提交于 2020-08-19 13:48:39
默认方法 本文的源码 实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现 。但是,一旦类库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题。现实情况是,现存的实体类往往不在接口设计者的控制范围之内,这些实体类为了适配新的接口约定也需要进行修改。由于Java 8的API在现存的接口上引入了非常多的新方法,这种变化带来的问题也愈加严重,一个例子就是像Guava和Apache Commons这样的框架现在都需要修改实现了List接口的所有类,为其添加sort方法的实现。 Java 8为了解决这一问题引入了一种新的机制。Java 8中的接口现在支持在声明方法的同时提供实现!通过两种方式可以完成这种操作。 Java 8允许在接口内声明静态方法。 Java 8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。 换句话说, 接口能提供方法的具体实现 。因此,实现接口的类如果不显式地提供该方法的具体实现,就会自动继承默认的实现。这种机制可以使你平滑地进行接口的优化和演进。实际上,到目前为止你已经使用了多个默认方法。 两个例子 List接口中的sort方法是Java 8中全新的方法,它的定义如下: default void sort(Comparator<? super E> c){ Collections.sort(this, c);

使用git命令上传本地项目到gitee远程仓库

巧了我就是萌 提交于 2020-08-19 13:36:38
少就是多 正文 感谢点赞 正文 今天说说怎么通过git基本命令把本地项目成功上传到Gitee远端仓库(GitHub类似)。主要是防止遗忘,方便复盘,默认已经配置好公钥私钥。 首先在个人Gitee账户创建一个用来存放项目的仓库,然后点击克隆/下载按钮选择地址复制,个人喜欢SSH地址。 在本地项目文件夹下打开 Git Bash ,初始化本地仓库: git init 发现当前目录下多了一个 .git 文件夹,表示成功初始化本地 git 仓库。 还记得之前复制的 Gitee 仓库地址吗?没错,现在要用到它了: //关联本地仓库和远端仓库 git remote add origin (刚刚复制的地址/不要写括号) 如果之前在 Gitee 上创建仓库时选了README.md初始化仓库的,需要更新下本地仓库,以免上传项目时产生冲突: //当然,没有选 README.md 的同学也可以敲下,权当练手了 git pull --rebase origin master 因为 Git 的结构,我们先将项目上传到本地暂存区: //添加项目所有发生改变的文件 git add . //Git 强烈建议在提交代码时备注信息 git commit -m '你的备注信息可以是中文' 如果这时 Git Bash 弹出信息问你是谁,那么代表你是第一次在本机上使用 Git,那就告诉它你的大名吧: git config -

雷军喜提金山云上市,幕后大佬求伯君甘做“背景板”

限于喜欢 提交于 2020-08-19 13:34:58
   年初,雷军在疫情期间首场云发布会的画面,还尚未远去,就又上演了“云敲钟”和“云上市”。    北京时间 5 月 8 日晚,雷军任董事长的金山集团子公司——金山云,敲响“云上市”纳斯达克的钟声。    一天之内,雷军身价增加百亿元,并成为中国第九富豪。怪不得人常说“雷军是这个大环境中,普通人靠努力所达到的上限。”    受疫情影响,上市仪式在北京小米科技园、以连线美国相关人员的方式进行。    尽管如此,他还是按照上市惯例,“将头发梳成大人模样,穿上一身帅气西装”,来到搭好的舞台下,喜提名下第四家上市公司。    在此之前,在港交所上市的金山软件和小米集团,以及在科创板上市的金山办公,都是雷军创办或参股的公司。 图 | 金山云上市(来源:金山云)   不过,一如小米上市时、他曾说不喜欢穿西服一样,仪式结束后,他就换上了便装上衣。程序员的穿衣风格,果然影随至今。      图 | 金山云上市庆祝宴,雷军切蛋糕庆祝(来源:雷建平)   微博上,有人问雷军和金山有什么关系。    事实上,金山是雷军进入社会的第一个东家,从二十多岁毕业至今,他早已成为多家“金山系”公司背后的最大操盘手。    而他“触电”金山,是因为 WPS 汉卡。    1990 年,雷军朋友那里有一套金山创始人求伯君开发的 WPS 汉卡软件。    这个软件,既有颜值、业务能力也很抗打,用它来打印文件

《Java8实战》笔记(14):函数式编程的技巧

a 夏天 提交于 2020-08-19 12:44:18
函数式编程的技巧 无处不在的函数 术语“函数式编程”意指函数或者方法的行为应该像“数学函数”一样—— 没有任何副作用。 对于使用函数式语言的程序员而言,这个术语的范畴更加宽泛,它还意味着函数可以像任何其他值一样随意使用:可以作为参数传递,可以作为返回值,还能存储在数据结构中。 能够像普通变量一样使用的函数称为 一等函数 (first-class function)。这是Java 8补充的全新内容:通过::操作符,你可以创建一个方法引用,像使用函数值一样使用方法,也能使用Lambda表达式(比如,(int x) -> x + 1)直接表示方法的值。Java 8中使用下面这样的方法引用将一个方法引用保存到一个变量是合理合法的: Function<String, Integer> strToInt = Integer::parseInt; 高阶函数 目前为止,我们使用函数值属于一等这个事实只是为了将它们传递给Java 8的流处理操作),达到行为参数化的效果。 Comparator<Apple> c = comparing(Apple::getWeight); Function<String, String> transformationPipeline = addHeader.andThen(Letter::checkSpelling) .andThen(Letter:

《Java8实战》笔记(13):函数式的思考

拥有回忆 提交于 2020-08-19 00:47:32
函数式的思考 实现和维护系统 为了让程序易于使用,你还希望它具备哪些特性呢? 你会希望它具有良好的结构,最好类的结构应该反映出系统的结构,这样能便于大家理解; 甚至软件工程中还提供了指标,对结构的合理性进行评估,比如耦合性(软件系统中各组件之间是否相互独立)以及内聚性(系统的各相关部分之间如何协作)。 对大多数程序员而言,最关心的日常要务是代码维护时的调试:代码遭遇一些无法预期的值就有可能发生崩溃。 为什么会发生这种情况? 它是如何进入到这种状态的? 想想看你有多少代码维护的顾虑都能归咎到这一类!很明显, 函数式编程提出的“无副作用”以及“不变性”对于解决这一难题是大有裨益的 。 共享的可变数据 无法预知的变量修改问题,都源于共享的数据结构被你所维护的代码中的多个方法读取和更新。 假设几个类同时都保存了指向某个列表的引用。 那么到底谁对这个列表拥有所属权呢? 如果一个类对它进行了修改,会发生什么情况? 其他的类预期会发生这种变化吗? 其他的类又如何得知列表发生了修改呢? 我们需要通知使用该列表的所有类这一变化吗? 抑或是不是每个类都应该为自己准备一份防御式的数据备份以备不时之需呢? 换句话说,由于使用了可变的共享数据结构,我们很难追踪你程序的各个组成部分所发生的变化 。 假设有这样一个系统,它不修改任何数据。维护这样的一个系统将是一个无以伦比的 美梦

Qt开源作品37-网络中转服务器

只愿长相守 提交于 2020-08-18 21:48:01
一、前言 用Qt做开发10年了,其中做过好多项目,基于现在web和移动互联网发展如此迅猛,大量的应用场景需要一个网络中转服务器,可以实现手机app或者其他客户端远程回控设备,现在物联网发展非常迅猛,这个将来也是大势所趋,所以有这个想法很久了,打算用Qt也来做个简单的网络中转服务器。 需求场景: 手机端或者其他端可以对设备进行回控,并查看设备各种运行状态,接收报警推送等。 同时支持在局域网、广域网、互联网访问,尤其是互联网访问。 权限控制,给定账号控制授权的设备,并自动拉取设备信息。 设备不在线要给出反馈信息提示以便分析。 每个连接都有自己的唯一编号作为标识符。 可以方便的拓展为微信接入+小程序接入+web接入。 二、代码思路 #include "tcpserver1.h" #include "quiwidget.h" TcpClient1::TcpClient1(QObject *parent) : QTcpSocket(parent) { ip = "127.0.0.1"; port = 6907; deviceID = "SSJC00000001"; connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(deleteLater())); connect(this, SIGNAL

思维导图视频代码揭秘RabbitMQ基本流程

柔情痞子 提交于 2020-08-18 21:13:54
思维导图、视频、代码携手揭秘RabbitMQ编程,干货多多,趣味多多! 目录 思维导读 视频 代码 思维导读 视频 链接:https://pan.baidu.com/s/1w0Iz9TomGwBj2-2ZkAr1IQ 提取码:n152 代码 https://gitee.com/cakin24/RabbitMQDemo/tree/master/src/main/java/com/rabbitmq 来源: oschina 链接: https://my.oschina.net/u/4347428/blog/4285895

vue-element-admin 后台动态加载菜单

纵饮孤独 提交于 2020-08-18 20:53:21
dynamic-router 项目地址 gitee 前端: 基于 vue-element-admin 延用公司 【用户中心】那一套自己魔改的版本,在此基础之上重构。 后端: Go 的语法简洁,开发速度快,所以后端使用了 Go 结合 Gin 框架,做了一个简单的 CURD 服务。(主要是因为没人手协助,也只好自己写一个了。)这里不过多介绍后端。 前言 动态路由 由于公司业务需要,在权限验证与安全方面,要求是菜单根据权限动态控制。 在现有的项目当中,通过基于 vue-element-admin 项目提供的菜单权限控制,无法满足公司的具体业务需要。 实际上主要的目的是通过后端控制菜单权限。 因此也迭代出了两个版本, 版本二 也只是提供一个设计思路,具体复杂实现基于此套是是可以满足的。这里只做简单的阐述,具体实现可以结合源码。 版本一 在公司项目 【用户中心】 中,我采用的是通过后端菜单列表以及权限标识,做深度递归和匹配。这么写一部分原因是因为是在现有的接口文档基础之上做 魔改 ,第二点也是因为代码耦合度比较高,重构的话周期长(前后端都需要改,前端工作量会很大)。 Interceptor router.beforeEach(async (to, from, next) => { NProgress.start(); if (getToken()) { if (to.path ===