1.可靠性
可扩展性,服务降级,负载均衡
应用扩展
1.垂直扩展,方式:提高机器硬件,缺点,成本昂贵,扩展能力有限
2.水平扩展,方式:增长节点,优势:升级过程平花,硬件成本低,理论上无线扩展,肯定:会增长系统的复杂度,维护成本高,服务须无状态的,可分布式的
数据库扩展
1.垂直拆分,一个库数据量太大,将业务紧密,表间关联密切的表划分在一块儿;
2.水平拆分,一个表的数据量太大,一表拆多表,根据查询使用状况肯定规则
mysql单表容量不要超过5000万,正常业务不要超过1000万
spring动态数据源
分表组件,googledb shard,公司也有
考虑点
数据量,增加速度,QPS,切分规则
负载均衡
nginx反向代理服务器,http转发
策略
random,随机
roundrobin,轮询
leastactive,优先向处理较快的服务器
IPHash 根据IP来作hash,
ConsistentHash 根据内容作hash,机器有结果的localcache,请求直接打到该服务器
健康检查
Healthcheck.html
按期检查url是否能访问到,检查服务器状态是否存活
服务降级
对提供的服务进行分级,核心服务具备更高的优先级,不重要的服务降级
功能开关
qconfig
2.性能
缓存,并发,池化,异步
性能优化的目标是声明
响应时间
吞吐量
影响性能的因素有那些
cpu,内存,磁盘,网络,javaGC
hashmap的连表rehash可能致使收尾相连致使死循环
如何判断哈希算法好坏
分散性
平衡性
单调性
synchronized(一直等待)/reentrantLock(有timeout)
可重入锁,互斥
ReadWriterLock读写锁
读锁是一种共享锁,写锁是一种排他锁,写锁和读锁有级别,
获取写锁要等待全部读锁都释放
缓存
hashmap
ConcurrentHashMap
Guava Cache
memcached 集群
水平扩展
若是机器增长,hash值映射怎么办
一致性hash
redis,数据结构丰富
操做丰富 可持久化,若是分布式优先级队列sorted set
序列化
概念,将对象的状态信息转换为能够存储或者传输形式的过程
json
java serilization 显式指定id
Hessian
少用枚举
池化技术
场景 可服用资源,资源建立代价大
类型:线程池 executor 链接池jdbc dbcp c3p0 对象池 spring
链接池的参数
不推荐用Executors建立,而是ThreadPoolExecutor
弊端是
fixedThreadpool和singleThreadpool会产生oom
其余注意事项
建立线程或线程池 时请指定有意义的线程名,方便出错时回溯
县城内要catch异常,记录日志和监控
使用countDOwnlatch 进行异步转同步操做,县城退出前必须调用countdown
如何合理地估算线程池大小,假设N为cpu核数
1.纯cpu计算应用 N
2.IO密集型应用
上限 ((线程等待时间+县城CPU时间)/县城cpu时间)×cpu数目
下线 qps
异步
前端轮询,后端异步
Future/CountDownLatch
消息队列
QMQ/Kafka/AMQ/rabbitmq
QMQ和kafka区别,QMQ的消息在消息中心推送出去,KAfka是存在消息中心
HTTp
async-http-client
Apache httpComponents
Dubbo异步调用、参数回调(调用须要注意,防止被调用方挂掉)
推荐图书 web性能权威指南
web安全
机密:持卡人资料,薪资信息,员工手机号
敏感信息:
内部:研究方法,培训资料,客户资料,财务数据
敏感信息打码
证件号,前4位至后3位之间的隐藏处理,手机号码前3位至后4位之间的隐藏处理,邮箱前3位至@之间的隐藏处理,银行卡信息后4位之外的隐藏处理
通用web安全问题
sql注入
用户输入的内容拼接到sql语句中,一块儿提交给数据库执行,改变原sql语句执行逻辑,甚至能够得到数据库服务器的系统权限;
JDBC方案,采用预处理执行sql,preparedStatement,采用占位符,数据库将用户输入值替代?,不参加数据库语句的编译
mybatis
统一使用#{},不使用$
针对like查询,在程序中对参数拼接%符号,并在sql配置中使用#{}接受
针对orderby和groupby,使用枚举限定查询参数,在sql配置中使用foreach生成orderby和groupby参数
身份认证安全-验证码安全
短信验证码调用次数限制,横线限制,对ip和浏览器进行限制,纵向限制,对同一个用户进行限制
短信验证吗失效策略,错误次数,时间,
图片验证码失效策略,
业务逻辑安全-身份认证逻辑
查询用户信息应该经过cookie确认身份,禁止使用user=%s或者id=%s这种参数查询
身份cookie验证_q,_v,_t或者_s,禁止取cookie中的username做为用户在线标识
业务逻辑安全-支付校验逻辑
帐户安全不等于支付安全
越权问题-缘由和分类
越权访问,实际上就是指权限控制上出了问题,
在web应用中,访问控制能够分为两大类
垂直权限管理 低权限用户访问到了高权限用户能访问的资源
水平权限管理 同一级别的用户能相互访问
越权问题-方案
对于后台程序,默认应该拒绝无受权用户的访问
受权帐号的角色级别要区分明确,避免纵向越权
应用程序是否验证,用户有权限访问资源
应用程序是否能保证,当前用户访问的资源是只受权给该用户的资源,避免水平越权;
从用户的加密认证cookie中获取当前用户的id,而且须要在执行的sql语句中加入当前用户id做为条件语句;
SSRF(Server-side request forgery)服务端请求攻击
内部url接口任意读取漏洞,能够通俗的理解为外部用户借助一些proxy功能的接口,实现了http代理功能,这种状况下若是proxy没有作任何限制,则容许外部用户经过接口读取任何的内部http服务;
缘由:url么有作过任何限制,致使能够直接请求内部的任何url接口去查询信息
URL任意跳转
web应用程序接受到用户提交的url参数后,没有对参数作“可信任url”的验证,就向用户浏览器返回跳转到该url的指令
XSS攻击
croess site script 跨站脚本攻击,它是指恶意攻击者往web页面里插入恶意js代码,当用户浏览该页时,嵌入web中的代码会被执行,从而达到恶意攻击用户的特殊目的,xss属于被动式攻击,由于其被动且很差利用,因此常常被忽略;
危害:盗取用户cookie以及浏览器信息,伪造用户身份进行操做,衍生url跳转漏洞,网页挂马,控制受害者的机器对其余网站发起攻击,xss蠕虫
输出转码:除下列状况外,必须对输出到客户端的变量进行相应的编码转义,不容许直接输出;
content-type:application/javascript
content-type:text/javascript
content-type:application/json
参数校验
java使用ESAPI.encoder().encodeForxxxx 方法针对不一样的语境,对输出标签进行编码;
cookie设置httponly,防止cooie跨域
文件上传
web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在容许的范围内,就把文件保存在服务器上,致使恶意用户能够上传任意文件,甚至上传恶意脚本木马到web服务器
缘由:未判断上传文件扩展名,未考虑逻辑错误,上传目录有执行权限;
文件下载
处理用户请求下载文件时容许用户提交任意文件路径,并把服务器上对应的文件直接发给用户,好比../../
形成任意文件下载的威胁;
恶意用户会利用变换目录或文件地址,来下载服务器上的敏感文件
产生缘由,未判断用户输入参数有效性
权限判断
解决上传下载问题,验证用户参数,限制../,权限判断,使用常量
CSRF cross-site request forgery 跨站请求伪造,因为目标站无token/referer限制,致使攻击者能够用户的身份完成操做达到各类目的
其本质是攻击者能轻易猜解到用户的参数
Refer限制
CSRFtoken,加一个猜不到的参数,攻击者就很难构造了
若是代理商须要访问内网后台,开放proxy以前须要作好权限控制和白名单
对目标url中的字串匹配不能防止url任意跳转问题,须要提取域名来作比较;
图片上传时,除了文件名的后缀校验,还要对文件内容进行校验;由于有些木马能够隐藏在图片文件中;;
穿上和下载目录只存放静态文件,禁止开放执行权限
安全问题
常见的坑
编码
所有使用utf8,可能有外部网站传入gbk编码的参数
Bom头问题(windows问题) 保存utf8会多加一些
svn diff 不要使用乌龟(不会提示文件编码改变)
外部资源响应慢
常见外部资源
database/cahe
dubbo
mq
http
外部依赖有问题时系统被拖死
解决办法
加监控
外部依赖必须设置合理超时时间
定时任务中断
常见缘由,异常没有catch或着catch有问题
后果,定时任务在某个特殊的时候,就中止不运行了
解决办法,catch住全部异常,使用qschedule
分布式环境使用本地cache
后果产生内容不一致的状况
解决办法,redis 使用memcached
错误的数据更新方式
一批数据的全量更新(好比memcached)
采用删除所有,批量添加新数据
后果
虽然可能很快,可能在几秒以内能够完成,可是这个时间缝隙内数据就是有问题的、
解决办法,采用更新的方式;
缓存null值
问题,缓存null,觉得未命中缓存
后果,数据库被一直打穿
解决办法,缓存的值要合理设计,null这种要另作处理
ThreadLocal在线程池环境下,使用后不清理
后果,内存泄露,数据错误
解决办法 避免使用或每次使用先后清理
分页查询
问题,批量分页查询没有限制最大个书
后果,恶意利用拖死服务器
解决办法
实现分页功能,要有默认值和最大值
故障平台
接口规范
接口数据格式变动须要事先通知调用方
接口状态枚举变动须要通知调用方
1.应用的申请、查找,废弃
2.维护应用开发人员列表
3.token管理下发
4.维护应用和实际运行机器的映射关系
5.监控及警报开关
6http及dubbo的访问限制管理
7日志收集相关配置
common基础类是什么(web必须依赖)
TCDev提供的一套基础依赖库
提供了公用组件共同的依赖,qconfig,qmq
提供了一些经常使用的功能
commonc-core最经常使用的依赖,提供应用中心和监控的接入
common-http 提供通过TCDev封装的同步和异步http client
common-web 提供http监控,标准httpAPI返回实现
common-rpc 以插件的方式为dubbo提供一些加强功能
common-block 提供http和dubbo的限流功能