java之路
2023-03-06 15:55:20 0 举报
AI智能生成
java进阶之路
作者其他创作
大纲/内容
架构
网站架构模式
发展历程
单点系统
代码冲突
消耗资源
面向服务架构
代码复用
解耦
网络延迟
主要针对银行
微服务架构
特性
轻量级
独立运行
集群
作用
减轻单台服务器的访问压力
定义
将一个项目部署到多个不同的服务器中
亿级并发处理策略
高并发概念
响应时间
并发用户数
QPS;每秒请求处理数
吞吐量
优化策略
扩容
动静分离
缓存
服务降级
关不重要的服务
限流
目的
保护系统
方式
延迟处理
消息平台
部分处理
具体操作
限制总并发数
数据库连接处、线程池
限制瞬时并发数
tomcat中的maxConnections
限制时间窗口内的平均速率
Guava的RateLiter限制每秒平均速率
限制
原则
固定窗口
一天不能超过1万次请求
滑动窗口
电梯格子模型
漏铜算法
有一个缓冲区
缓冲区满了进行限流干预
不能应付突发情况
令牌桶
突发情况下可以一次拿多个令牌
放令牌速度固定
处理速度可以变化
分布式
高可用
定义
服务器宕机容错机制
途径
一主一备;多主多备
keepalive
nginx设置宕机轮询
分布式
定义
一个大项目拆分成很多子项目
目的
完成同一主体功能
案例
会员,订单,支付,物流系统
技术
rpc远程调用
高并发解决方案
数据库
开启慢查询,定位瓶颈sql语句;通过执行计划分析sql,是否有全表扫描等不合理的语句;sql语句优化
使用索引
分表分库
主从复制
读写分离
缓存机制
使用redis缓存数据库内容
主从复制
读写分离
哨兵机制
服务器
反向代理
负载均衡
集群
动静分离
客户端
减少请求,ajax
动静分离
CDN加速
项目环境
代码重构
JVM调优
垃圾回收,新生代,老年代
JVM参数
项目采用微服务和分布式架构
重构
层次封装
默认配置
应用级配置
方法级配置
核心平台
sso
CAS
JWT
权限框架
SpringSecrity
核心功能
认证
自定义用户认证
处理用户信息获取
UserDetailsService
处理用户校验逻辑
UserDetails
处理密码加解密
PasswordEncoder
个性化用户认证流程
自定义登录页面
loginPage("xx")
自定义登录成功处理
AuthenticationSuccessHandler
自定义登录失败处理
AuthenticationFailureHandler
记住我
核心流程图
退出
logout
授权
防护
核心源码
BasicAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
源码剖析
认证流程源码
认证处理流程说明
认证结果如何在多个请求之间共享
获取认证用户信息
SpringSocial
核心知识
Oauth协议
ConnectControl
Session管理
SpringSecurity OAuth
Token处理
JWT
自包含
密签
可扩展
开放平台
工作流平台
核心知识点
多线程
概念
进程
正在运行的应用程序;线程的集合
线程
正在独立运行的一条执行路径
多线程
提高程序的运行效率
应用场景
多线程下载;qq;爬虫;异步上传;分布式job
创建多线程的方式
继承Thread类;实现runlable接口;使用匿名内部类;callable;使用线程池
主线程,守护线程,用户线程
几种状态
新建
准备
运行
休眠
停止
线程安全
什么是线程安全
共享同一个全局变量,写的时候可能会受到其它线程的干扰,导致数据有问题
解决办法
同步
synchroized
同步函数
静态同步函数
非静态同步函数
同步代码块
lock
多线程死锁
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
java内存模型
分类
主内存
私有本地内存
Volatile
atomicInteger
多线程通讯
技术手段
wait;notify
锁
lock,condition
java并发包
集合
vector与arrayList
Hashtable与HashMap
Collections
ConcurrentHashMap
CountDownLatch
CyclicBarrier
Semaphore
并发队列
概念
有界、无界
是否有限制
阻塞和非阻塞
不满足是否等待
具体案例
ConcurrentLinkedQueue
ArrayBlockingQueue
线程池原理分析
概念
为什么需要线程池
重复利用,降低资源消耗
提供响应速度
提高线程的可管理性
ThreadPoolExecutor
Executor
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
newSingleThreadPool
线程池配置数量
cpu密集
线程数和cpu核数相同
IO密集
2*CPU核数
锁的深度化
常见锁
乐观锁
版本控制
悲观锁
每次拿数据的时候都会上锁
缺点
只能保证一个连接进行操作
排它锁
分段锁
重入锁
案例
打水排队,家人可以重复进入
读写锁
只有读-读能共存
CAS无锁
案例
原子类底层实现保证线程安全
参数
V-要更新的变量
E-预期的值
N-新值
自旋锁
一直循环等待锁,直到获取才退出循环
数据交换格式、反射、ioc的底层实现
json
解析工具
gson
fastjson
jackson
xml
解析工具
dom4j
sax
java反射
运行期动态创建类的实例
初始化效率低
ioc
对象之间的关系转移到容器
自定义注解与java设计模式
注解
分类
内置注解
自定义注解
注意点
注解类运行环境需要设置,否则反射后拿不到值
设计模式
原则
开闭原则
里氏代换
依赖倒转
接口隔离
迪米特法则
合成复用
jdk和cglib的区别
jdk通过反射生成一个匿名类;cglib通过开源的asm修改字节码来实现
jdk动态代理只能针对接口;cglib都可以
socket网络通信
tcp
面向连接
三次握手
字节流传输
可靠
udp
面向无连接
传输<64k
不可靠
NIO编程
基本概念
buffer
直接缓冲区
非直接缓冲区
分散读取,聚集写入
区别
io(Bio)
阻塞的,面向流的
伪异步
nio
非阻塞,面向缓冲区的,选择器
非阻塞
数据准备就绪后,由选择器通知给服务器端;数据在准备之前无需等待
Aio
异步,非阻塞
netty
特性
异步通讯框架,异步非阻塞,高可用,事件驱动
功能
粘包、拆包;序列化;短链接,长链接
JVM剖析
JVM参数调优
内存结构
方法区
堆
创建对象,new 数组
栈
基本的局部变量
类的方法
本地方法栈
主要调用C语言
PC寄存器
执行引擎
执行字节码文件
原则
堆初始值和最大值要一样
减少垃圾回收的次数
实战调优
基本工具
jmeter
操作步骤
添加线程组
samples-http请求
添加聚合报告
tomcat
基本概念
吞吐量
每秒钟请求成功次数
GC
定义
不定时的清理堆内存不可达的对象
finalize
重写该方法,可以知道垃圾回收的时间
内存溢出
需要4g,实际只有3g
内存泄漏
定义很多静态变量,但是又不能被回收,对象又没有被引用
划分
新生代
eden
s0
S1
老年代
堆溢出
堆大小不足
调优
web系统中尽量减少常量信息
尽量减少垃圾回收机制的次数
堆初始值和最大值保持一致
新生代回收次数比老年代多
新生代与老年代比例:1/3;1/4
SurvivorRatio=2
eden是S0,S1的两倍大小
NewRatio=老年代/新生代
算法
标记清除
定义
每个对象打一个标记,0:可达,1:不可达
标记压缩
定义
标记后,需要排序,压缩,集中清除
优点
避免碎片化
引用计数法
定义
每个对象都有一个标记,默认是15次,如果GC回收发现对象没有引用,则减一,可达,则加一,超过一定次数会升级到其他区
优点
执行时间比较快,不太会干扰程序
缺点
无法检测出循环引用
复制算法
定义
复制活动对象到对方区,交替清除S0或者S1区
优点
连续性,不会出现碎片化
缺点
空间利用率不高
分代算法
定义
分新生代和老年代,不同代采用不同算法
垃圾收集器
定义
串行
单线程收集,效率低
并行
多线程收集,效率高
Maven技术
冲突解决
exclusions
web开发入门
概念
javaee与javase
javaee主要做web开发,面向企业的,spring,mybaits,hibernate
javase 面向对象,多线程,io流,集合,网络
B/S与C/S
B/S:web程序,网站;浏览器到web服务;无需下载安装
C/S:客户端到服务器;需要下载安装;升级麻烦
web服务器
目的
将本地资源共享给外部访问
DNS解析
本地host文件解析——》运营商的DNS解析
内网与外网
内网:内网相当于局域网访问;网关是否相同
外网:申请外网IP地址
外网映射工具:ngrok(不稳定);natapp,花生壳
servlet
生命周期
init
service
destroy
源码分析
是否安全
cookie与session
http协议,表单重复提交,跨域
http协议
304
时间戳,治缓存
防盗链
refer
nginx反向代理
转发与重定向
重定向
客户端跳转,地址会变化
转发
服务内部
跨域
定义
请求访问的域名与AJAX请求的地址不一致,浏览器无法获取到返回结果
怎么解决
jsonp:只支持get
接口网关
httpclient内部转发
添加header允许访问
表单重复提交
原因
网络延迟,刷新,重新加载(回退)
怎么解决
前端
flag不能解决问题
后端
tocken
防止模拟请求
使用令牌+验证码
XSS攻击
脚本注入
解决办法
后台获取参数通过过滤器转换成HTML
sql注入
解决办法
预编译
定义
sql拼接,or 1=1;--
LINUX
概念
堡垒机
运维和安全审计
优点
开源,免费,安全
常用命令
> >>
touch
vim
grep
:set nu
shift+g
基础环境搭建
虚拟机安装
centos6安装
mysql
检查是否安装:rpm -qa|grep 'msyql-server..'
rpm -ivh * rpm -Uvh
service mysqld start
mysqladmin -u root password 'password'
jdk
解压
tar -zxvf 安装包
环境变量
etc/profile
docker
docker简介
定义
容器技术
直接运行在操作系统内核之上的用户空间
虚拟机
通过中间层,将一台或者多台独立的机器,虚拟运行于物理硬件之上
官方文档
docker基本组成
客户端
C/S架构
守护进程
服务端
镜像
容器
仓库
相关技术
namespace
PID
进程隔离
NET
管理网络接口
IPC
管理跨进程通信的访问
MNT
管理挂载点
UTS
隔离内核和版本标识
cgroup
资源限制
优先级设定
资源计量
资源控制
容器的能力
文件系统隔离
进程隔离
网络隔离
资源隔离和分组
docker的安装部署
ubantu
安装前检查
内核版本
deviceMapper
docker操作
交互式容器和守护容器
docker的网络设置
容器间
容器与外部访问
数据卷
数据卷容器
数据卷容器删除,也不会影响文件数据
跨主机容器连接
网桥
优点
配置简单,不依赖第三方软件
缺点
与主机在同网段,需要小心划分IP地址
需要有网段控制权,在生产环境中不易实现
不容易管理
Opend vSwitch
Weave
mysql优化
数据库设计合理
三范式
1范式
原子约束,每列不可再分
2范式
唯一性约束
3范式
不要有冗余数据
添加索引
索引底层原理
2的N次方
需要同步修改索引文件
何时需要建立索引
查询次数比较,值有非常多的不同;
是查询条件
索引注意事项
组合索引
第一个条件会生效
两个一起也会生效
like+%开头就会导致全表扫描
使用or,所有条件必须加索引
判断是否为NULL,使用is null,才会使用索引
group by会全表扫描
order by null可以禁止排序
尽量不要使用>=
in not in 也会全表扫描
索引分类
普通索引
主键索引
primary key
唯一索引
unique
全文索引
不要使用like
match
分表分库
手段
水平分隔
分页查询困难
查询非常受限制
垂直分隔
何时分库、分表
分库
数据库独立,减少风险,团队开发,项目拆分
分表
订单表多年数据
取模分表
读写分离
存储过程
配置mysql最大连接数
mysql服务器升级
随时清理碎片化
sql语句调优
定位慢查询
慢查询日志
explain
mysql读写分离
主从复制
读写分离
spring核心技术
spring
ioc
对象创建,管理依赖关系
扫包,反射,容器
di
Autowired与Resource的区别
Autowired:默认是以类型进行查找
Resource:默认是以名称进行查找
aop
三大核心
关注点:重复代码
切面:抽取重复代码
切入点:拦截那些方法
案例
事务
环绕通知+异常通知
日志
权限
性能统计
异常处理
事务与传播行为
事务的特性
原子性
一致性
隔离性
持久性
spring事务分类
手动事务
声明式事务
事务的原理
AOP编程+环绕通知+异常通知
业务层不要try异常
事务的传播行为
定义
事务的传递
分类
Required
当前没有事务,则新建一个事务;如果当前有,则直接加入
supports
如果当前有事务,直接加入;没有,则以非事务运行
mandatory
使用当前事务,当前没有事务,抛出异常
required_new
新建事务,如果当前有事务,挂起
not_supports
非事务运行,当前存在事务,挂起
never
非事务运行,存在事务,抛出异常
nested
如果当前存在事务,则在嵌套事务内执行;如果不存在,则类似required方式执行
源码分析
思路
先知道怎么用
设想可能的实现原理
找关键点
如何下载源码
github,官网
maven
反编译
不推荐
关联源码
源码导入当前工具
外部引入
maven关联
SPRING
BeanFactory
定义了IOC容器的最基本形式
BeanDefinition
ioc反射
XML解析springbean文件
SPRINGMVC
核心技术
servlet包装起来的
执行流程
springmvc的任何请求先交给DispatchServlet进行管理
执行DispatcherServlet doService方法 交给doDispatch方法
doDispatch获取 HandlerMaping
HandlerAdaper 开始拦截器
真正执行当前请求的适配器
分类
AnnotationMethodHandlerAdapter
主要是适配注解类处理器,注解类处理器就是我们经常使用的@Controller的这类处理器
HttpRequestHandlerAdapter
要是适配静态资源处理器,静态资源处理器就是实现了HttpRequestHandler接口的处理器,这类处理器的作用是处理通过SpringMVC来访问的静态资源的请求
SimpleControllerHandlerAdapter
是Controller处理适配器,适配实现了Controller接口或Controller接口子类的处理器,比如我们经常自己写的Controller来继承MultiActionController
SimpleServletHandlerAdapter
是Servlet处理适配器,适配实现了Servlet接口或Servlet的子类的处理器,我们不仅可以在web.xml里面配置Servlet,其实也可以用SpringMVC来配置Servlet,不过这个适配器很少用到,而且SpringMVC默认的适配器没有他,默认的是前面的三种。
执行完毕 获取当前ModelView
Springbean的生命周期
创建对象
初始化属性
BeanNameAware获取查找beanName
BeanFactoryAware获取bean容器工程
BeanPostProcess
销毁bean
SpringAop
SpringBoot
核心技术
敏捷开发
无需tomcat
减少XML配置
SpringCloud|SpringBoot
弊端
封装太多,扩展比较困难
基本操作
快速搭建
整合jsp
整合模板
整合持久层
jdbcTemplate
jpa
mybatis
高级操作
多数据源整合
思路
这么样搭建多数据源
如何区分不同的数据源
分包
自定义注解
分布式事务
JPA+atomikos
整合日志
Async异步化
创建定时任务
打包发布
整合ehcache
redis
缓存
JVM内置缓存
oscache
主要针对数据库访问层
escache
主要针对jsp页面
缺点
没有持久化机制
容易内存溢出
多服务器共享问题
nosql缓存
分类
redis
作用
减轻数据库访问压力
应用场景
token生成
session共享
分布式锁
自增id
验证码
基本数据类似
String,set,zset,hash,list
主从复制
哨兵
定义
监听服务器
重新投票选举
高可用
持久化
RDB
二进制文件格式存储
非实时
体积小
主动断开会自动备份;直接kill或者down机不会保存数据
AOF
日志文件方式存储
体积大
实时添加到日志文件末尾
事务机制
发布订阅
mogadib
存放json格式
memcache
不能做持久化
hbase
特性
数据存放在数据库中
存放在内存中
问题
数据库数据和缓存数据不一致
清掉缓存
nginx
定义
反向代理
代理服务器
静态服务器
作用
集群
目的
减轻单台服务器的压力
问题
分布式job的幂等性问题
session共享
解决方案
spring-session+redis
tomcat配置session共享
使用负载均衡策略,ip绑定
token重写session
子主题
使用cookie,不安全
分布式生成全局id
提前生成订单号
实现原理
负载均衡的算法
权重
轮询
ip绑定
会话共享问题
第三方
反向代理
作用
不用暴露真实ip
虚拟服务器
动静分离
http服务器
类似工具
Lvs,haproxy,f5
企业API网关
原理
域名相同,项目名称不同
keepalived
作用
故障转移
重启脚本
特性
优先走主机
只能重启本机的服务
消息中间件
概念
同步和异步
同步
阻塞,超时,重复提交。数据不一致
A调用B,B没有及时响应或者报错
A项目默认3次重试,依然失败,则插入日志表(补偿表)
接着使用定时job每天晚上检查补偿表,轮询重试
手动补偿
异步
为什么需要消息中间件
点对点
发布订阅
异步通讯
高并发
缓存排队
应用场景
注册后续服务
订单库存
分类
activeMq
注意事项
消费者消费过程中抛出异常
数据转换异常
发布版本解决
try catch掉
补偿表机制
jdbc链接异常
默认自动重试
缺点
本身不支持集群
rocketmq
特性
分布式消息中间件
效率非常高
海量消息堆积
支持几10万个队列
生产者投递消息,均摊集群服务器
消费者均摊消息消费
支持重试机制
顺序消息
持久化
事务消息,分布式事务
拉取机制
原理
nameserver
存放生产者,消费者投递信息
地址信息
broker
存放消息
producer
consumer
安装
必须要JDK1.7 64位环境
配置JVM参数
rabbitmq
kafka
应用场景
日志存放
大数据
JMS可靠性
持久化
签收模式
自动签收
事务消息
手动签收
不用签收
消息的幂等性
核心
全局id
activemq可以使用消息id,但是roketmq集群不能使用
使用全局id判断该消息是否消费,如果已经消费,直接签收
可以放缓存里面
消费者集群,不用考虑幂等性
中间件集群,需要考虑
产生原因
是因为消费者没有及时将消费结果反馈给生产者,自动重试
解决办法
每次消费存放到日志文件里面|全局id
重试机制,判断是否重复消费,不会存在并发的场景
疑问
业务耗时太久,此时全局id没有放进去,就重试消息,不是会出问题
业务更新和写全局id事务回滚
分布式事务
集群
Sharding-jdbc
官网
http://shardingsphere.io/index_zh.html
分布式任务调度平台
实现方式
Thread
timetask
多线程
quartz
spring-boot
幂等性
分布式锁
保证只有一台服务器执行job
配置文件开关
start=true,false
保证只有一台服务器执行
使用数据库唯一标识
效率低
谁插成功了就执行
传统调度的缺点
没有补偿机制;失败了就一直失败
不支持集群
不支持路由策略
统计;那些成功,那些失败
job管理平台
报警邮箱
状态监控
XXL-JOB
原理
任何job先在任务调度平台执行,再由任务调度平台路由到实际job服务器
持久层
mybatis
java核心基础知识点
泛型
使用目的
解决元素存储的安全性问题
解决获取元素的时候需要强制类型转换的问题
Lambada表达式
为什么需要
一段可以传递的代码
匿名内部类的替代
函数式接口
接口中只有一个抽象方法
内置接口
消费型接口
Consumer:void accept(T t)
供给型接口
Supplier:T get()
函数型接口
Function:R apply(T t)
断言型接口
Predicate:boolean test(T t)
子接口
方法引用和构造器引用
Stream API
使用步骤
创建stream
中间操作
筛选与切片
filter
limit
skip
distinct
map
函数作为参数,应用到每个元素上
flatMap
类似add和addAll
排序
自然排序
定制排序
终止操作
allMatch
anyMatch
noneMatch
findFirst
findAny
count
max,min
规约
将流中的元素反复结合起来
收集
将流转化成其他类型
join
分区
分组
list
任务拆分
fork/join
拆分合并
工作窃取
并行流
parallel
Optional容器类
目的
解决空指针异常
接口
default
类优先
static
时间日期
线程安全
重复注解与类型注解
缓存
SpringBoot
装配
Spring模式注解装配
定义
一种用于声明在应用中扮演“组件”角色的主键
案例
@Component,@Service,@Configuration
特性
派生性
层次性
装配方式
<context:component-scan>
@ComponentScan
Spring @Enable模块装配
定义
具备相同领域的功能组件集合
案例
@EnableWebMvc,@EnableAutoConfiguration
方式
注解
编程
Spring 条件装配
定义
Bean装配的前置判断
案例
@Profile,@Conditional
方式
主键
编程
SpringApplication
自定义
SpringApplication API
SpringApplicationBuilder API
生命周期
准备阶段
配置Spring Bean来源
推断:Web应用类型和主引导类
加载:应用上下文初始器和应用事件监听器
运行阶段
加载
运行
监听
原理
快速整合三方框架
maven子父依赖,父类提供公共的jar
无配置文件
java操作springmvc的配置过程
内置HTTP服务器
java创建tomcat服务器
微服务
SpringCloud
注册中心
服务调用
rest
fegin
自带负载均衡
ribbon
断路器
服务雪崩效应
定义
所有请求在处理一个服务,不能访问其他服务接口
解决办法
使用超时
服务降级
服务接口发生错误,不去调用接口,调用本地方法fallback
熔断机制
达到规定请求,熔断,报错
隔离机制
每个服务隔离开
限流机制
产生原因
网络延迟
网关
分布式配置中心
zookeeper
定义
分布式协调工具
树状结构
节点
持久节点
持久顺序节点
临时节点
会话链接失效后,值会自动删除掉
临时顺序节点
节点事件通知
节点需要开启通知
消费者需要添加监听事件
节点名称唯一
应用场景
dubbo的注册中心
发布订阅
负载均衡
流程
服务注册到zk
从zk获取最新的服务链接信息
订阅子节点事件
按照规则获取一个链接发起调用
轮询机制
取模算法
分布式通知
master选举
流程
多台服务器,创建临时节点,谁能创建成功,谁就是主;主如果宕机,则再次重新创建节点
分布式锁
使用数据库
使用缓存
使用zk的临时节点+事件通知
分布式配置中心
分布式队列
dubbo
同SpringCloud
dubbo与springcloud的区别
dubbo使用zk实现注册中心
springCloud使用eurake作为注册中心
dubbo支持多种协议,springcloud只支持http协议
dubbo没有网关,springcloud有网关和分布式配置中心
都是rpc远程框架
dubbo可以整合hystirc作为断路器
分布式事务
概念
两段提交协议
三段提交协议
网关
常用功能
过滤器
反向代理
黑白名单
授权
日志
限流
对比
LVS
ip+端口
NGINX
HTTP
zuul,gateway
断路器
核心功能
服务隔离
雪崩效应
服务降级、限流、熔断
作用
服务保护
当服务产生堆积的时候,
服务隔离
不同服务互不影响
实现方式
线程池
计数器
服务降级
服务不可用;直接返回一个错误
提高用户体验
服务熔断
超过限制,直接拒绝服务,最终调用服务降级措施
产生背景
微服务高并发
项目实战
SpringCloud微服务电商项目
总体架构
平台来源
PC端
安卓,ios
微信端
混合模式
视图层
H5工程
PC工程
支付工程
SOA层
会员服务
DB1
订单服务
DB2
支付服务
DB3
技术栈
SpringBoot+SpringCloud+Maven+Redis+ActiveMQ+XXLJOB+Freemarker+Eureka+Feign+Hystrix+Mybatis+MySQL+SVN+Jenkins+Nginx+Lombok+Logstash+FastJson+Md5+Base64+RSA+FastDFS+支付网关接口使用支付宝+第三方登录使用QQ授权登录
环境搭建
定义模块结构,包规范,代码规范
基础核心类的封装
返回结果统一封装
redis工具类封装
问题集锦
创建父子结构
pom,jar,war
InsertProvider获取不到参数
map接受替换成param注解接受
dao接口bean无法注入
增加依赖
增加依赖
接口调用404
扫包范围不对
自动sql 末尾,bug
如果没有父类属性,增加判断
postman传参
raw
实现类必须要加参数注解
@RequestBody
异常错误信息
基于code获取配置的异常信息
增加顶级中文项目名称
wokerset
多端登录
使用token方式登录
第三方登录
qq
腾讯qq与给蚂蚁课堂
注册app,得到appid,appsecret
生成授权码链接,返回授权码
通过授权码换取accesstoken,然后失效授权码
使用accessToken换取openid
使用openid调用接口
SSO
CAS
微信开发
平台
微信开放平台
提供授权接口
微信公众平台
服务号
订阅号
小程序
外网映射工具
ngrok
natapp
智能机器人
青云客
微信开发框架
weixin-java-tools
支付项目
支付分类
在线支付
支付宝
微信支付
京东支付
平安支付
银联支付
小米支付
聚合支付
概念
整合主流的支付平台
现有平台
收钱吧
mustpay
ping++
支付流程
支付宝
蚂蚁课堂提交参数到支付宝接口
支付宝返回结果信息
沙箱环境
客户端将参数封装进form表单自动提交到支付宝
问题
安全
https
加密
对称加密
Base64
DES
单向加密
非对称加密
RSA
幂等
支付侧幂等
业务订单号去重判断
业务侧幂等
间隔一段时间尽量保证不出现并发
单机,使用同步锁
集群环境使用分布式锁
全局id,先验证是否修改过
回调
同步通知
支付结果展示;不处理订单等状态更改
参数隐藏
使用模拟表单自动提交完成支付结果展示
异步通知
篡改
加签名
付款金额和实际商品金额对比
分布式事务
方案一
异步通知+补偿
订单支付失效控制
请求支付表生成一条支付记录
生成支付token,key为token,value为支付表id
返回token给客户端
使用支付token获取支付id
使用支付表的id获取支付信息
封装支付宝拼装表单提交参数
系统优雅
臃肿代码
分类
业务代码和技术代码耦合
业务和缓存混合
主业务代码和增值业务代码耦合
业务和日志混合
多余的依赖关系
方法的耦合
类的耦合
包的耦合
开发语言的耦合
数据库的耦合
缺点
可读性差
可复用性差
可维护性差
易变性差
切换缓存框架比较难
运行期依赖
缓存,日志不能出问题
注解
spring的EL表达式
现学现用
CDN内容分发
原理
动态获取客户端ip,判断与CDN服务器距离,选择最短路径
应用场景
缓存静态资源
IMAGE
css
js
视频
直播网站
接口幂等性框架
场景
表单重复提交
接口网络延迟
RESTFUL API
核心特性
用URL描述资源
使用HTTP方法描述行为;使用HTTP状态码来表示不同结果
使用JSON交互数据
不强制
常见注解
url增加参数格式的正则
JsonView
getMapping
Valid
NotBlank
BindingResult
Configration
Bean
错误处理
SpringBoot
错误处理机制
浏览器返回HTML
app返回JSON
自定义错误处理
cotrolAdvice
拦截
过滤器
缺点
不能获取进入容器后的信息
拦截器
缺点
无法获取参数
切片
缺点
无法获取原始的请求响应
异步处理
常用方法
Callable
缺点
必须由主线程发起
DeferredResult
WireMock
秒杀系统
场景
商品抢购
群红包
优惠券领取
抢火车票
在线预约
特点
短时高并发、负载压力大
读多写少
竞争资源是有限的,不能多买,不能少买,不能重买
解决办法
锁
悲观锁
乐观锁
memcached的cas机制
数据库方式
版本号
状态
Java行业分析
13-19年技术变革
0 条评论
下一页