定义:
开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则。
一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
意义:
降低代码耦合,减少风险,增强了系统的稳定性
Demo:
比如同一个接口,后面做了版本升级。为了保证原app等对该接口的调用,该接口不应该发生任何变动。为了新app支持新功能特性,应该支持新的版本接口,在新的接口里面实现这些功能并且提供给新的调用方。
1.首先应考虑在 where 及 order by 涉及的列上建立索引。索引不能过多,不利于删除,插入等操作。
2.应尽量避免在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用!=或<>操作符,将引擎放弃使用索引而进行全表扫描
4.应尽量避免在 where 子句中使用 or 来连接条件,将导致引擎放弃使用索引而进行全表扫描
5.合理使用like模糊查询,不要乱用
6.不要在 where 子句中进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
7.不要写一些没有意义的查询
8.很多时候用 exists 代替 in 是一个好的选择
9.选择合适的字段类型,尽量使用数字型字段。
15.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间
16.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
17.避免频繁创建和删除临时表,以减少系统表资源的消耗。
忌讳回答:
说出上一家公司各种问题,对领导不满等等问题
参考回答:
将上一家公司的优点列出来,对公司的认可度也罗列一些。
经济不好,部门裁员;
相关部门部撤销;
个人追求更好的公司,主动离职;
服务器层次
负载均衡;
针对不同地区进行分区部署;
服务器配置;
如果数据量返回较大,请启用gzip模式
缓存
前端缓存:将页面缓存到缓存服务器,比如pagecache等
后端缓存:将数据存储到redis等数据库中
数据库层次
数据库引擎选择:innodb和myisam
合适的字段类型;
反范式的数据表;
建立正确的索引(重要);
数据库分区,不要跨区访问,比如国内访问国外的数据库。尽量将数据库和web服务器同一地区,甚至同一局域网(比如直接通过容器访问)
读写分离,主从同步;
请求层次
减少接口请求次数,尽量一次性将数据返回;
gzip将压缩结果返回给前端,而不是原格式化的数据。
代码层次
不要写死循环;
尽量用高效代码,比如:
用 && 而用and等;
尽量少用正则去匹配;
字符串尽量单引号,双引号需要翻译变量;
https://new.qq.com/rain/a/20230406A00Q8T00
终端层次
部分数据可以直接缓存到页面,而不是每次都请求接口。
一台计算机的计算资源是有效的,当超大流量请求时,就可能导致请求等待或者服务器死机的情况,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
关键字优化;
图片优化,不要太大,影响加载速度;
网页整体加载速度;
图片alt;
sitemap;
robots.txt 禁用以及开启爬取页面;
url地址静态化;
避免301,302,404等异常页面链接出现在网页;
规范的html代码
1. token校验
登录后生成token,客户端中将token存储cookie中,服务器端将token存储与session中。后续的接口请求必须带上token,当和服务器一致则认为请求安全。
常用于客户端和服务器端的安全校验。
2. 服务器之间的sign签名校验
A服务器中用一个 key(私钥) + 时间戳 通过算法生成一个公钥,将时间戳和公钥传递给服务器B。服务器B通过同样的私钥和时间戳来生成一个公钥。如果两个公钥相同,则签名通过。
用于服务器和服务器之前的签名认证。比如支付宝,微信等接口签名下发。
3. 验证码
当部分接口可能涉及到大量的请求来攻击的时候。比如登录,注册等包含提交信息的。需要先验证验证码,当验证码通过后才会处理后续逻辑。
缺点是,每次都要输入验证码,影响用户体验。可以通过某段时间范围内,用户请求量是否超过某个阈值,当超过某个阈值后,才会出现输入验证码,否则不会出现验证码。
4. 接口请求频次限制
部分接口可能涉及到用户大量频繁的提交,但是当超过某个频次后,我们可能认为他是恶意攻击。比如聊天室,搜索接口,翻译等接口。
当某个ip或者token对接口在时间范围内有大量请求的时候,应该将该用户的ip限制,接口返回429。
5. 正确使用post,get请求方式。涉及有安全数据的,应该用post来提交。
6. 接口返回中应该将不需要的数据过滤。比如获取某个用户信息接口,如果只要用户名,就返回用户名。不要将该用户的用户名,密码,住址等私密信息返回,以便于造成泄露。
7. 使用https
8. 定时的分析接口请求日志或者nginx日志,确认是否有非法的访问,防患于未然。 你会经常发现,请求中包含各种路径,甚至包含sql语句的。根据这种请求分析自己的系统中是否存在漏洞
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。
正向代理
突破访问显示:通过代理服务器,可以突破自身ip访问限制,访问国外网站等;
提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;
提高客户端的安全性和性能。
反向代理
负载均衡:根据服务器的负载情况,将客户端请求分发到不同的真实服务器上,从而避免过载;
提高访问速度:反向代理服务器可以对静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度;
防止被攻击:如果网站使用反向代理,则其服务器地址是隐藏的;
缓存:反向代理服务器可以用来缓存网站内容,提高网站性能;
SSL加密:为每个用户加密和解密安全套接字层(SSL)通信对于源服务器可能无效,反向代理可以通过加密和解密所有请求来完成这项工作。
相同点
都起到了连接与保护的作用,正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。
都能提高访问速度。
不同点
正向代理是用户客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁;
正向代理架设在客户机和目标主机之间,反向代理架设在网络服务器端;
正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。