孤尽训练营打卡日记day10--技术选型

前言

        在我们开始开发一个系统之前,我们需要先做一件事,就是技术调研,专业的叫法就叫 技术选型。如果技术选型选不好,就容易给自己埋下一大推坑,对系统的后续维护,版本升级都是很不友好的。那我们如何选择呢,成本和效率都是我们需要考虑的问题。

为什么需要技术选型

  • 降低开发成本
  • 提高研发效率
  • 系统可维护性

微服务架构三部曲

巨石应用

        第一代单体应用,将所有模块打包到一起部署运行。

优点:易于部署、调试、运维方便,维护成本低

缺点

  • 不可靠,一个模块的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(远程过程调用)运行期状态与流程

  1. 调用方发起
  2. 寻址路由
  3. 协议适配/序列化
  4. 网络传输
  5. 反序列化/协议解析
  6. 处理逻辑返回调用方

RPC框架核心技术点

 远程通信框架对比

网关层技术选型 

网关解决的问题:

  • 微服务提供的 API 的粒度通常与客户端所需的粒度不同
  • 不同的客户端需要不同的数据
  • 微服务实例数量及其位置(主机+端口)动态变化
  • 服务划分会随着时间的推移而变化
  • 服务可能会使用多种协议,有些是非 web 友好协议

网关分类:流量网关和业务网关

 业务网关技术选型

 

路漫漫其修远兮,吾将上下而求索

参考文档:

Joel老师的ppt
mybatis-plus 我不用了_maple_son的专栏-CSDN博客_公司为什么不用mybatisplus

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想将 Vue 3 路由的导航方式改为使用 `el-dialog` 打开页面,你可以按照以下步骤进行操作: 1. 首先,在你的组件中添加一个 `el-dialog` 组件,并设置一个变量来控制对话框的显示与隐藏。例如: ```vue <template> <div> <el-button @click="openDialog">打开对话框</el-button> <el-dialog :visible.sync="dialogVisible" @close="closeDialog"> <router-view></router-view> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false } }, methods: { openDialog() { this.dialogVisible = true this.$router.push({ name: 'DialogComponent' }) // 或者使用其他方式导航到对话框组件 }, closeDialog() { this.dialogVisible = false this.$router.push({ name: 'HomeComponent' }) // 或者使用其他方式导航回主页组件 } } } </script> ``` 在这个例子中,我们使用了 `el-button` 组件来触发 `openDialog` 方法,将 `dialogVisible` 设置为 `true`,从而打开对话框。对话框的内容使用了 `router-view` 组件来展示。 通过设置 `:visible.sync` 来实现对话框的显示与隐藏,并通过 `@close` 事件来监听对话框的关闭操作。在 `openDialog` 方法中,我们通过 `$router.push()` 方法导航到对话框组件,`name` 属性对应路由配置中的组件名称。 2. 在你的路由配置文件中,将需要展示在对话框中的路由组件配置为相应的路由。例如: ```javascript import { createRouter, createWebHistory } from 'vue-router' import HomeComponent from '@/components/HomeComponent.vue' import DialogComponent from '@/components/DialogComponent.vue' const routes = [ { path: '/', name: 'HomeComponent', component: HomeComponent }, { path: '/dialog', name: 'DialogComponent', component: DialogComponent } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 在这个例子中,我们将 `HomeComponent` 和 `DialogComponent` 配置为不同路径的组件,并给它们分配了对应的名称。 现在,当你点击 "打开对话框" 按钮时,对话框将会打开,并加载 `DialogComponent` 组件。 希望这个解答对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值