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的限流功能
- 移动端web开发进阶
三个月前曾写过一篇跨终端响应式页面设计入门的博客,上了博客园头条也得到了不少关注,今天想在这篇博客的基础上,继续写一篇进阶的文章. 补充 基于“入门”一文,我想再补充几个基础知识点,主要都是针对iOS ...
- Java Web 开发进阶案例之人事管理系统的完整实现
技术:Java+ jsp + servlet+ javabeans +sql+tomcat 概述 本系统的主要任务是实现人事管理系统的系统化和自动化管理, 主要包括招聘入 职.到期离职和员工调动信 ...
- 高性能Web开发系列
1. 高性能WEB开发基础 http://www.uml.org.cn/net/201404225.asp 2. 高性能WEB开发进阶(上) http://www.uml.org.cn/net/201 ...
- Solon详解(三)- Solon的web开发
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Springboot mini - Solon详解(三)- Solon的web开发
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- 处女作《Web全栈开发进阶之路》出版了!
书中源码下载地址:https://github.com/qinggee/WebAdvanced 01. 当初决定写博客的原因非常的纯洁:只要每个月写上 4 篇以上博客,月底的绩效奖金就多 500 块. ...
- 《Flask Web开发实战:入门、进阶与原理解析(李辉著 )》PDF+源代码
一句话评价: 这可能是市面上(包括国外出版的)你能找到最好的讲Flask的书了 下载:链接: https://pan.baidu.com/s/1ioEfLc7Hc15jFpC-DmEYBA 提取码: ...
- Web 开发中应用 HTML5 技术的10个实例教程
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
随机推荐
- JS字符串和数组之间的转换
1.字符串转换为数组 var string = '123,456,789'; var stringResult = string.split(','); console.log(stringResul ...
- android SharedPreferences 存储文件
- PHP字符串操作函数练习20191025
<?php$arr=["tom","peter","mary"];$str=implode("+",$arr);/ ...
- create-react-app创建项目后,运行npm run eject报错解决方法
运行npm run eject报错解决方法 主要问题是脚手架添加.gitgnore文件,但是却没有本地仓库,使用以下命令操作以下就可以了 git init git add . git commit - ...
- JS 富文本编码、解码
第一种 escape()和unescape()方法 escape() 方法能够把 ASCII之外的所有字符转换为 %xx 或 %uxxxx(x表示十六进制的数字)的转义序列.从 \u000 到 \u0 ...
- 二、JPA的注解
@Entity注类就表示实体类了.注意:必须要有@Entity注解,否则会报错. @Table里面的就是表名和类名进行映射. @Id标识主键列,@GeneratedValue主键生成策略配合@Id使用 ...
- webpack 学习4 使用loader 以及常用的一些loader
webpack本身只支持处理JavaScript,其他的文件,如css img less是不识别的,所以才会有loader这个东西,它就是可以使webpack能够处理其他非js文件的拓展程序 首先我们 ...
- Vim默认开启语法标识功能
把syntax on加到$HOME/.vimrc文件中.
- 【leetcode】908. Smallest Range I
题目如下: 解题思路:简单的不能再简单的题目了,对于任意一个A[i]来说,其可能的最小的最大值是A[i]-K,最大的最小值是A[i]+K.遍历数组,求出所有元素中最大的最小值和最小的最大值,两者之差( ...
- 【leetcode】757. Set Intersection Size At Least Two
题目如下: 解题思路:贪心算法.首先把intervals按第二个元素从小到大排序,然后遍历intervals,如果集合S和intervals[i]没有交集,那么把intervals[i]的最大值和次大 ...