技术选型 - 如何写一个自己的项目
做着玩和真正上线有很大的区别
项目流程
需求流程图:
大致步骤如下:
需求分析 => 设计(概要设计、详细设计)=> 技术选型 => 初始化 / 引入需要的技术 => 写 Demo => 写代码(实现业务逻辑) => 测试(单元测试、系统测试)=> 代码提交 / 代码评审 => 部署 => 发布上线
研发流程图:
个人需求分析
项目创作原因
- 挖掘需求:自己遇到的问题,看别人的项目并且找出别人项目的缺点
验证需求是否有价值:能解决别人的问题,能否解决通用的问题(对内 - 对自己、对外 - 对其他用户)
项目价值
- 对别人的价值
- 兴趣
- 引流
- 做项目出视频、分享
- 巩固所学知识
与其他同类型项目对比
例如,做博客系统
竞品:
- A :vuepress
- B : Docisify等工具
- C : CSDN,博客园等平台
A + B + C 进行融合,取长补短、精简化
为什么市面上轮子多?
- 每个产品都有优点、优缺点,面向的需求不一样
- 不同的公司有各自擅长的领域,语言体系,为了内部能统一使用,会开源一些项目供内外部使用
需求篇
- 千万不要一上来就大而全,要先把核心功能 快速上线和验证,得到用户反馈
- 再进行下一步操作。
- 不要闷头开发,需要得到反馈,至少是让同事或朋友体验使用中的不足。
- 敏捷开发,小步快跑,慢慢加功能。
重点**:分析项目核心功能**
扩展**:后期扩展功能考虑**
技术选型
问题
需要回答以下几个问题:
什么是技术选型?
- 需要确定用哪些技术来完成项目的开发和维护。
技术选型选什么?
- 用哪类技术?比如编程语言,开发框架、数据库
- 具体用什么技术?比如编程语言用 C++还是 Java?开发框架用 Spring 还是Vert.x?
- 技术用哪个版本?比如 Vue 2 还是 Vue 3? Java 8 还是 Java 11?
为什么要做技术选型?
- 为了更好地开发和维护项目(提高效率,节约成本,提升体验)。
怎么做好技术选型?
先有的选:
- 分析一下完成这个需求要用到哪些类别的技术?
- 例如做一个网盘系统,需要选择开发语言,前端/后端开发框架、文件存储系统等。
- 从百度、Google、GitHub、掘金等各个平台搜索各类技术,比如搜索:主流的文件存储系统。然后把搜到的所有技术以清单的形式记录在一个文档里。建议大家先尽可能多地搜索同类技术,不要只盯着某个技术不放。
- 有了可选项之后,可以从 主观和客观 两个视角去分析技术。
主观分析:
- 通过官方文档了解技术作用、优缺点、适用场景等
- 业务适用性。数据库的选择,消息队列的设计
- 现有条件:团队技术栈,公司所能提供的资源,提高云主机的CPU核数和硬盘容量
客观分析:
- 选择知名度高、有大厂背书、持续维护、活跃度高的、开源的、生态好的技术
- 例如,业内普遍使用的Spring Cloud微服务框架、Vue和React前端框架等
后续分析
需要综合考虑成本、项目量级、所使用技术的生态等。
项目的量级(用户数、使用频率)
成本
- 价格 (所需云主机的数量)
- 人力成本 :围绕着人来,团队对技术的熟悉程度;团队内要有一个问题解决者、领导者
生态
如何判断:去网上搜 github 的 star 数**(开源)**、业内的认可、文章
- Spring /Spring boot
- Vue、React
- gRpc
看作者(看公司):google,apple,tencent
稳定性
目的:学习
如果是独立开发,考虑自己的技术栈即可。如果是团队协作,需要考虑大家都会的技术栈。
常用的技术框架
前端:三件套 + React + 组件库 Ant Design + Umi + Ant Design Pro(现成的管理系统)
技术 | 说明 | 官网 |
---|---|---|
Vue | 前端框架 | https://vuejs.org/ |
Vue-router | 路由框架 | https://router.vuejs.org/ |
Vuex | 全局状态管理框架 | https://vuex.vuejs.org/ |
Element | 前端UI框架 | https://element.eleme.io/ |
Axios | 前端HTTP框架 | https://github.com/axios/axios |
v-charts | 基于Echarts的图表框架 | https://v-charts.js.org/ |
后端:
- java
- spring(依赖注入框架,帮助你管理 Java 对象,集成一些其他的内容)
- springmvc(web 框架,提供接口访问、restful接口等能力)
- mybatis(Java 操作数据库的框架,持久层框架,对 jdbc 的封装)
- mybatis-plus(对 mybatis 的增强,不用写 sql 也能实现增删改查)
- springboot(快速启动 / 快速集成项目。不用自己管理 spring 配置,不用自己整合各种框架)
- junit 单元测试库
- c++
- poco: 是一个开源的C++类库的集合,它主要提供简单的、快速的网络和可移植应用程序的C++开发
- Boost:大量通用C++库的集合。
- libev:功能齐全,高性能的时间循环,轻微地仿效libevent,但是不再像libevent一样有局限性,也修复了它的一些bug。
- protobuf:协议缓冲,谷歌的数据交换格式。
- mysql 数据库
部署:服务器 / 容器(平台)
技术 | 说明 | 官网 |
---|---|---|
Spring Cloud | 微服务框架 | https://spring.io/projects/spring-cloud |
Spring Cloud Alibaba | 微服务框架 | https://github.com/alibaba/spring-cloud-alibaba |
Spring Boot | 容器+MVC框架 | https://spring.io/projects/spring-boot |
Spring Security Oauth2 | 认证和授权框架 | https://spring.io/projects/spring-security-oauth |
MyBatis | ORM框架 | http://www.mybatis.org/mybatis-3/zh/index.html |
MyBatisGenerator | 数据层代码生成 | http://www.mybatis.org/generator/index.html |
PageHelper | MyBatis物理分页插件 | http://git.oschina.net/free/Mybatis_PageHelper |
Knife4j | 文档生产工具 | https://github.com/xiaoymin/swagger-bootstrap-ui |
Elasticsearch | 搜索引擎 | https://github.com/elastic/elasticsearch |
RabbitMq | 消息队列 | https://www.rabbitmq.com/ |
Redis | 分布式缓存 | https://redis.io/ |
MongoDb | NoSql数据库 | https://www.mongodb.com/ |
Docker | 应用容器引擎 | https://www.docker.com/ |
Druid | 数据库连接池 | https://github.com/alibaba/druid |
OSS | 对象存储 | https://github.com/aliyun/aliyun-oss-java-sdk |
MinIO | 对象存储 | https://github.com/minio/minio |
JWT | JWT登录支持 | https://github.com/jwtk/jjwt |
LogStash | 日志收集 | https://github.com/logstash/logstash-logback-encoder |
Lombok | 简化对象封装工具 | https://github.com/rzwitserloot/lombok |
Seata | 全局事务管理框架 | https://github.com/seata/seata |
Portainer | 可视化Docker容器管理 | https://github.com/portainer/portainer |
Jenkins | 自动化部署工具 | https://github.com/jenkinsci/jenkins |
Kubernetes | 应用容器管理平台 | https://kubernetes.io/ |
设计篇
- 数据库设计
- 设计用户表,订单表,商品表
- 提高性能
- 消息队列 RabbitMq
- 分布式缓存 Redis
- 提高搜索效率
- Elasticsearch
- 考虑数据同步
ES 和 MySQL 怎么同步(保证一致性)?
强一致性:
- 事务双写:插入数据时两个库里都必须插入成功,才算成功,有任何一个失败就回滚(写入性能低)
稍强一致性:
- 监听 binlog:mySQL 在插入数据成功后,会写入 binlog 日志,我们只开一个程序(线程)需要监听 binlog 的变化,如果发现有插入,就也插入到 es(canal 技术)
弱一致性:
- 定时同步:每分钟读取 MySQL 中近 5 分钟内新增的数据,然后写入 ES(根据 id 判断已写入)
定时检测和补偿程序:每天 / 每小时去对比两个库,如果发现不一致,自动以数据库为主,或者发送告警,人工处理。
团队开发篇
招募志同道合的伙伴一同开发
要有一个协作文档 / 平台
- 通过excel定制和分配任务
- github平台,提交各自任务的代码
日常沟通:了解各自工作情况、代码编写信息
团队管理:
- 需要有负责人,统筹开发周期,测试验证,产品上线等工作
- 日常代码提交需要 CodeReview
- 构建Jenkins等自动化工具辅助开发
技术源码篇
前端
后端
其他服务
项目上线篇
建议选择 Docker/K8s 方式部署,弹性伸缩很方便。
测试验证
开源前:写好 README.md 项目介绍文档,参考知名项目的文档仿写,可以复制别人的 README 改写
小图标网站:https://shields.io/
运营篇
产品的持续维护,功能迭代更新
收集用户反馈
给网站添加统计分析功能(比如百度统计),查看用户访问数、用户来源
推广篇
- 推广给志同道合的同事、朋友或者自媒体上推广