管理
【构成】
- 40人:8-12人一组 1:3:4 2:4:4:2
- 人员备份
【成长】
- 新成员的培训,发挥传、帮、带
- 老成员的提升,关注新知识,知识共享
- 摸清每个人的实际情况、差异化管理(从性格、能力考虑)
【团队文化】
- 杜绝死气沉沉、苦哈哈的工作模式。团建、集体运动等
- 团队的凝聚力,抱团(有问题大家一起面对,有难同当、有福同享)
- 激励机制,有冲劲的成员给他足够的空间
- 个别刺头,多次沟通(把握沟通方式,先私下再公开),防止“一带一路”
【工作方式】
- 统一工作模式,避免各自为政,一盘散沙
- 项目采用scrum,每天例会等等,提前预知项目风险
- 编码统一springboot 、数据库等开发版本
- 代码规范:注解规范、开发工具规范
- 公共服务提取、公用,避免重复编码、资源浪费
【自我提高】
- 技术提升,亲临一线解决实际问题
- 自我修养,智商、情商、心胸
- 沟通语气,当面沟通,尊重每个人
技术
Nginx优化
# nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数。
worker_processes 8;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#长时间占着连接资源不释放,最终会导致请求的堆积,Nginx 处理请求效率大大降低
1、长连接超时配置
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
2、代理设置 与后端服务器建立连接的超时时间。注意这个一般不能大于75秒
proxy_connect_timeout 30s;
proxy_send_timeout 120s;
#GZIP 压缩,将一些静态文件先进行压缩
gzip on;
#Ngnix缓存
#访问限流
限制用户连接数来预防DOS攻击
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
#Nginx-/etc/sysctl.conf
#TCP接收/发送缓存的最小值、默认值、最大值
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
领域驱动
- 领域建模-战略
step1:业务角度出发,事件风暴(分析流程等)
step2:划分业务领域边界,建立基于业务语言的限界上线文
step3:建立领域模型
step4:映射到微服务
---------------------------------------
限界上线问与子域的关系
子域:业务角度
限界上线文:技术角度
- 微服务拆分和设计-战术
step1:事件风暴找出实体和值对象
step2:从实体中找出聚合根
step3:将业务关联紧密的聚合根、实体、值对象组合在一起形成聚合
step4:结合业务将多个聚合划分到一个限界上下文中
step5:分层设计
@@@@@@@@@@@@@@@@@@@@
- 分层
- 接口层
- 应用层
- 领域层
- 基础层
微服务
日志打印频繁:
日志级别设置;crontab删除;
SQL优化
优化目标:减少IO、降低CPU计算
【环境设计】
1.INNODB_BUFFER_POOL_SIZE: 设置最佳内存值(推荐设置为服务器总可用内存的80%)
* 数据缓存 – 这绝对是它的最重要的目的
* 索引缓存 – 这使用是的同一个缓冲池
* 缓冲 – 更改的数据(通常称为脏数据)在被刷新到硬盘之前先存放到缓冲
* 存储内部结构 – 一些结构如自适应哈希索引或者行锁也都存储在InnoDB缓冲池
2.慢查询日志打开 slow_query_log:ON
3.禁用 SWAP(物理内存不够用的时候,把硬盘内存中的一部分空间释放出来)
4.磁盘选择Raid0(RAID 0读写速度快,安全差;RAID 1读写速度慢,安全好)
5.开启独立表空间 提升性能。innodb_file_per_table
MySql 5.7 innodb_file_per_table 解决的问题:在linux系统中不允许并行的对一个文件进行写入;drop table ,truncate table后表空间文件并不会进行收缩
【语句】
- 执行计划explain
- 用 join 代替子查询
- 尽量早过滤
- Order by 、where尽量建立在索引之上
- 尽量避免用or,则将导致引擎放弃使用索引而进行全表扫描,用union代替:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
6.能用between就别用in,否则全表扫描
7.left join 把大表放在后边; right join把大表放在前面
8、最左前缀匹配原则
SQL注入
1、通过写正则校验
2、JDBC用PreparedStatement,有预编译过程
3、MyBatis有预编译过程,不会出现sql注入。MyBatis 用#(会加引号), 不要用$
DDos
Nginx:(1)nginx的http_limit_conn(单个IP的连接数)和http_limit_req(单个IP每秒请求数)模块来防御 (2)白名单
跨域攻击
CSRF(跨站请求伪造)
表单提交时,填随机数
- 验证 HTTP Referer(记录了该 HTTP 请求的来源地址) 字段
- CSRF一般都是从cookie中获取信息(黑客可以不用登录信息拿到cookie)。 Anti CSRF TOKEN
- 尽量POST
- 加入验证码-(让人能看到是用户行为,不是黑客行为)
-------------------------------------------------------------------------------------------------------------
CORS(跨域资源共享)指不同域名之间相互访问
怎么能跨域:
前端:JSONP(老方法)
后端:
- nginx反向代理解决跨域
- 服务端设置Response Header(响应头部)的Access-Control-Allow-Origin
- 继承使用Spring Web的CorsFilter
- GateWay globalcors
XSS
本质:
XSS的本质就是web页面里面注入恶意的js
HttpOnly
输入、输出检查
JVM
Jmap
是否大量应该被回收的对象在一直被引用或者是否有占用内存特别大的对象无法被回收
JConsole
记录了“堆内存使用情况”、“线程”、“类”、“CPU使用情况”共四个资源的实时情况
程序计数器:保存当前执行指令的地址
堆:存对象和数组
方法区:跟堆差不多,保存静态变量、常量等
栈:方法执行的内存模型
本地方法栈:执行本地服务native method
常见问题:
StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度
OutOfMemoryError:虚拟机在扩展栈时无法申请足够的内存空间
从三方面考虑:
堆:Xmx、Xms 初始内存、最大内存
-Xmx3g -Xms3g,将JVM最大内存与初始内存设置相等,避免JVM垃圾回收后重新分配内存
-Xmn1g,年轻代Sun官方推荐配置为整个堆的3/8,通常设置为1/3或1/4;
-XX:NewRatio=4 调整年轻代与年老代比例(年轻代:年老代=1:4)
-XX:MaxTenuringThreshold=0 设置晋升到老年代的对象年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制。
栈:Xss设置每个线程的堆栈大小
减小每条线程的堆栈大小,能生成更多的线程
GC:串行收集器、并行收集器、并发收集器,我们选择并行收集器。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等
GC算法:
清除算法、复制算法、整理算法、分代收集算法
Scrum
瀑布开发模式:
需求分析,要件定义,基本设计,详细设计,编码,单体测试,结合测试,系统测试等
敏捷开发模式:
需求、设计、编码、测试、维护
敏捷开发是一种以用户的需求进化为核心,采用迭代、循序渐进的方法开发的方法
将一个大的项目分为多个子项目,围绕最小化可行产品的特性进行产品规划,并且分别完成。每个子项目都经历规划(Plan)、开发(Build)、测试(Test)、评审(Revidw)四个阶段,这四个过程合称为一个迭代(Sprint),通常一个迭代需要一到三个星期。
极限编程: 敏捷过程模型的一个实例
极限编程过程分为策划、设计、编码和测试四个阶段
团队:
产品经理、团队负责人、开发、测试、运维
步骤:
Step1:PO交付需求列表
Step2:由开发负责人进行讨论,开发可行性和工期可行性,形成迭代需求列表
Step3:团队负责人根据需求拆分相应的子任务,排期
Step4:每日站会报告计划和完成,及早发现风险
Step5:提测演示、测试上线。产品验证,确定是否上线
Step6:迭代总结会发现待改进的地方,不断提高产品质量
Step7:上线后收集反馈意见,形成用户故事,进入下一次迭代
ES
先index,后replicate: 初始化索引时,在索引设置中指定零个复本分片,并在索引完成后添加副本
ElasticSearch本质上是个Java程序,配置JVM垃圾回收器本身也是一个很有意义的工作。Xms和Xmx,避免出现OutOfMemoryException
GC默认没有开启
线程池大小设置
Filter Query
Bulk写
(1)
ES 性能好,最佳的情况下,就是你的机器的内存,至少可以容纳你的总数据量的一半
id,name,age .... 30 个字段。但是你现在搜索,只需要根据 id,name,age 三个字段来搜索。
如果你傻乎乎往 ES 里写入一行数据所有的字段,就会导致说 90% 的数据是不用来搜索的。
结果硬是占据了 ES 机器上的 Filesystem Cache 的空间,单条数据的数据量越大,就会导致 Filesystem Cahce 能缓存的数据就越少。
其实,仅仅写入 ES 中要用来检索的少数几个字段就可以了,比如说就写入 es id,name,age 三个字段
(2)
每次滑动向后翻页就是通过游标 scroll_id 移动
(3)
Search_after
其他
Zk 保证CP 30~120S
Eureka 保证 AP
Eureka VS Nacos
界面化、业务层面分组、设置权重、配置动态刷新
Nacos支持RPC发现,也适用于dubbo
Redis fork 6-8G
常见问题