前言
在我们开始开发一个系统之前,我们需要先做一件事,就是技术调研,专业的叫法就叫 技术选型。如果技术选型选不好,就容易给自己埋下一大推坑,对系统的后续维护,版本升级都是很不友好的。那我们如何选择呢,成本和效率都是我们需要考虑的问题。
为什么需要技术选型
- 降低开发成本
- 提高研发效率
- 系统可维护性
微服务架构三部曲
巨石应用
第一代单体应用,将所有模块打包到一起部署运行。
优点:易于部署、调试、运维方便,维护成本低
缺点:
- 不可靠,一个模块的bug就可能导致整个系统崩溃
- 单维扩展,只能通过增加实例提升系统性能,无法处理热点业务
- 不可持续发展,引入新的框架或语言需要重构所有代码
SOA
SOA(Service Oriented Architecture),面向服务架构, 它是 一种设计方法,设计上通常是自上而下的,服务间松散耦合。通过ESB对消息进行转化、解释、路由,联通各个服务
优点:服务松耦合、可扩展。
缺点:
- 没有解决单体应用单体故障的问题,也无法进行负载均衡
- SOA 更多的是为了复用,每个服务之间的拆分很大,这个时候每个服务相当于一个单体应用
微服务
微服务是去中心化的扩展,将服务组件化,自下而上,切分粒度更小,每个服务独立化部署,根据不同业务自由组合。
优点:业务隔离、并行开发、易于运维、独立部署
数据库访问层选型
JDBC
java database connectivity 是sun公司指定的java数据库连接技术简称
创建数据库jdbc的过程
- 加载驱动程序类,这里加载MySQL的jdbc驱动
class.forName("com.mysql.jdbc.Driver").newInstance();
(为什么在加载驱动的时候,要用反射
反射的作用:通过反射可以使程序代码访问装载到jvm 中类的内部信息
1)、获取已装载类的属性信息
2)、获取已装载类的方法
3)、获取已装载类的构造方法信息
使用场景:在编译时根本无法知道该对象可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息
优点:提供java程序的灵活性和扩展性,降低耦合,提供自适应能力
答:JDBC 是sun公司提供了一组api接口,由数据库厂商自己实现驱动程序,不同的厂商驱动不同,使用反射并将 驱动名称写在配置文件中,则可以降低代码的耦合度,这比每次都new 一个新的对象要好的多
)
- 建立连接
connection conn = DriverManager.getConnection(url,"user","password");
- 创建sql执行的容器
Statement statement = conn.createStatement();
- 拼装sql语句
String sql = "select * from table1";
- 用容器执行刚建立的sql语句,并返回结果集
ResultSet rs = statement.executeQuery(sql);
- 处理结果集
- 关闭连接
缺点:
1、频繁创建释放数据库连接,浪费资源
解决:数据库连接池
2、sql语句写在代码中,不利于维护
3、入参的映射,出参需要从结果集中遍历
优点:
原生jdbc的执行效率高
JdbcTemplate
是spring 对jdbc的封装 JdbcTemplate处理了资源的建立和释放,比如数据库连接的创建和释放,statement 的建立和执行
使用步骤:
1、创建 JdbcTemplate 对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceUtils.getDataSource());
2、编写SQL语句
String sql = "INSERT INTO product VALUES (NULL, ?, ?);";
3、使用 Jdbc Template 方法进行增删改
jdbcTemplate.update(sql, "iPhone3GS", 3333);
Hibernate
全自动化持久层框架
缺点:
1、hql 需要学习成本
2、高度封装,无法对原生sql进行优化
3、无法编写自定义SQL从而丧失了灵活活及更好的性能
Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
- dao层操作流程
- 获取连接
- 声明预处理器
- 设置参数
- 拼装SQL
- 执行获得结果集
- 封装成java对象
Mybatis Plus
是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它封装了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。
优点:
- 一键生成controller/service/mapper/entity/xml
- 提供通用针对单表的增查删改
- 提供Wrapper 针对相对复杂及自定义的查询操作
- 内置多种数据库的分页查询支持
- ID主键生成器
- 全局逻辑锁
- 还有其他缓存/批量处理的能力
缺点:
- 对开发人员的要求高,需要学习成本
- 后期升级维护,问题排查,性能提升不方便
数据库连接池选型
MQ消息中间件选型
MQ消息队列简介
常见MQ
选择方法:
- 功能不具备,直接否决
- 重性能还是重扩展
- 技术栈,团队驾驭能力,保证功能的健壮性
远程通信框架选型
RPC(远程过程调用)运行期状态与流程
- 调用方发起
- 寻址路由
- 协议适配/序列化
- 网络传输
- 反序列化/协议解析
- 处理逻辑返回调用方
RPC框架核心技术点
远程通信框架对比
网关层技术选型
网关解决的问题:
- 微服务提供的 API 的粒度通常与客户端所需的粒度不同
- 不同的客户端需要不同的数据
- 微服务实例数量及其位置(主机+端口)动态变化
- 服务划分会随着时间的推移而变化
- 服务可能会使用多种协议,有些是非 web 友好协议
网关分类:流量网关和业务网关
业务网关技术选型
路漫漫其修远兮,吾将上下而求索
参考文档:
Joel老师的ppt
mybatis-plus 我不用了_maple_son的专栏-CSDN博客_公司为什么不用mybatisplus