设计模式
文章平均质量分 66
__HelloWorld__
这个作者很懒,什么都没留下…
展开
-
再说装饰器模式
To extend or modify the behaviour of an instance at runtime decorator design pattern is used. Inheritance is used to extend the abilities of a class. Unlike inheritance, you can choose any single objec原创 2017-12-19 20:07:10 · 391 阅读 · 0 评论 -
Threads and Executors
Threads and RunnablesJava自JDK1.0就支持线程,一般来说,在启动线程之前,我们需要指定线程实际执行方法体,通常我们可以通过重写Runnable接口中的run方法来完成。Runnable task = () -> { String threadName = Thread.currentThread().getName(); System....翻译 2018-09-03 14:43:41 · 325 阅读 · 0 评论 -
约定由于配置(Convention over Configuration)
###约定优于配置约定优于配置(convention over configuration)[1],也称作按约定编程[2],是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为"produc...转载 2018-09-25 21:02:59 · 689 阅读 · 0 评论 -
Elastic Job 入门教程(四)— 事件追踪
Elastic-Job提供了事件追踪功能,用于查询、统计和监控作业执行历史和执行状态。Elastic-Job-Lite在配置中提供了JobEventConfiguration,目前支持数据库方式配置。事件追踪所配置的DataSource数据库中会自动创建JOB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG两张表以及若干索引。以下是代码示例:定义数据源@Getter@S...原创 2018-09-26 10:44:34 · 4808 阅读 · 3 评论 -
RabbitMQ VS Apache Kafka (二)—— Kafka简介
接上一章【RabbitMQ VS Apache Kafka (一)】,本章我们讨论Kafka。Kafka Kafka is a distributed, replicated commit log.Kafka本身没有队列的概念,作为一个消息中间件,乍看起来,这略显奇怪,这可能与我们长期以来的形成的一个固化思维有关——但凡消息系统,肯定离不开消息队列。让我们重新回头来看,如何理解distri...翻译 2018-10-11 21:10:16 · 686 阅读 · 0 评论 -
Elastic Job 入门教程(六)— “动态”新增脚本类型作业(Script Job)
在Elastic Job 入门教程(二)— Spring Boot框架下是实现Elastic Job 脚本作业(Script Job)中,我们简单介绍了如何在SpringBoot框架下以注解的方式实现脚本类型作业(Script Job),这里我们要提出一个问题?如何在不修改源码的情况下,仅通过增加配置就可以达到新增一个脚本类型的作业?这是有意义的,因为在实际的业务场景中,我们不可能只有一个...原创 2018-09-27 21:55:58 · 1549 阅读 · 0 评论 -
Elastic Job 入门教程系列
Elastic Job 入门教程(一)— 与Spring Boot集成Elastic Job 入门教程(二)— Spring Boot框架下是实现Elastic Job 脚本作业(Script Job)Elastic Job 入门教程(三)— 作业监听Elastic Job 入门教程(四)— 事件追踪Elastic Job 入门教程(五)— 配置Zookeeper集群注...原创 2018-09-28 13:38:31 · 2915 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (七)—— RabbitMQ消息路由原语与路由保证
RabbitMQ和Kafka都提供给了持续的消息路由保证,两者都提供了最多一次和最少一次的路由保证,此外,Kafka还提供了有限应用场景下的仅一次可靠性路由保证。首先,我们看下这三种路由保证的具体含义:最多一次:一个消息最多被路由不超过一次,消息可能丢失。最少一次:消息永远不会丢失,但同一个消息可能会被路由到一个消费者多次。仅一次:消息路由的理想模式,一个消息只被路由一次。...翻译 2018-10-18 20:47:26 · 486 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (四)—— 应用场景如何选择?
架构对比RabbitMQ是一个通用的消息代理,通过包括点对点、请求/响应及发布订阅在内的多种消息通信模式。其采用的是一种智能代理/傻瓜消费的模式,侧重消息的连续投递与处理,并通过代理本身来维护消息者自身状态。RabbitMQ是一个设计成熟的消息代理中间件,支持包括Java, node.js, .NET, Ruby, PHP等在内的多种客户端,并且提供有多种插件来扩展自身功能。RabbitMQ支...翻译 2018-10-15 20:53:10 · 3418 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (一)—— RabbitMQ简介
在接下来的系列章节中,我们探讨两种消息中间件RabbitMQ与Apache Kafka,从设计的角度来看,作为两种不同的消息中间件,各自都有自己的技术考究,也都有一定的优缺点。本章,我们将不会去评判孰优孰劣,而是作为接下来本系列的引言或者入门。RabbitMQRabbitMQ是一个分布式的消息队列系统。之所以说是分布式,因为它通常作为节点集群运行,这其中队列分布在节点上,并可选择复制以实现分区...翻译 2018-10-09 21:10:37 · 820 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (五)—— RabbitMQ路由拓扑与消息模式
本章我们讨论RabbitMQ的路由模式与消息拓扑,主要涉及以下知识点:交换器类型与绑定关系消息队列死信交换器即时交换器与队列备用交换器优先级队列交换器类型扇出交换器扇出交换器提供了典型的发布订阅消息拓扑,发送到扇出交换器中的消息将会广播路由到所有绑定到当前交换器上的所有消息队列和交换器中。在扇出交换器中,消费者彼此间相互独立,彼此收到的也只是消息的拷...翻译 2018-10-17 17:14:35 · 638 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (六)—— Kafka路由拓扑与消息模式
路由拓扑与消息模式上一章我们介绍了有关RabbitMQ消息拓扑与路由模式,本章我们讨论Kafka的消息路由方式,我们将对比两者之间的不同。注意,对比将基于事件驱动架构而非数据处理作业流应用的上下文中,尽管这两种类型的应用的区分界限并不是那么明朗。第一个不同点在于对于Kafka来说,并没有重试和延迟消息模式。在RabbitMQ中,消息都是瞬时的,所以对于RabbitMQ来说,重试是有实际业务用例...翻译 2018-10-17 20:30:11 · 1050 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (八)—— Kafka消息路由原语与路由保证
Kafka的路由保证主要基于以下实现:消息持久化:一旦消息存储到主题中,则确认不会出现丢失消息的问题消息确认:Kafka(或者是Zookeeper)与发布者、订阅者之间的消息通信消息批量Kafka与RabbitMQ一个最大的不同之处在于Kafka支持在消息发送和处理时批量操作。当然,RabbitMQ也可以实现类似批量的操作:每多少条消息暂停一次直至收到所有的消息确认。...翻译 2018-10-23 20:49:39 · 1063 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka (十)—— Kafka集群的分区容错性与高可用性
本章我们讨论有关Kafka集群的容错性与高可用性话题在Kafka中,复制的单元是分区,每一个主题中都有一个或者多个分区,每个分区都有一个领导者以及若干个追随者。当创建主题之后,需要指定分区及复制因子,常见的复制因子通常是3,即一个领导者,两个追随者。在Kafka集群中,所有的读写操作都会路由到领导者,追随者只会定期从领导者请求获取最新消息,消费者并不会从追随者分区中获取消息,追随者存在的...翻译 2018-11-02 13:52:00 · 1642 阅读 · 0 评论 -
RabbitMQ VS Apache Kafka 系列
RabbitMQ VS Apache Kafka (一)—— RabbitMQ简介RabbitMQ VS Apache Kafka (二)—— Kafka简介RabbitMQ VS Apache Kafka (三)—— 基本结论RabbitMQ VS Apache Kafka (四)—— 应用场景如何选择?RabbitMQ VS Apache Kafka (五)...原创 2018-11-02 14:06:48 · 822 阅读 · 0 评论 -
什么是微服务——微服务架构体系介绍
Why Microservices?回答这个问题前,我们先看下之前大行其道的单体架构 - Monolithic Architecture,对于非专业人士来讲,所谓的单体架构,其就像一个超大容器,容器内集中包含了该应用的所有软件组件,并且组件与组件之间紧密耦合。对于这种架构,其缺陷或者说潜在不足也很明显,简单总结如下:臃肿僵化不灵活: 单体架构很难采用多种技术可靠性较差: 这种架构最明显...翻译 2019-06-15 22:02:08 · 2689 阅读 · 0 评论 -
微服务架构特征
一个典型的微服务架构(MSA)通常包含以下组件:客户端身份标识提供者: 提供访问服务所需的身份密钥,服务网关会负责完成对请求客户端的基本验签工作API服务网关: 客户端访问目标服务的入口点,经服务请求经服务网关路由到目标服务提供方。服务网关的优点:服务更新操作对客户端透明服务与服务之间的消息路由协议不一定非得基于WEB服务网关可以统一进行安全授权或者负载均衡等操作消息:...翻译 2019-06-16 16:25:12 · 921 阅读 · 0 评论 -
Java之keytool命令学习
Java Keytool is a key and certificate management utility. It allows users to manage their own public/private key pairs and certificates. It also allows users to cache certificates. Java Keytool store...原创 2019-06-20 21:46:54 · 783 阅读 · 0 评论 -
Atomic Variables and ConcurrentMap
AtomicIntegerThe package java.concurrent.atomic contains many useful classes to perform atomic operations. An operation is atomic when you can safely perform the operation in parallel on multiple t...转载 2018-08-31 14:07:13 · 468 阅读 · 0 评论 -
Synchronization and Locks
SynchronizedIn the previous tutorial we’ve learned how to execute code in parallel via executor services. When writing such multi-threaded code you have to pay particular attention when accessing sh...转载 2018-08-31 13:45:11 · 627 阅读 · 0 评论 -
Java中抽象类与接口区别
抽象类:抽象类是无法实例化的特殊类。所以问题是为什么我们需要一个不能被实例化的类,抽象类只能是子类(继承自)。换句话说,它只允许其他类继承它,但不能实例化。优点是它为所有子类执行特定的层次结构。简而言之,它是一种契约,它强制所有子类执行相同的层次或标准。 接口:接口不是类,由Interface关键词定义,接口只有方法签名,没有方法实现(8之后支持默认方法)。与抽象类类似,它也是一种契约,用原创 2017-12-20 09:18:19 · 4818 阅读 · 0 评论 -
Java 8系列之重新认识HashMap
Java 8系列之重新认识HashMap摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介Java为数据结构中的映射定义了转载 2017-12-22 21:28:40 · 337 阅读 · 0 评论 -
JDK中的设计模式之观察者模式
The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usu原创 2017-12-06 20:17:31 · 569 阅读 · 0 评论 -
JDK中的设计模式之装饰者模式
The decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class原创 2017-12-07 20:20:47 · 927 阅读 · 0 评论 -
Java之反射详解
Java反射技术提供了一种用以检查或者修改程序在运行的状态或者行为的一种机制。反射用途:可扩展性:你可以通过名字匹配的方式来创建用户自定义实例 提供类管理功能和可视化开发上下文:类管理器可以用来枚举类中的成员变量,而可视化的开发环境可以帮助开发人员书写准确的代码提供调试与测试工具:调试人员可以借助反射检查类中的私有变量,测试人员可以利用反射获取类提供的接口集合,提高代码覆盖率反射的缺点反射虽原创 2017-12-26 13:23:20 · 313 阅读 · 0 评论 -
Java并发编程之CyclicBarrier
java.util.concurrent.CyclicBarrier是jdk1.5引入的一种线程同步机制,换句话说,CyclicBarrier是运行时一个特殊的运行节点,在多线程执行上下文中,所有线程通过调用CyclicBarrier.await()方法相互等待,直到所有的线程都运行到这个节点时,才允许继续下一步操作,即所有的线程资源开始释放,继续执行下一步操作,参见下图:创建CyclicBarr原创 2017-12-26 19:44:13 · 355 阅读 · 0 评论 -
Java并发编程之CountDownLatch
java.util.concurrent.CountDownLatch 是jdk1.5引入的一种通过计数器的方式来实现多线程环境下等待指定操作完成的并发机制CountDownLatch 可以通过构造函数指定计数器的初始值,即countDown原子方法调用次数,countDown每调用一次,计数器减一CountDownLatch latch = new CountDownLatch(3);线程通过调原创 2017-12-26 20:08:31 · 224 阅读 · 0 评论 -
2018开年第一篇:equals()与hashCode()
equals()和hashcode()是java.lang.Object中提供的用以对象比较的两个重要方法,下面是其定义及默认实现:public boolean equals(Object obj) { return (this == obj); }:用以判断变量参数与当前实例是否相等,JDK默认实现是基于对象内存地址是否相同,如果两个对象内存地址相同,则表示两个对象相同。public nativ翻译 2018-01-02 19:51:57 · 1706 阅读 · 2 评论 -
Java 内存模型(Java Memory Model)
JVM内存模型定义的是Java虚拟机(JVM)如何在计算机内存(RAM)中工作机理。深入理解JVM内存模型对于多线程下编写正确的并发程序至关重要。Java内存模型指定了不同线程在什么时候、以什么样的方式访问其他线程写入到共享变量的值,以及如何同步访问共享变量。 最初版本的Java内存模型相对不够完善,JDK 1.5对此进行了完善,并一直沿用至Java 8The Internal Java Me翻译 2017-12-27 20:00:30 · 493 阅读 · 0 评论 -
Java并发编程之ReentrantLock
public class ReentrantLock extends Object implements Lock, Serializable A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchro原创 2018-01-03 19:49:48 · 424 阅读 · 0 评论 -
中介者模式
中介者模式 按照“四人帮”(GoF)的说法,中介者设计模式通过封装不同的对象集交互和通信的方式,进而达到对象与对象之间的松耦合。中介者模式允许每个对象的动作彼此相互独立地变化。简介在一个企业级的应用当中,会包含很多对象相互之间关联的场景,如果他们直接调用,可能带来的结果就是系统耦合度太高,进而导致系统维护成本过高,并且难以扩展。而中介者模式就是为系统各对象之间提供沟通桥梁,从...原创 2018-03-07 11:55:31 · 188 阅读 · 0 评论 -
命令模式
命令模式在命令模式中,请求会发送给调用方,调用方会将请求传递给已经封装好的命令对象,然后命令对象会把请求发送给目标接收者来执行相应的操作。客户端会创建接收者对象,并且将对象与命令相关联。之后,客户端会创建调用者对象并且将命令对象关联来执行操作,当客户端执行操作时,它就会基于命令和接收者来执行相应的操作。现实世界中命令模式的一个例子是餐馆里的点餐场景:餐馆服务员收到订单请求,这就是来自客...翻译 2018-03-08 09:20:05 · 188 阅读 · 0 评论 -
责任链模式
责任链模式目的是为了避免请求发送者与请求接收者耦合,从而给予多个对象来处理同一个请求,链收到请求之后,会沿着链传递请求,直至有对象处理它。现实中的例子:银行业务场景中,你的请求可能在多个部门当中依次传递,直至特定部门进行处理。ATM机使用责任链模式进行用户取钱吐钞 代码示例 责任链上的Handler接口public interface EmailHandl...原创 2018-03-08 10:37:02 · 209 阅读 · 0 评论 -
迭代器模式
迭代器模式 Provides a way to access the elements of an aggregate object without exposing its underlying represenation.迭代器模式可以用以访问聚合对象中各个元素, 而又无须暴露该对象的内部表示。 代码示例 Iterator接口,泛型接口public int...原创 2018-03-08 14:43:54 · 272 阅读 · 0 评论 -
常见设计模式代码实现
以前学设计模式的时候,有点模模糊糊的感觉,不知道为什么是这样子,经过这些年的“浸淫”,现在再看,发现还真有点感觉了,于是,我决定将其记录下来,一来是为了巩固记忆,二来也为以后查阅方便,所有代码都是根据我自己的理解实现,我不敢贸然说已经打通了任督二脉,但至少已经知其然了,后续,也会随着自己的理解逐步补充,知其然更要知其所以然。 愿不负光阴,没有翅膀的孩子只能努力奔跑。github 地址...原创 2018-03-05 16:52:29 · 682 阅读 · 0 评论 -
微服务架构中的服务边界与服务识别
前言在我们进行微服务架构设计和改造过程中,一个不可避免的问题是如何确定服务边界、如何进行服务识别,微服务的划分粒度究竟如何确认。我们可能会听到,服务既不能太大,也不能太小,当然这是一个笼统的概念。那么,问题来了,究竟多大是大,多小是小。比如,以下原则是否可行?一个微服务应该包含N行代码将系统中每一个功能都定义为一个服务另外,考虑一个问题:如果服务划分太细,会出现什么问题?...原创 2018-08-23 11:00:22 · 5145 阅读 · 0 评论 -
Threads and Executors
Threads and ExecutorsWelcome to the first part of my Java 8 Concurrency tutorial. This guide teaches you concurrent programming in Java 8 with easily understood code examples. It’s the first part o...转载 2018-08-30 21:52:22 · 422 阅读 · 0 评论 -
微服务架构系列——API服务网关
本章我们简单介绍微服务架构下的API服务网关,本章我们将讨论以下话题:什么是API服务网关为什么需要API服务网关API服务网关的工作机制处理横切关注点当我们在开发设计大型软件应用时,我们一般都会采用分层的架构模式,比如,在WEB应用程序中,下面的这种架构是我们最为常见的设计模式在这样的一个分层架构中,我们可以看到应用被分成了web层、业务层、数据层。在分层架构设计中,我们可以看...翻译 2019-06-17 19:07:45 · 969 阅读 · 0 评论