UML类间关系
UML类间关系类的关系在UML类图中,常见的有以下几种关系:
泛化/继承(Generalization)
实现(Realization | Implementation)
关联(Association)
聚合(Aggregation)
组合(Composition)
依赖(Dependency)
泛化/继承(Generalization)【泛化关系】:是一种继承关系,表示一般与特殊的关系。它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。【关系描述】:”is a” relationship【箭头指向】:带空三角箭头的实线,箭头指向父类;【示例解析】:Apple(子类) 继承了 Fruit(父类);
实现(Realization | Implementation)【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。【箭头指向】:带三角箭头的虚线,箭头指向接口;【示例解析】:BattleState(实现类) 实现了 State(接口 | 抽象类);
组合(Composition)【组合关系】:是 [强]整体与部分的 ...
Java注解
注解 | AnnotationAnnotation就是代码里的特殊标记,这些标记可以在编译期、类加载期和运行时 被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变代码原有逻辑的前提下,在源文件中嵌入一些补充信息。Annotation可以像修饰符一样被使用,可用于修饰 包、类、构造器、方法、成员变量、方法参数、局部变量 的声明,这些信息被保存在Annotation的"name = value"键值对中。
元注解元注解的作用就是负责定义其他注解,Java定义了4个标准的meta-annotation 元注解类型,它们用于提供对其他annotation类型进行说明,这些元注解都在java.lang.annotation包中。
@Target:用于修饰一个Annotation的作用目标,用于描述注解的使用范围。
@Target(ElementType.TYPE) – 接口、类、枚举、注解
@Target(ElementType.FIELD) – 字段、枚举的常量
@Target(ElementType.METHOD) – 方法
@Tar ...
MySQL-重复插入处理
MySQL-重复插入处理实际开发中常见的重复插入场景:
前端未做防抖,重复调用insert方法
业务内部多次调用insert方法
高并发
解决方案:
Java业务代码层面 使用唯一性索引 和 try...catch...
SQL脚本层面 使用唯一性索引/主键索引 和 on duplicate update key ...
幂等校验 在执行insert之前,先查询数据记录是否已存在
使用唯一性索引 和 try…catch…选取数据表中合适的字段,创建唯一性索引,一般都是联合唯一索引。这样当出现两次插入相同的数据时就会抛出异常,然后在调用方法中使用try...catch...对异常进行捕获,并在catch中进行异常对应的处理。
异常类型:org.springframework.dao.DuplicateKeyException示例如下:
12345678910111213141516171819202122232425@RestControllerpublic class TestInsertController { @Autowired CPConfigEnti ...
Mybatis Generator配置
Mybatis Generator【MBG】配置MBG插件配置Step1:使用MBG的前提是需要在项目中添加MBG插件。在项目的pom文件中添加以下插件:
12345678910111213141516<!--=====================================================================================================--><!--mybatis-generator 逆向工程插件配置 | 如果不配置该插件,逆向工程构件时会报异常--><plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <!--控制 ...
调用接口超时处理
调用接口超时处理
待完善…
1.增加超时时间|增加接口的超时时间
假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。
2.尝试多调用一次|超时重试,从概率角度去进行估算超时异常的概率
需要考虑超时时间的设置,请求超时的概率来设置重试的次数,不一定是重试一次,可以是多次.
如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。注意:调用多次不代表重复调用 制造脏数据;
但是这种方案的前提时间也是以调用方能够接收到的最长时间为前提,就是所有调用次数的时间加起来不能超过这个大前提;
3.使用待处理队列|延迟队列
如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。
备注:如果对方系统挂掉了,使用 ...
用户中心的设计与实践
亿级用户中心的设计与实践用户中心是互联网最为基础的核心系统,随着业务和用户的增长,势必会带来不断的挑战。如何在亿级的情况下保证系统的高可用,高性能以及高安全,本文能够给你一套实践方案。
本文讨论的是微服务框架下的用户中心,不涉及授权等功能;
用户中心,顾名思义就是管理用户的地方,几乎是所有互联网公司最为核心的子系统之一。它的核心功能是登录与注册,主要功能是修改密码、换绑手机号码、获取用户信息、修改用户信息和一些延伸服务,同时还有登录之后生成Token以及校验Token的功能。下面我们从几个维度来拆解用户中心。
服务架构用户中心既需要为用户提供服务,也会承担其他业务的频繁调用;既然需要为用户提供服务,它就会自带一些业务逻辑,比如用户在登录过程中需要风控或短信的校验,那么就会存在不可用的风险。而比如获取用户信息的接口,则没有那么多的依赖,可能只需要调用数据库或者缓存就可以。获取用户信息接口要求稳定,而核心的登录注册接口也需要稳定,但是当我们在接口层面加一些策略或者修改的时候,不希望因为上线问题导致整个服务不可用,而且上线后,需要对整个服务功能做全量的回归,导致资源严重浪费。
因此,基于 ...
MySQL-隐式类型转换
MySQL-隐式类型转换假设查询表tb001所有数据得到结果如下:
那么执行SELECT * FROM TB001 WHERE C1=1.1111会是啥结果呢?
选项1:返回所有记录
选项2:返回id为1的记录
选项3:不返回任何记录
选项4:以上都不对
这似乎是个送分题,必须选2,真的如此么?当表结构定义为:
12345CREATE TABLE `tb001` (`id` int(11) NOT NULL AUTO_INCREMENT,`c1` float DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
那么执行结果为:
因为float类型无法进行精确存储,所以无法进行精准的等值查询。
当表结构定义为:
12345CREATE TABLE `tb001` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` DECIMAL(18,4) DEFAULT NULL, PRIMARY KEY (`id`) ) ENG ...
数据库设计
数据库设计1 数据库设计概述1.1何为数据库设计?数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。
数据库是信息系统的核心和基础,它把信息系统中大量的数据按一定的模型组织起来,并提供存储、维护、检索数据的功能,最终使信息系统可以方便、及时、准确地从数据库中获得所需的信息。即数据库的设计目标是:为用户和各种应用系统提供一个信息基础设施和高效率的运行环境,这里的高效率代表的是冗余少、易维护和便于使用。
数据库设计的全流程
数据库三级模式二级映射
数据库设计大致可分为如下几个阶段:
需求分析 → 概念设计 → 逻辑设计 → 物理设计 → 数据库实施 → 运行与维护阶段
设计数据库核心三个步骤:
把现实世界的实体模型,通过建模转换成信息世界的E-R模型 – 概念结构设计;
信息世界的E-R模型,经过模型转化,得到数据库世界的数据模型 – 逻辑结构设计;
把数据模型进一步规范化,得到最终的数据库结构模型 – 物理结构设计;
数据库世界的数据模型按数据的组织形式而分为三种类型 ...
Maven
MavenMaven 是什么Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。它是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。
当我们使用 Maven 的使用,通过一个自定义的项目对象模型pom.xml 来详细描述我们的项目。
Maven 中的有两大核心:
依赖管理:对 jar 的统一管理(Maven 提供了一个 Maven 的中央仓库mvnrepository.com/ ,当我们添加完对应的依赖Maven就会自动去中央仓库下载相关的依赖,并且解决依赖的依赖问题)。
项目构建:对项目进行编译、测试、打包、部署、上传到私服等。
为什么使用 Maven由于 Java 的生态非常丰富,无论你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,而jar 包之间会有关联,在使用一个依赖之前,还需要确定这个依赖所依赖的其他依赖,所以,当项目比较大的时候,依赖管理会变得非常麻烦臃肿,这是 Ma ...
浅析多源异构数据
浅析多源异构数据什么是多源异构数据多源:指数据的来源具有多源性。多源异构数据来自多个数据源,包括不同数据库系统和不同设备在工作中采集的数据集。不同的数据源所在的操作系统、管理系统不同(例如OA、CRM、HR、MES、SCM),数据的存储模式和逻辑结构不同,数据的产生时间、使用场所、代码协议等也不同,这造成了数据“多源”的特征。
异构:指数据种类及形态具有复杂性,即异构性。异构数据体现在五个层次上:
计算机体系结构的异构;数据的物理存储来源于不同体系结构的计算机中,如:大型机、小型机、工作站、PC或嵌入式系统中。
操作系统的异构;数据的存储来源于不同的操作系统,如:Unix、Windows、Linux、OS/400等。
数据格式的异构;数据的存储管理机制不同,可以是关系型数据库系统,如:Oracle、SQL Server、DB2等,也可以是文件行二维数据,如:txt、CSV、XLS等。
数据存储地点异构;数据存储在分散的物理位置上,此类情况大多出现在大型机构中,如:销售数据分别存储在北京、上海、日本、韩国等多个分支机构的本地销售系统中。
数据存储的逻辑模型异构;数据分别在不同的业务逻辑 ...
订单系统设计
订单系统设计todo…
Squirrel状态机(官网直译版)
Squirrel状态机squirrel-foundation为Java提供了一种易于使用、类型安全且高度可扩展的状态机实现。
个人根据官方文档翻译的中文版,官网地址:Squirrel State Machine
squirrel-foundation是什么?就像松鼠这种小巧、敏捷、聪明、警觉和可爱的动物一样,squirrel-foundation旨在为企业提供轻量级、高度灵活和可扩展、可诊断、易于使用和类型安全的Java状态机实现。
下面是描述ATM机状态变化的状态机图:
示例代码可以在“org.squirrelframework.foundation.fsm.atm”包中找到。
MavenSquirrel-foundation已经部署到maven中央存储库,因此您只需要向pom.xml添加以下依赖项。
最新Released版本:
12345<dependency> <groupId>org.squirrelframework</groupId> <artifactId>squirrel-foundation</arti ...
浅析故障转移
浅析故障转移故障转移(failover),即当活动的服务或应用意外终止时,快速启用冗余或备用的服务器、系统、硬件或者网络接替它们工作。 故障转移(failover)与交换转移操作基本相同,只是故障转移通常是自动完成的,没有警告提醒手动完成,而交换转移需要手动进行。
对于要求高可用和高稳定性的服务器、系统或者网络,系统设计者通常会设计故障转移功能。
要使故障转移正常工作,必须有一个数据备份裸机服务器或虚拟机充当恢复站点系统,以便在发生故障时替换主站点。由于故障转移是灾难恢复中必不可少的步骤,因此数据备份系统本身必须不受故障影响。在服务器级别,自动故障转移通常使用一个“心跳”线连接两台服务器。只要主服务器与备用服务器间脉冲或“心跳”没有中断,备用服务器就不会启用。为了热切换和防止服务中断,也可能会有第三台服务器运行备用组件待命。当检测到主服务器“心跳”报警后,备用服务器会接管服务。有些系统有发送故障转移通知的功能。
有些系统故意设计为不能进行完全自动故障转移,而是需要管理员介入。这种“人工确认的自动故障转移”配置,当管理员确认进行故障转移后,整个过程将自动完成。
如何进行故障转移有两种方法 ...
状态机业务场景
状态机简介在日常开发中经常遇到运营审核经销商活动、任务等等类似业务需求,大部分需求中状态稳定且单一无需使用状态机,但是也会出现大量的if...else前置状态代码,也是不够那么的“优雅”。随着业务的发展、需求迭代,每一次的业务代码改动都需要维护使用到状态的代码,更让开发人员头疼的是这些维护状态的代码,像散弹一样遍布在各个Service的方法中,不仅增加发布的风险,同时也增加了回归测试的工作量。
什么是状态机?通常所说的状态机为有限状态机(英语:finite-state machine,缩写:FSM),简称状态机, 是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
应用FSM模型可以帮助对象生命周期的状态的顺序以及导致状态变化的事件进行管理。 将状态和事件控制从不同的业务Service方法的if else中抽离出来。FSM的应用范围很广,状态机 可以描述核心业务规则,核心业务内容。无限状态机,顾名思义状态无限,类似于“π”,暂不做研究。
状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作” ...
泛型语法糖
泛型语法糖什么是泛型
泛型:Java语法糖。
定义:语法糖(Syntactic Sugar),也称糖衣语法。是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指的是在计算机语言中添加的某种语法,这种语法对语言的编译结果和功能并没有实际影响, 但是却能更方便程序员使用该语言。
作用:通常来说使用语法糖能够减少代码量、增加程序的可读性,从而减少程序代码出错的机会。
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
泛型有什么好处在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制 ...
浅析加密、签名和数字证书
浅析加密、数字签名和数字证书
Q:
非对称加密中公私钥都可以加密,那么什么时候用公钥”加密”,什么时候用私钥“加密” ?
什么是数字签名,数字签名的作用是什么?
为什么要对数据的摘要进行签名,而不是直接计算原始数据的数字签名?
什么是数字证书,数字证书解决了什么问题?
什么是加密加密就是对明文数据按某种特殊算法进行处理,使其成为不可读的一段代码,通常称为“密文”。 密文通过”密钥”解密后还原出原来的明文,通过这样的途径可以达到保护数据不被非法人窃取、阅读的目的。
考虑以下哪些属于加密方法:
AES
DES
RSA
SM4
SHA
MD5
BASE64
这几种都是日常开发中常用的数据编码技术,但是只有 AES、RSA、SM4 才能算是加密算法。
为什么呢?
一个区分的简单方法就是****看编码后的数据是否能还原,能还原的才是加密算法。
MD5 实际上是对数据进行有损压缩,无论数据有多长,1KB、1Mb 还是 1G,都会生成****固定 128 位的散列值(实际开发中会为以32位的十六进制字符串进行显示),并且 MD5 理论上是不可能对编码后的数据进行还原的,即不可逆。MD5 因 ...
优雅对接第三方API
优雅对接第三方API前言在日常的开发中,我们难免会遇见需要和第三方系统进行交互的需求,此时如何设计优雅地对第三方暴露的API就很重要了,不然就可能会出现接口被刷、数据泄露等安全问题。
非技术对接需要注意的点:
与第三方平台对接时,一定要积极和谐友善沟通,要是自己沟通不融洽,对自己的开发进度以及整体团队的对接进度就得往后延期了。
沟通方向要在同个频道,不然可能带来的影响就是:自己写完api文档之后,发给对方之后,发现写得完全就不在方向上,这就很尴尬了。
第三方API对接1. 网络协议方面尽量规范双方使用https协议,因为https是http协议的升级版本,可通过对网络浏览器和网络服务器中间传输的数据进行加密,安全性方面还是比http协议高很多的,从谷歌规范来说,也是使用https协议的。虽然使用成本相对高一些,但这是值得的。
2. 接口请求方面
接口请求类型(GET|POST|PUT|DELETE等等)看具体业务场景规定好;
入参的数据类型要规定好;
数据合法性校验:常规性校验以及业务校验;
常规性校验:包括签名校验,必填校验,长度校验,类型校验,格式校验等;
业务校验 ...
钩子方法
钩子方法
此处的钩子方法和Runtime类中的钩子线程是两种概念:Runtime.getRuntime( ).addShutdownHook( )
请参考:JVM钩子
钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法骨架,而将一些具体步骤延迟到子类中实现。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤实现。其方法主要分为两大类:模版方法 和 基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method)。
模板方法模式中的四种方法基本定义(前提:在抽象类中定义):
模板方法 定义了一个方法,其中定义了整个逻辑的基本骨架。
抽象方法 由抽象类声明,由具体子类实现,并以abstract关键字进行标识。
具体方法 由抽象类声明并且实现,子类并不做实现和覆盖操作。其实质就是普遍适用的方法,不需要子类来实现。
钩子方法 由抽象类声明并且实现,子类也可以选择重写 ...
Lombok
1. Lombok简介
官方介绍: Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
官网地址:Project Lombok
意思:Lombok是一个java库,它可以自动插入编辑器和构建工具中,以提升java性能。不需要另外编写getter或equals方法,使用一个注解,你的类就有一个功能齐全的生成器,自动记录变量,等等。
简而言之:Lombok能以简单的注解形式来简化java代码,提高开发人员的效率。
2. Lombok使用使用Lombok需要的开发环境为:Java + Maven + In ...