一、认识MyBatis 是什么? ### What is MyBatis? > MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and ma1/3/2025
Nginx 应用实战 1. Nginx 反向代理功能配置 2. Nginx 负载均衡实战 3. Nginx 动静分离配置 4. Nginx 配置文件分析 5. Nginx 多进程模型原理 6. Nginx 高可用集群实战 !1547744559962 我们把请求发送到 proxy (代理服务器),转发到后端的服务器上,返回到代理,返回到浏览器,去做一个解析。 作用: - 代理的是服务端(我们客户端不1/3/2025
Nginx 的初步认识 Nginx 的初步认识及配置 1. Nginx 在分布式架构中的应用分析 2. 常用的 Web 服务器及差异 3. Nginx 的安装以及配置分析 4. Nginx 虚拟主机配置 5. 详解 Location 的匹配规则 早期用 F5 做负载均衡!1547700857138 后来通过 负载均衡和热备来提高整个的 QPS。 !1547701171537 1/3/2025
Nginx 的扩展-OpenRestry的扩展-OpenRestry 1. Nginx 进程模型简介 2. Nginx 的高可用方案 3. OpenResty 安装及使用 4. 什么是 API 网关? 5. OpenResty 实现灰度发布功能 进程模型简介 - Tomcat - BIO - NIO - AIO - Nginx - 多进程+多路复用 - master 进程 、 work1/3/2025
分布式通讯框架RMI的原理 [TOC] 1. 什么是RPC 2. RPC框架原理 3. 了解Java RMI 4. 基于RMI时间 5. RMI通讯原理分析 6. 实现自己的RPC框架 Remote procedure call 远程过程调用 !5154516486545 集中式到分布式 - RMI(JRMP) /soap(webservice/a1/3/2025
RPM包安装RabbitMQ RabbitMQ的安装非常简单,由于RabbitMQ依赖于Erlang,所以需要先安装Erlang,解决依赖关系后,就可以安装RabbitMQ了。注意,在安装Erlang前,需要先安装socat `bash yum -y install socat ` http://www.rabbitmq.com/install-rpm.html#downloads !15488731/3/2025
RabbitMQ 1-工作模型与Java编程 1-工作模型与Java编程 Windows安装步骤 Linux安装步骤 官网文章中文翻译系列 操作系统:CentOS 7 JDK:1.8 Erlang:19.0.4或最新版 RabbitMQ:3.6.12或最新版版本对应关系 1. 跨系统的异步通信 人民银行二代支付系统,使用重量级消息队列 IBM MQ,异步,解耦,削峰都有体现。 2. 应用内的同步变成异步 秒1/3/2025
Windows安装RabbitMqhttps://blog.csdn.net/qq_31634461/article/details/79377256 Eralang 和 RabbitMq 的版本对应关系:http://www.rabbitmq.com/which-erlang.html !1548870899607 首先,您需要安装支持的 Windows 版Erlang。下载并运行Erlang for W1/3/2025
可靠性投递和实践经验2-**可靠性投递与生产实践 首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响。 如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。 !1548902755965 ① 代表消息从生产者发送到Exchange; ② 代表消息从Exchange路由到Queue; ③ 代表消息在Queue中存储; ④1/3/2025
高可用集群搭建步骤 Centos-7 192.168.8.150(磁盘节点) 192.168.8.45 (内存节点) 192.168.8.40 (内存节点) 下载地址: http://www.rabbitmq.com/releases/erlang/ mkdir -p /usr/local/tools/rabbitmq cd /usr/local/tools/rabbitmq wget http:1/3/2025
Spring5新特性及应用举例 文档很少、资料难找 没有实战实践,包括老师自己没有用过 目的:1、带大家来看看眼界 2、了解一下未来的一个发展趋势 鸡肋 * ##### 依赖JDK 8+和Java EE7+以上版本 支持使用注解进行编程 * ##### 新增函数式编程 * ##### 支持使用REST断点执行反应式编程 * ##### 支持HTTP 2.0 * #1/3/2025
SpringMVC核心原理及源码分析MVC 一种 Web 开发的设计模式 实现了不同业务层面的解耦,隔离。 http://www.dairan.com?id=?&type= 将传输数据封装成一个完成的载体。把很多参数传成一个Model。就是一种设计模式,你也可以不封装。 视图,用来展示或者输出的模块(HTML、JSP、JSON、String、Swing、XML.....) 控制交互的一个中间组件,由它1/3/2025
Spring声明式事务操作实现原理 `xml ` transactionManager 就是我们的一个切面 dataSource 其实就是我们 Connection 的一个包装,就是所有的 Connection 相关的东西。 javax.sql.DataSource 其实定义了,提供给我们的 JDBC 框架去扩展的包装类。 `java public interface DataSource extends1/3/2025
Spring核心IOC容器及依赖注入原理20180415-Spring核心IOC容器及依赖注入原理 !20180414_Spring系统概述及IOC实现原理 ClassPathXmlApplicationContext `java //存储注册信息的BeanDefinition // 传说已久的 IOC 容器 private final Map beanDefinitionMap = new Concurr1/3/2025
穷举法: 把生活所见所闻全部归纳到我们所学的知识体系中,加以思考变成自己的东西。(举例子) 把自己熟悉的方法(利用自己已有的知识体系),去对比学习新的知识。 怎么学? 环境准备好了没有? 项目里边有红叉:x: 学习源码,不一定要让项目跑起来,报一两个红叉其实不要紧。 调试的时候,完全可以在运行环境中,导入 jar 包就能调试(有针对性地打断点) 如何从 0 -1 去学习 1/3/2025
Spring系统概述及IOC实现原理##### 看不懂看正常 是围绕 Bean 来展开, BOP 的开发思想。 的四个策略: 基于 POJO 的轻量和最小侵入性编程 通过依赖注入和面向接口松耦合 基于切面和惯性进行声明式编程 通过切面和模板减少研班是代码。 - 面向 Bean - 依赖注入 - 面向切面 - AOP - OOP - BOP - IOC - DI 中什么时候用单例,什么时候用原型模式 1/3/2025
Spring面试解答 1. 动脑子,面试是一种交流 2. 面试的时候,要用心去感受当时面试场景 3. 了解自己,自己的长处、自己的短处 (巧妙地扬长避短) 公司的业务场景 你是去面试什么岗位的? Java高级工程师 实际工作经验是1年(如实填写) IOC的工作原理 答:定位 加载 注册 BeanFactory BeanDefintion ... 1+ Applicat1/3/2025
手写ORM框架顶层设计 ( 对象关系 Object Relation Mapping ) 用 Java 对象来描述对象与对象之间的关系和数据内容 Mybatis JPA SpringJDBC** 对比 - **Hibernate 全自动档 不需要写一句SQL语句、烧油(牺牲性能)** - **MyBatis 手自一体(半自动) 支持单表映射,多表关联需要配置,轻量级一些** - **SpringJDBC 手1/3/2025
手写SpringAOP核心原理 - Spring IOC - Spring DI - Spring MVC Spring AOP 的功能,基于 Spring IOC 和 DI 去完成 未完成: Spring AOP、Spring Transaction、Spring JDBC、自己手写 ORM 框架。 Spring IOC 入口,DispatcherServlet,通过 DispatcherServle1/3/2025
手写SpringIOC核心代码下: 22 先完成对象的初始化,再完成依赖注入。 初始化以前,以后,要干什么事情,监听不监听不关我事,我只是通知。我事件放在这里,苏表移动,你动不动不管我的事情。1/3/2025
手写SpringMVC2 `java // resp.getWriter().write("500 Exception, Details \r\n" + Arrays.toString(e.getStackTrace()).replaceAll("\\[|\\]","").replaceAll("\\s","\r\n")); ` 1/3/2025
手写定制自己的ORM框架 想到了用对象来传,但是有问题 - a)、跨表联查的条件 - b)、无法携带判断逻辑的运算符 - c)、or 或者 and 无法区分 ,用rs.getObject()方法 `java // 各自的厂商实现自己的链接 // MySQL为例,以下类型Java语言中是不存在的 // bigint ,由开发厂商自动就映射好了 // varchar // int { Sy1/3/2025
数据库事务操作原理及SpringAOP配置 Socket 连接 !1540216798988 的链接 !1540216827277 如果是 SELECT 拿到直接返回就好了 把找出来地记录放到内存中 异常,检查有没有这条数据,再检查 SQL 语句是不是有语法错误,等等,然后在内存中修改这条数据。修改完以后,会去检查,比如说外键关联了之类的问题。发现不能改了又会报错。 只有当更新以后完全没有问题了,才会把这条1/3/2025
深入分析IOC那些鲜为人知的细节 `java //初始化所有剩余的单例Bean // 当工厂初始化完成的时候, finishBeanFactoryInitialization(beanFactory); ` 它在判断它是不是延时加载,不是延时加载才给它注入 加载。 `java //对配置lazy-init属性单态Bean的预实例化 @Override public void preInstantiateSing1/3/2025
Spring5源码分析-预习资料 概述 Spring 是一个开源的轻量级 Java SE (Java 标准版本)/ Java EE (Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完成的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且低耦合,高内聚。业务逻辑开发是不1/3/2025
KafkaManage`c [root@Darian1 software]# yum install unzip Is this ok [y/d/N]: y 完毕! [root@Darian1 software]# [root@Darian1 software]# cd kafka-manager-master/conf/ [root@Darian1 conf]# vim application.c1/3/2025
分布式消息通信Kafka(一) - Kafka 产生的背景 - Kafka 的架构 - Kafka 的安装部署和集群部署 - Kafka 的基本操作 - Kafka 的应用 的简介 - 高性能 - 高吞吐量 Kafka Kafka 是一款分布式消息发布和订阅系统,具有高性能、高吞吐量的特点而被广泛应用与大数据传输场景。它是由 LinkedIn公 司开发,使用 Scala 语言编写,之后成为 Apache 基1/3/2025
分布式消息通信Kafka(三) 1. 消息的存储原理 2. Partition 的副本机制原理 3. 副本数据的同步原理 消息的发送策略,根据 key 的算法路由到 Kafka 的一个分区上,分区是一个物理上的一个结构。Linux 定时会清理 /tmp 目录下的文件。生产环境的时候,都是另外放到另一个磁盘上。server 里边可以配置日志文件的路径。具体的分区回落到我们磁盘的某一个路径下,分区可以指定我们这个 T1/3/2025
分布式消息通信Kafka(二) 1. Topic & Partition 2. 消息分发策略 3. 消息消费原理 4. 消息的存储策略 5. Partition 副本机制 Topic 和 Partition 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合。每条消息发送到 kafka 集群的消息都有一个类别。物理上来说,不同的 Topic 的消息是分开存储的。 1/3/2025
分布式系统的基石-序列化和反序列化1. 了解序列化的意义 2. 如何实现一个序列化操作 3. 序列化的高阶认识 4. 常见的序列化技术及应用 5. Protobuf实现原理分析 6. 序列化框架的选型 我们非常的考虑系统性能的时候,就要考虑到序列化。 序列化在我们系统架构里边处于非常底层的位置。我们平时不会去关心,我们使用的是什么序列化。后者说我们用的一些RPC框架它是怎么去做的。 远程通信需1/3/2025
分布式系统的基石HTTP协议与HTTPS协议- 了解客户端和服务端的请求原理 - HTTP协议及其组成 - HTTPS交互原理分析 访问支付宝,微信的开放接口 都是基于HTTP 对外提供的开放服务 API都是基于HTTP协议的, 微服务中的服之间的调用大部分都是基于HTTP协议的。 Web层提供http协议的对外接口 !img http协议是基于TCP可靠通讯协议之上的 fiddler:这是1/3/2025
分布式系统的基石TCP-IP通讯协议1. 通讯协议在分布式架构中的核心应用 2. 深入料及TCP/IP和UDP/IP通信协议 3. TCP流量整形 4. 基于Java自身技术实现系统通讯 5. 多任务处理及优化 6. 了解什么是NIO 7. 组播协议 Multicast !img 相当于是在整个架构层面上去做一个分层,分层以后会存在按照某一个领域去切分的服务层,存在web层,然后, 1/3/2025
zookeeper实践之配合注册中心完成RPC手写1. 使用zookeeper原生API实现分布式锁 2. 分析Curator实现分布式锁的原理 3. 实现带注册中心的RPC框架 我们在选择一个方案去实现分布式锁的时候,我们得知道我们要解决的是一个什么问题,或者说我们使用zookeeper实现对应的分布式锁是要解决什么问题。 在以前的以及现在的单进程的多线程模型中,我们会利用多线程的基础数据去提高我们程序的运行效率,1/3/2025
zookeeper的实践与原理1. 数据存储 2. 基于java API初探zookeeper的使用 3. 深入分析Watcher机制的实现原理 4. Curator客户端的使用,简单高效 基于znode,基于文件系统风格的,树形结构的文件模型,和内存数据库差不多,基于增删改查的命令去操作数据库,整个数据库包括整个树形结构的内容,比如说我们的节点目录,节点路径和权限信息,1/3/2025
了解zookeeper的核心原理 1. 了解zookeeper及zookeeper的设计猜想 2. Zookeeper集群角色 3. 深入分析ZAB协议 4. 从源码层面分析leader选举的实现过程 5. 关于zookeeper的数据存储 1. zookeeper集群安装(myid/zoo.cfg) 2. zookeeper的数据模型(znode) 3. 1/3/2025
初步认识zookeeper1. 从架构的发展过程说起 2. 什么是zookeeper 3. Zookeeper安装部署 4. Zoo.cfg配置文件分析 下边有 zookeeper.out 日志记录 架构不是一蹴而就的,是随着我们业务量的不断增加,不断去演变的。 架构的演变 单体架构 tomcat war !1547694908556 很快的1/3/2025
并发的框架!1547530613382 - CountDownLatch 、 Semaphore - countdown / await - 原子操作 Atomic - 线程池原理分析 JUC 中提供了几个比较常用的并发工具类,比如 CountDownLatch 、CyclicBarrier 、 Semaphore 。 其实在以前我们课堂的演示代码中,或多或少都有用到过这样一些 1/3/2025
并发编程的原理 1. JMM 内存模型 2. JMM 如何解决原子性、可见性、有序性的问题 3. synchronized 和 volatile 线程的转换,线程的停止。基于 CPU 的内存模型,硬件架构,高速缓存,和它的一些线程的并行执行所带来的问题,在 CPU 层面上提供了解决方案,比如说 总线锁、缓存锁的方式解决这些问题。 在 JAVA 层面,统一了规范,JMM 定义了共享内存系统中1/3/2025
04 - 并发编程的原理- 并发编程的原理 - Lock 的使用 - AQS 原理分析 - Condition - CountDownLatch 、 Semaphore - 线程池分析 J.U.C = java.util.concurrent 的使用 - `volatile ` 去解决可见性,防止指令重排序 - synchronized 是去保证 可见性,有序性,原子性的一种手段 这是 JVM 层1/3/2025
并发编程的原理(二)《并发编程的艺术》 - 上节课内容回顾 - synchronized 原理分析 - wait 和 notify - Lock 同步锁 - 原子性 - 可见性 - 有序性 JMM 是 JAVA 里边定义的内存模型。定义了多线程和我们内存交互的规范。屏蔽了硬件和操作系统访问内存的差异。它类似于 JVM 的一个作用。提供了统一的一个差异。多核心 CPU 里边的高速缓存和多线程并1/3/2025
并发编程的基础 **1. 多线程的发展历史** **2. 线程的应用** **3. 并发编程的基础** **4. 线程安全的问题** 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理。 > 然后我们需要把批处理进行隔离,把批处理操作进行保存它的进度。 进程 —> 线程 单核CPU 只有可能会有一个进程去执行。 线程出现的目的是什么?解决进程中多任务的实时性的问题?1/3/2025
分布式架构的演进过程 1. 了解分布式架构中的相关概念 2. 初始分布式架构的意义 3. 分布式架构的发展过程和历史 4. 分布式架构的演进过程 5. 构建分布式架构最重要的因素 集中式到分布式的发展历史 1946年ENIAC第一台计算机美国, 单台的计算机的性能不断的提升 M级别的内存到现在G级别的内存 图灵,冯诺依曼 图灵:贡献了图灵机的理论模型 冯诺依曼:提出了计算机1/3/2025
分布式架构设计1. 主流架构模型-SOA架构和微服务架构 2. 领域驱动设计及业务驱动划分。 3. 分布式架构的基本理论CAP、BASE以及应用 4. 什么是分布式架构下的高可用设计 5. 分布式架构下的可伸缩设计 6. 构建高性能的分布式架构 [Service Oriented Architecture](https://baike.baidu.com1/3/2025
设计模式: 怎么做人?对中国来说: > * 出生 、二十加冕、三十而立、四十不惑、五十知天命、六十花甲... 总结前人的经验,提供给后人去借鉴使用 前人栽树,后人乘凉 解决一些具有代表性的一些问题。 设计模式,通常来源于生活,反过来帮助我们更好地生活。 设计模式目标: - 提升代码的可读性、可扩展性、维护成本、复杂的业务问题 千万不要 死记硬背 。 每个设计模式都会结合一个生活1/3/2025
单例模式 全局只有唯一一个实例, - 一个类模板,在整个系统运行中,只允许产生一个实例(有且只有一个实例) 分布式系统中用 分布式锁 来保证单例模式。 * 工厂本身 * 配置文件 * 日历 解决一个并发访问时的时候的线程安全问题。 * 饿汉式 * 懒汉式 * 注册登记式 * 枚举式 * 序列化与反序列化时会出现多例 - **在实例使用之前,不管你用不用,我都先 new 出来再说,避免1/3/2025
总结设计模式之间的差别和应用场景 --- - 不要生搬硬套,根据业务场景选择 - 不要把简单的事情搞复杂,设计模式是用来解决复杂问题的 - 把复杂的问题变得简单起来,(总结利用好前人的经验) --- `mermaid graph LR 原始社会[原始社会]--> 农耕社会[农耕社会] 农耕社会 --> 小作坊[小作坊] 小作坊--> 工厂[工厂] 工厂--> 流水线生产[流水线生产] ` 中 ----BeanFa1/3/2025
委派模式及适配器模式 --- - 不是为了写出完美的代码,可以优雅 - 思想精华不是今晚就能懂的,可以在课后继续思考练习 - 学而不思则罔,关键是思想 --- Spring 到处都在用 委派模式 > 代理模式,策略模式就是委派模式的一种特例 有点像代理模式,又有点像策略模式, 项目经理看上去是 BOSS 和员工之间的一个中介? ==代理模式==: - 被代理人,代理人 ==1/3/2025
代理模式 * AOP 实现 * 拦截器 * 中介 * 黄牛 * 媒婆 * 解耦 * 专人做专事 * 自己不想做,又不得不做的事 * 增强 * #### 静态代理 * #### 动态代理 * 代理角色 * 被代理的角色(目标对象) 由被代理的角色来做最终的决定 > 代理角色通常来说会持有被代理角色对象引用(以便于代理角色完成工作之前或者之后能够找到被代理的对象,能够通知被代理对1/3/2025
策略模式 - 比较器 - 旅行路线 - 固定算法策略(封装) - 买东西结算支付 根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法),扩展。(算法会变的时候,不建议用策略模式) 客户本身就知道要采用什么样的算法去计算。(有选择的权利) !assets/支付的策略模式.png `java public class Order { pri1/3/2025
装饰器模式及观察者模式 适配器模式使用了==继承==的方法,达到了兼容的目的,或者使用注入的办法也能够达到兼容的目的。适配器模式就是==兼容== - 为了某个实现类在不修改原始类的基础上进行动态的覆盖或者增加方法。 - 该实现保持跟原有类的继承关系 - 采用装饰模式 - 装饰器模式实际上是一种非常特殊的适配器模式 | 装饰器模式 1/3/2025
设计模式容易混淆的几个对比 # 1、代理模式跟委派模式混淆 委派就是说全权代理 代理只参与某一个环节,委派参与整个环节 委派可以说是一个静态代理 Porxy 传一个接口,传实现类不行吗? Java核心思想:面向接口编程 OOP:用代码来解释生活 接口:只是一种规范,做任何事前以前先思考好以后,再去动手(制定好规范),三思而后行 实现类:必须先有接口,开发顺序天生决定了 中介:租房子 代理人(专业化)1/3/2025
Spring5 源码分析源码分析 中常用的设计模式 | 分类 | 设计模式 | | ------ | ------------------------------------------------------------ | | 创建型 | 工厂方法(Factory Method)、抽象工厂模式(Abstr1/3/2025
第二章--SpringWeb应用开发篇 源码版本命名规则及下载安装 首先看看某些常见软件的版本号: - Linux Kernel: 0.0.1 , 1.0.0 , 2.6.32 , 3.0.18 ...,若用 X.Y.Z 表示,则偶数 Y表示稳定版本,奇数 Y 表示开发版本 - Windows: `Windows 98` , `Windows 2000` , `Windows XP` , `Windows 7` , `1/3/2025