设计模式
本专栏是设计模式的最大克星
静谧之心
专业摩的佬
业余吉他手
退役喷子
展开
-
D2: 基于go实现的一个DSL 绘图工具 高手效率神器
D2 是一种声明式流程图的领域特定语言 (DSL),声明式只需要描述你想要的流程图即可,它就会自动生成对应的图像。原创 2023-08-19 15:08:48 · 501 阅读 · 0 评论 -
每期一个小窍门: 获取全部带有自定义方法注解的类和方法
比如我自定义了MqListener注解。我就需要获取全部被注解方法。启动时自动加载所有消费者。原创 2023-08-08 17:42:07 · 229 阅读 · 0 评论 -
mongodb 单事务内使用多线程加速的简单例子
下面是java 操作 mongo 实现单事务内使用多线程的例子。事务内 如果有重复性比较强且线程安全的重复性循环操作.可以考虑使用并行来替代循环。原创 2022-09-15 10:51:17 · 817 阅读 · 0 评论 -
越过时针回拨的坑, 解决重启导致的雪花算法id重复问题, 文末附送踩坑总结大礼包
在上一篇文章中通过PowerMockito来模拟时钟回拨, 验证改进版雪花算法是否起效我们了解了什么是时针回拨, 怎样去解决它, 但是像雪花算法这种高性能的id生成器, 比较娇贵, 比如在我将这个算法投入到生产之前, 发现这个算法在重启之后再压测的时候, 会出现大量重复的id, 当时就猜测可能算法本身有一个记载状态的属性, 去读源码, 果然找到了, 这个属性叫epoch.Id重复发生原因:epoch对应该算法第一次初始化传入的时间, 也就是算法的生日~~因为这个epoch在每次启动的时候默认传入原创 2021-07-14 17:35:11 · 4710 阅读 · 1 评论 -
深入分析RocketMQ 长轮询推送机制
RocketMQ消费端有两种获取消息的方式,Push方式和Pull方式。但这两种方式都有一定的缺陷,后来采用了一种折中的方法,采用”长轮询“的方式,它既可以拥有Pull的优点,又能达到保证实时性的目的。长轮询的思想:服务端接收到新消息请求后,如果队列里没有新消息,并不急于返回,通过一个循环不断查看状态,每次waitForRunning一段时间(默认是5秒),然后再Check。Broker默认最长阻塞时间为15秒,默认情况下当Broker一直没有新消息,第三次Check的时候,等待时间超过最长阻塞时间,就原创 2020-08-13 10:56:10 · 2952 阅读 · 2 评论 -
什么是函数的side effects, 如何通俗的理解它?
Side effect就是“副作用”(侧面影响),通常是对于一个函数而言的,说一个函数“有副作用”或者“没有副作用”。如果一个函数修改了自己范围之外的资源,那就叫做有副作用,反之,就是没有副作用。总结一下, 有副作用(side effects)的函数会做(不限于)这些事情:修改全局变量修改输入参数所引用的对象做输入输出操作调用其他有副作用的函数...原创 2021-05-07 09:28:31 · 24489 阅读 · 1 评论 -
通过PowerMockito来模拟时钟回拨, 验证改进版雪花算法是否起效
改进版雪花算法详见上篇传送门简单说明: 通过PowerMockito来mock雪花算法中获取时间的算法, 从而实现伪造时间覆盖.测试类import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.powermock.api.mockito.PowerMockito;import org.powermock.core.classlo原创 2021-04-21 17:56:15 · 2689 阅读 · 3 评论 -
什么是指针回拨? 优化snowflake指针回拨的缺陷(不引入任何第三方中间件(redis, zk))
首先简单了解下, 什么是指针回拨?很多普遍的唯一ID算法, 例如雪花算法, 他们算法是根据本机的机器码, 还有本机时间得出的, 他们对本机的时间是强依赖的.服务器的硬件时钟的时间存在误差, 需要例如ntp服务来进行的自我校准,在回拨的期间, 这段时间是已经被ID生成算法使用过的, 也就变成了二手时间, 这个二手时间, 可能导致了我们再次计算ID时, 我们的参数因子都是相同的, 最终导致了生成完全重复的ID.那么怎么避免呢?等待这个二手时间过去(因为回拨时间大概率不会太长)侦测二手时间段,原创 2021-04-19 15:55:26 · 5211 阅读 · 3 评论 -
Nacos更改用户名密码 (附BCrypt在线加密链接!)
修改配置文件, 在配置文件加入如下:vi nacos/conf/application.propertiesspring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://`数据库地址`:3306/`你自定义的数据库名字`(将要执行sql恢复语句的)?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb原创 2020-11-02 15:53:55 · 7338 阅读 · 1 评论 -
手把手教你 Mac/linux 安装 ELK 三剑客
ELK全称(elasticsearch, logstash, kibana)先下载以下三个依赖 (本文选择5.6.4版本):网速慢的话可以看我上传的连接https://download.csdn.net/download/qq_33709508/13061142kibana 下载: https://www.elastic.co/downloads/past-releases/kibana-5-6-4elasticsearch 下载:https://www.elastic.co/downloads/原创 2020-10-29 17:35:23 · 504 阅读 · 2 评论 -
OKHTTP 回收资源的坑
最近使用OKHTTP发现不能重复读取返回体数据看了大佬的博客 https://blog.csdn.net/my_truelove/article/details/80133556总结一下:当我们第一次调用 response.body().string() 时,OkHttp 将响应体的缓冲资源返回的同时,调用 closeQuietly() 方法默默释放了资源。在实际开发中,响应主体 RessponseBody 持有的资源可能会很大,所以 OkHttp并不会将其直接保存到内存中,只是持有数据流连接。原创 2020-10-15 10:15:58 · 3361 阅读 · 0 评论 -
API和SDK的区别你弄懂了没
API 和SDK 到底是什么API 和SDK是软件行业的两个缩写词。API (Application Programming Interface)=应用程序编程接口通过一套套的要求,用来管理应用程序之间的沟通。一个API相当于你跟它说要求,它会为你完成任务。而且你不需要知道它是如何做到的,你只需要问你想要的东西。SDK (Software Development Kit)=软件开发工具包可用于开发面向特定平台的软件应用程序的工具包。举个例子,如果你想组装一个模型车或飞机。在构建这个模型时,原创 2020-08-24 15:33:04 · 4537 阅读 · 0 评论 -
Springboot 实现 根据条件切换注入不同实现类
最近有个一需求需要根据外界环境的属性(操作系统 || yml属性 || 其他bean的状态) 来实现启动时注入两套不同的实现类, 实现切换.实现启动时条件注入分2步:第一步 使用@Conditional(参数为 True false条件实现类 需要你自己实现)注解@Conditional(RabbitMqCondition.class)public class RabbitmqSMSMsgServiceImpl extends RabbitmqBasicMsgService {// @Au原创 2020-08-20 17:50:56 · 6465 阅读 · 0 评论 -
Springboot @Async 配合 @PostConstruct 实现启动时自动执行异步任务
最近有个需求是需要在springboot启动时启动个异步任务, 上网找了好久, 发现@Async 标注异步方法, 还有@@PostConstruct 可以让该方法启动时运行, 随即有了此篇.@PostConstruct注解@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器原创 2020-08-19 17:46:46 · 7274 阅读 · 2 评论 -
RocketMQ之NameServer源码浅析
NameServer简介NameServer是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息 。 同时,各个角色的机器都要定期向 NameServer上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除 。看下阿里中间件团队对NameServer特点总结:Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。Name Server 源码总共1000+ 行 说明了是一个非常轻量级的协调中原创 2020-08-14 10:44:47 · 2472 阅读 · 1 评论 -
RocketMQ 消费者核心配置详解
RocketMQ 消费者核心配置consumeFromWhere 配置(某些情况失效:参考https://blog.csdn.net/a417930422/article/details/83585397)这个配置基本不用改,采用默认配置即可。CONSUME_FROM_FIRST_OFFSET: 初次从消息队列头部开始消费,即历史消息(还储存在 broker 的)全部消费一遍,后续再启动接着上次消费的进度开始消费。CONSUME_FROM_LAST_OFFSET: 默认策略,初次从该队列最尾开始消费原创 2020-08-12 14:57:55 · 2890 阅读 · 0 评论 -
SpringCloudAlibaba全家桶之 深度剖析RocketMQ 中 Topic/Queue
Topic首先需要提到的概念是Topic。Topic是RocketMQ中的一个重要概念,RocketMQ的各组件都是围绕着Topic建立起对应关系的。在RocketMQ官方文档和本文中, Topic在不同的语境下被赋予了两种不同的语义:消息的Topic属性值在描述Consumer的订阅设置信息或消息的属性时。Topic属性为某个值的消息(单个消息或消息集合)在描述Broker,Producer和Consumer的对应关系,Queue以及负载均衡策略时。为了实现消息队列的水平扩展和原创 2020-08-11 16:28:32 · 3907 阅读 · 3 评论 -
梳理时间线 Spring data JPA 到底是个啥 能为我们做什么?
首先, 什么是spring data jpa?spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。如图:接口规范:从时间线来理解spring data jpa 和 Hibernat原创 2020-07-06 15:04:50 · 1380 阅读 · 0 评论 -
阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
分层领域模型规约:DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO( View Object):显示层原创 2020-05-24 16:14:57 · 414 阅读 · 1 评论 -
Zookeeper(Curator)实现集群配置文件统一管理
统一监听管理的优势?因为懒, 减轻运维人员的负担, 防止由于疏忽导致集群配置文件出错.解决思路把公共配置抽取出来对公共配置进行维护修改公共配置后应用不需要重新部署采用方案公共配置抽取存放于zookeeper中并落地数据库对公共配置修改后发布到zookeeper中并落地数据库对应用开启配置实时监听,zookeeper配置文件一旦被修改,应用可实时监听到并获取...原创 2020-04-19 13:00:57 · 845 阅读 · 0 评论 -
Java项目中使用log记录日志的一些总结
本文介绍了一下自己在Java项目中使用log的一些总结,从日志的作用、日志的选用、日志级别介绍、日志记录的一些最佳实践几个方面阐述。日志的作用主要作用包括:出问题后定位当时问题显示程序当前运行状态日志的选用Java里存在众多的开源日志框架: slf4j, logback, log4j, JCL(Apache Common Logging), JUL(JDK自带的java.u...原创 2020-04-14 04:35:59 · 629 阅读 · 0 评论 -
ThreadLocal内存泄漏问题
一、概述ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型。 总结:ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性。Thread...原创 2020-04-09 08:29:37 · 465 阅读 · 0 评论 -
自己实现ThreadLocal源码!
package com.bestksl.example.threadlocal;import java.util.HashMap;import java.util.concurrent.atomic.AtomicInteger;public class MyThreadLocal<T> { static HashMap<Thread, HashMap<In...原创 2020-04-08 16:38:53 · 417 阅读 · 0 评论 -
为什么序列化会破坏单例?
转自 HollisChuang’s Blog: http://www.hollischuang.com/archives/1144本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。但是,单例模式真的能够实现实例的唯一性吗?答案是否定的,很多人都知道使用反射可以破坏单例模式,除了反射以外,使用序列化与反序列化也同样会破坏单例。序列化对单...原创 2020-04-07 07:36:27 · 1108 阅读 · 1 评论 -
枚举来实现单例为什么大牛都这么推荐?
哪种写单例的方式最好?在StakcOverflow中,What is an efficient way to implement a singleton pattern in Java?有一个关于的讨论:如上图,得票率最高的回答是:使用枚举。回答者引用了Joshua Bloch大神在《Effective Java》中明确表达过的观点:使用枚举实现单例的方法虽然还没有广泛采用,但是单元素的...原创 2020-04-07 07:20:55 · 1205 阅读 · 2 评论 -
从DCL(双重检测锁)详解volatile禁止指令重排序
DCL(双重检查锁定)里发现的东西下面是使用 volatile 来优化双重检查锁定的代码:public class SafeDoubleCheckedLocking { private volatile static Instance instance; public static Instance getInstance() { if (instance == null) { ...原创 2020-04-07 06:34:45 · 782 阅读 · 0 评论 -
Java内存模型(JMM) happens-before原则详解
在JMM(JAVA内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happensbefore关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。happens-b...原创 2020-04-06 13:15:07 · 955 阅读 · 0 评论 -
深入理解JWT的使用场景和优劣
编码,签名,加密这些基础知识简单地介绍下,千万别搞混了三个概念。在 jwt 中恰好同时涉及了这三个概念,笔者用大白话来做下通俗的讲解(非严谨定义,供个人理解)编码(encode)和解码(decode)一般是编码解码是为了方便以字节的方式表示数据,便于存储和网络传输。整个 jwt 串会被置于 http 的 Header 或者 url 中,为了不出现乱码解析错误等意外,编码是有必要的。在 jwt...原创 2020-02-29 09:31:42 · 800 阅读 · 2 评论 -
OAuth认证实现机制及单点登录原理
OAuth认证OAuth认证是为了做到第三方应用在未获取到用户敏感信息(如:账号密码、用户PIN等)的情况下,能让用户授权予他来访问开放平台(主要访问平台中的资源服务器Resource Server)中的资源接口。其流程主要是:用户首先要保持登录,即已认证通过的状态第三方应用请求用户授权(我理解是弹出一个显示的操作界面让用户确认给第三方授权)用户授权成功之后会向Authori...原创 2020-02-27 17:03:33 · 6645 阅读 · 1 评论 -
理解 OAuth 2.0
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。一、应用场景为了理解OAuth的适用场合,让我举一个假设的例子。有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自...转载 2020-02-22 12:01:01 · 543 阅读 · 0 评论 -
设计模式23篇之 动态代理详解
动态代理动态代理:运行时动态的创建代理类(对象),并将方法调用转发到指定类(对象)动态代理调用的机制图Proxy 和 InvocationHandler 组合充当代理的角色.RealSubject是一个实际对象,它实现接口Subject在使用时,我们不希望直接访问 RealSubject 的对象,比如:我们对这个对象的访问是有控制的我们使用动态代理,在程序中通过动态代理创建 Rea...原创 2019-12-21 11:37:59 · 398 阅读 · 1 评论 -
设计模式23篇之 透过RMI(远程方法调用)入门代理模式
代理模式的基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象(动态代理)代理模式有不同的形式(比如 远程代理,静态代理,动态代理),都是为了控制与管理对象访问举个例子: 远程对象的本地代表远程代理:远程对象的本地代表,通过它可以把远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息。涉及...原创 2019-12-21 09:45:31 · 1615 阅读 · 0 评论 -
设计模式23篇之 观察者模式详解
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为 Subject,依赖的对象为 Observer,Subject 通知 Observer 变化,比如这里的奶站是 Subject,是 1 的一方。用户时 Observer, 是 n 的一方。观察者模式类似订牛奶业务奶站/气象局:Subject用户/第三方网站:ObserverSubject:登记注册、移除和通知regis...原创 2019-12-20 10:02:35 · 278 阅读 · 0 评论 -
设计模式23篇之 装饰者模式详解
从一个需求入手咖啡馆订单系统项目(咖啡馆):咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因 咖啡)调料:Milk、Soy(豆浆)、Chocolate要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。方案 1...原创 2019-12-20 08:18:39 · 337 阅读 · 0 评论 -
设计模式23篇之 单例模式
什么是单例模式?单例模式是指:保证在整个的软件系统中,某个类只能存在一个对象实例。单例模式的应用场景比 如 Hibernate 的 SessionFactory,它 充 当 数 据 存 储 源 的 代 理 ,并 负 责 创 建 Session 对象. SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。...原创 2019-12-20 06:26:08 · 633 阅读 · 0 评论 -
设计模式23篇之 抽象工厂模式
前两篇博客简单工厂和工厂方法的Pizza例子中, 他们都有各自的缺点, 例如还是不够解耦引入抽象工厂模式:抽象工厂模式:定义了一个 trait 用于创建相关或有依赖关系的对象簇,而无需指明具体的类抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实...原创 2019-12-14 07:37:07 · 1445 阅读 · 1 评论 -
设计模式23篇之 关于3个工厂模式的设计思想提炼
工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。三种工厂模式:简单工厂, 工厂方法, 抽象工厂 (我的博客设计模式专栏中都有详解)设计模式的依赖抽象原则创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回。 也有的书上说,变量不要直接持有具体类的引用。不...原创 2019-12-14 06:57:31 · 1466 阅读 · 1 评论 -
设计模式23篇之 工厂方法模式
看一个新的需求pizza项目新的需求:客户在点pizza时,不仅能点奶酪pizza, 胡椒pizza, 同时还可以点不同地域的pizza,比如: 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。解决方案 1使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等...原创 2019-12-14 06:10:51 · 565 阅读 · 0 评论 -
设计模式23篇之 简单工厂模式
基本介绍简单工厂模式是属于创建型模式,但不属于 23 种 GOF 设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.需求看一个披萨的项目:要便于披萨种类的扩展,要...原创 2019-12-14 04:54:17 · 3403 阅读 · 1 评论 -
设计模式23篇之入门篇 设计模式基本介绍
学习设计模式的必要性面试会被问,所以必须学读源码时看到别人在用,尤其是一些框架大量使用到设计模式,不学看不懂源码为什么这样写, 比如 Runtime 的单例模式.设计模式能让专业人之间交流方便提高代码的易维护设计模式是编程经验的总结,我的理解: 即通用的编程应用场景的模式化,套路化(站在软件设计层面思考)。设计模式基本介绍设计模式是程序员在面对同类软件工程设计问题所总结出来的有...原创 2019-12-13 06:42:21 · 458 阅读 · 0 评论