责任链模式 责任链模式是定义n个请求处理器,连成一条链,请求可以第一个传递到最后一个,可以被任意一个处理器处理 类图 示例public class Request{ } public class abstract Handler { 设计模式 模板模式 模板方法模式是定义好算法的步骤,其中一些步骤由子类去实现 类图 示例public class abstract Cook { // 做饭的步骤1,希望子类提供 public abstract void step1(); 设计模式 命令模式 命令模式将请求封装成对象,将请求调用者和接受者解耦 类图命令模式要素: Invoker:发起命令请求的人 Command:封装命令 Receiver:真正执行命令的人 为什么客户端不直接调用Receiver,而需要Inovker呢 设计模式 观察者模式 观察者模式定义了多个观察者,监听某个对象的状态,当状态改变,观察者将收到通知 类图观察者模式其实就是“发布-订阅”模式,当subject状态更新,就调用nofityObservers()方法,订阅者将收到update()回调通知 示例 设计模式 策略模式 策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 类图 示例定义策略接口 public interface Strategy { void doSomething(); } 多 设计模式 建造者模式 建造者模式是将对象复杂的构建过程封装起来,客户端通过选择不同的构建者来构想自己想要的对象 类图 示例我们来写一个动物的构建者 public abstract class AbstractAnimal { // 构造头 v 设计模式 原型模式 原型模式就是复制一个已有的对象,而客户端不需要知道具体是如何复制的 类图 示例java中已经有现成的clone接口 @Data public class Thing implements Cloneable { pri 设计模式 抽象工厂 抽象工厂是基于工厂方法模式,支持创建多种n种对象 类图回顾一下工厂方法,定义了一种要创建的目标Thing,而抽象工厂,则是定义了n种要创建的目标,例如Thing1,Thing2,我们可以认为n个工厂方法组合起来就是抽象工厂。 工厂方法和 设计模式 工厂方法 工厂方法模式是定义一个创建对象的接口,由它的子类来创建对象,每一个子类提供一种创建实现 类图 工厂方法比起简单工厂来说: 定义了一个工厂接口SimpleFactory 具体的工厂类实现了SimpleFactory接口 每个工厂类分别负 设计模式 简单工厂 简单工厂将复杂的创建过程集中到一个简单工厂类中 类图 示例普通写法: public interface Thing {} public class ConcreteThingA implements Thing {} public 设计模式 单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问点 类图 线程安全问题有线程安全问题的单例模式: public class Singleton { private static Singleton instance; 设计模式 常见问题与性能优化 如何防止消息丢失生产者: ack设置成1 如果对消息防丢失要求非常高,可以配置ack=all,min.insync.replicas配置成分区备份数 消费者: 使用手动提交,业务处理完成才提交offset 防止消息重复消费生产者: kafka详解 kafka HW与LEO HW,High Watermark,中文高水位。 LEO,Latest End Offset 如下图所示,假设当前有三个broker(3个ISR):broker-0为某个主题分区的leader,生产者已经生产到了offset为5的消 kafka详解 kafka Rebalance机制 当消费者启动之后,kafka会为消费者分配分区进行消费。当消费者和分区的关系发生了变化之后,就会重新分配分区给消费者,例如: 某个消费者挂了 来了个新的消费者 主题增加了分区 重新分配分区这个动作就叫做Rebalance。 Rebala kafka详解 kafka Kafka控制器 什么是Kafka控制器在Kafka集群中,控制器主要处理: 分区Leader选举 分区状态管理 副本管理 等等 控制器选举当kafka集群启动时,每个broker都会到zookeeper上创建名为/controller的节点,但只有一个 kafka详解 kafka Java客户端使用 我们通常使用Kafka有两种方式,一种是通过Kafka自带的命令行工具,一种是通过Kafka提供的API。 Kafka提供了五类API: Producer API:生产者api Consumer API:消费者api Admin API: kafka详解 kafka 副本 前篇提过一个主题可以有多个分区,分布在多个broker上,但如果某个broker挂了,这个borker上的数据不就丢了吗? 为了解决这个问题,就有了副本的概念。 副本其实就是备份,我们可以在创建主题时指定副本数量。假设我们有三个broker kafka详解 kafka 主题与分区 kafka主题是以分区(Partition)的形式来存储的,什么意思呢,我们看下kafka的数据目录: 其中有一个目录是mytopic-0,这是我们之前创建的主题,这里的-0就是分区编号,目录中存放了数据文件: 我们使用--partit kafka详解 kafka 生产者与消费者 生产消费模型消息队列的使用者主要有两个角色,一个是生产者,一个是消费者。 顾名思义,生产者是生产数据的,而消费者是使用数据的。 创建主题一个kafka队列,可能有很多的生产者和消费者,为了能让不同的使用者能够区分出自己所需要的数据,因此有 kafka详解 kafka 使用Minio-Operator搭建MinIO集群 使用Minio-Operator搭建MinIO集群 云原生 云原生 k8s