谈一谈项目优化(上篇)

谈一谈项目优化(上篇)    

create by wend 
    提到项目优化这个话题,我觉得它是一个几乎可以把所有所学可以全部掏出来讲一通的一个大话题了。此话题我觉得可以无限延伸,几乎可以把所有知识全部串起来讲一遍的感脚。经过一阵子的学习和思考后,接下来我要提出我能想到的几个关于项目优化的方向:
    一 项目架构优化
    二 项目代码/注释优化
    三 程序性能优化
    四 API/中间件优化
    五 高并发解决方案
    首先来谈一谈项目架构优化。一个最简单的项目结构,是由客户端和服务端组成的,项目就是部署在服务端容器的程序。如图:


而我们需要优化的点是基于服务端的优化,优化方向基本上是从两方面来考虑,一是垂直拓展,针对单体的服务器的软件/硬件进行优化;二是水平拓展,当客户端增加,单台服务器不能满足客户端消费时,那么我们也需要考虑增加服务器数量来保证生产者和消费者的请求,响应速度和稳定性等因素。项目架构,基于水平拓展优化来考虑,目前我比较熟悉的web方向上,比较流行的架构是分布式架构。目前比较流行的分布式架构有两种,Dubbo和SpringCloud。

关于两者的选型,使用Dubbo构建的微服务架构就像组装电脑,各环节我们的选择自由度很高;而Spring Cloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性。以及我想强调的Dubbo和SpringCloud中比较重要的一点不同,在服务注册和发现,Dubbo使用的是zookeeper,采用主从复制思想,保证了一致性和分区容错性;SpringCloud使用的是Eureka,采用同步机制和本地缓存机制,保证了可用性和分区容错性。看了一些文章,觉得可用性要比一致性更重要,springCloud社区要比Dubbo社区更活跃什么的。。。所以个人偏向使用SpringCloud建立分布式架构,附一张基于SpringCloud的架构图。

里面涉及的一些架构优化方案:

一,应用集群部署(分布式,集群,负载均衡)
分布式部署:将业务拆分后使用springboot开发微服务,可以使用Docker类容器统一管理部署微服务。

集群部署:以生产者和消费者为粒度进行划分的化,可以分为生产者和消费者集群,Eureka集群的EurekaClient和EurekaServer保证生产者和消费者集群的可用性和容错性。

负载均衡:负载均衡是高可用系统必须的,一般应用通过负载均衡实现高可用,分布式系统通过内置的负载均衡实现高可用(SpringCloud的Ribbon),关系型数据库通过主备方式实现高可用(主从复制,读写分离,主写从读),

处理客户端请求采用Nginx的反向代理实现负载均衡。

二,多级缓存

缓存按照存放的位置分为本地缓存和分布式缓存。一般设计为二级缓存,一级缓存为本地缓存,二级缓存为分布式缓存。
一级缓存:缓存数据字典,和常用热点数据等基本不可变/有规则变化的信息,
二级缓存:缓存需要的所有缓存。当一级缓存过期或不可用时,访问二级缓存的数据。如果二级缓存也没有,则访问数据库。

图中采用redis集群作为缓存方案,个人认为redis集群比较重要的思想是主从复制和哨兵模式。正好小编整理过一篇关于redis知识的脑图,随便分享一下。

https://mind.airmore.cn/doc/aca2071147

三,数据库集群(读写分离,分库分表)
为了存储海量数据,高可用和高性能一般采用冗余的方式进行系统设计。
一般有两种方式:

1.读写分离:适用于读大于写比例的场景,可采用一主一备,一主多备或者多主多备。
2.分库分表:业务拆分后,每个子系统需要单独的库,单独库太大的话,可以再次细化,为商品分类库产品库等。分库之后要分表,垂直划分或者水平划分,可以按照id时间等水平切割,高级用法是采用一致性hash算法。在分库分表的基础上进行读写分离。

四,消息队列

消息队列的三大作用(异步化、解耦、消除峰值),当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。目前市面上的MQ比较多,关于MQ的选型大家可以去自行搜索一下。一般来说中小型推荐用RabbitMq,中大型推荐用RocketMq,大数据,日志处理使用kafka。

如果接手的项目不是分布式架构,而团队又想朝着分布式架构去努力的,我觉得可以参考下面这篇文章,一点点的去完善整个项目的架构。
https://blog.csdn.net/qq_37856300/article/details/83714182

二,接下来谈一下关于项目代码/注释的优化。

拿到一个项目,我们最先要去做的肯定是要阅读理解项目代码,这个时候我们就可以试着手关于项目注释和代码规范上面的优化了。关于注释优化,公司如果有明确要求如何注释则按照公司要求,如果公司没有要求,我们也要有自己良好的注释习惯,保正注释的规范性。我们可以在idea 中的Editor选项中的 File and Code Templates 中配置规范性的注释模版。


关于代码规范,我们可以利用idea 的plugins 下载一个  Alibaba Java Coding Guidelines ,一个由阿里巴巴 P3C 项目组研发的《阿里巴巴 Java 开发规约》扫描插件,来帮助我们检查代码规范。
安装方式:打开 Settings >> Plugins >> Browse repositories

当然刚接手项目的时候,千万不要着急去改代码,优化代码,即使是本地代码,即使是微小的调整。我觉得我们需要做的是更有规划性的解决问题。可以把我们想要提出的问题,修改的点先列出来,做一个清单,先跟上级领导汇报沟通。这样之后改起代码来更有信心,更有效率(再也不用担心自己背锅了,哈哈哈)。

三 关于程序性能优化

我们可以把程序性能优化分为以下几个方面去考虑:

1.设计调优:

一,合理的利用设计模式,比如:
    使用单例模式减少可复用对象频繁创建的开销;
    使用代理模式实现延迟加载,用到的时候再进行初始化加载;
    使用享元模式复用大对象,程序中共享一份对象的拷贝;
    使用装饰者模式组装大对象,实现有效分离性能和功能组件;

二,AOP切面编程框架的运用

我们可以使用AOP将系统的业务流程和功能分离开,从而解偶业务和功能代码,增加代码的可读性。

附上一个我写的AOPdemo :https://github.com/q85064972/AopspringbootDemo.git

之后我会补充一个关于AOP理论的脑图总结。

2.代码调优:

针对程序最基础的数据结构和算法上的调优,比如:
    ArrayList适合读,LinkedList适合操作;
    对于字符串报文使用StringBuffer append代替 String字符串拼接; 
    对象什么时候适合作为静态变量,什么时候适合作为局部变量;
    是否可以用一些JAVA的新特性代替老方法,比如JAVA8的Optional类的使用,Lambda表达式和函数式的使用,Streams简化集合操作等。

代码调优部分可以参考:
阿里巴巴JAVA编码规范

JAVA代码精简之道 
https://baijiahao.baidu.com/s?id=1666329691707509681&wfr=spider&for=pc

3.数据库调优:

针对sql语句的优化,以及针对数据库表结构,索引建立方面的优化。无论是Mysql还是Oracle,我们都可以用Explain 执行计划,帮助我们检测sql语句的执行效率。建立一个好的索引,以及如何让SQL语句正确的使用到每个索引,我觉得是提高sql语句性能主要需要关注的点。而对于Insert ,Delete 这种会造成锁表的操作语句,我们更需要关注它的一个执行时间,尤其是批量更新,批量删除这种操作,我们可以合理的使用limit 语句,将大批量数据进行拆分,不至于导致长时间锁表这种情况发生。
附上一个小编写的关于数据库方面优化总结的脑图。

https://mind.airmore.cn/doc/8a22064074

4.JVM调优和操作系统调优:

小编目前并没有掌握这两部分,希望有大神愿意给我补充,或者以后等我有深入了解这块再进行补充吧!

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值