Java
文章平均质量分 81
忆之独秀
Engineer
展开
-
【大道模式】状态模式 - State Pattern(审核状态流转)
状态模式实现审核状态流转原创 2022-12-04 22:17:25 · 1128 阅读 · 1 评论 -
【大道模式】策略模式二-Strategy Pattern 2
目录一、策略模式定义二、为什么需要策略模式三、如何实现策略模式3.1 策略的定义3.2 策略的创建3.3 策略的使用四、原有代码五、重构代码5.1 策略定义5.2 策略创建5.3 策略使用之前的一个策略模式简单描述了策略模式的基本含义,本文将在生产环境的一个代码重构中重温一下。一、策略模式定义策略模式即定义一族算法类,将每个算法分别封装起来,让它们可以相互提花。此模式可以使算法的变化独立于使用他们的业务代码。二、为什么需要策略模式原创 2022-03-15 09:58:10 · 467 阅读 · 0 评论 -
【大道模式】享元模式-FlyWeight Pattern
一、什么是享元模式? 运用共享技术有效地支持大量细粒度的对象。二、为什么要用享元模式? 需要降低细粒度对象给系统带来的内存压力。三、如何实现享元模式? 对象池技术,用于减少创建对象的数量,以减少内存占用和提高性能,通过hashmap保存对象,代码模板:public class FlyWeight { private HashMap<String, Object> flyweight = new Hash...原创 2020-12-05 21:46:33 · 166 阅读 · 0 评论 -
【稳定性】混沌工程
1.什么是混沌工程?在可控的范围和环境下,通过注入故障,来验真系统的对于故障的容错手段,从而持续不断提升系统的稳定性和高可用性。2.为什么要混沌工程?发现系统弱点,来提升系统稳定性和可用性。3.如何实践混沌工程?以下原则描述了应用混沌工程的理想方式(源自 Netflix 在产生环境中对系统弹性测试的经验总结:http://principlesofchaos.org/): 原则 说明 建立一个围绕稳定状态行为的假说 ..原创 2020-10-25 18:20:22 · 285 阅读 · 0 评论 -
【稳定性】FMEA方法在系统可用性设计上的应用
最近在跟进软件系统的交付质量专项,需要解决的就是在软件交付之后出现故障过多的问题,这是一个较为宏观的问题,而有一个核心的点就在于系统可用性方案设计上的问题,设计上有了风险隐患点,测试上大概率也无法测试出风险隐患点(软件质量是设计出来的,不是测试出来的),那么上线之后就必然会出现问题,因此需要有一个方法来找到系统可用性设计上的风险隐患点,那么在系统设计的过程中尽量规避它们,同时能为测试用例提供明确的方向,这个方法就是FMEA。一、什么是FMEAFMEA,Failure mode and ...原创 2020-10-25 18:08:15 · 827 阅读 · 2 评论 -
【Spring】SpringBoot配置多Redis数据源
一、需求背景 最近在做项目的时候需要访问redis多数据源,做个记录。二、如何做的2.0 配置文件bootstrap.yml:spring: application: name: cloud-cros devtools: restart: #热部署生效 enabled: true #设置重启的目录 ...原创 2020-09-26 12:29:18 · 953 阅读 · 0 评论 -
【大道模式】外观模式-Facade Pattern
当你的系统需要分层设计 或者 需要在子系统和客户端之间建立一个高层接口使得子系统更容易复用时,就需要考虑使用外观模式了。基本介绍:1.外观模式(Facade),也叫"过程模式":外观模式为子系统中的一组接口提供一个一致(稳定)的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。2.外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。3.当系统需要进行分层设计时,可以考虑Facade模式。...原创 2020-08-08 13:15:37 · 242 阅读 · 0 评论 -
【大道模式】策略模式-Strategy Pattern
当你的代码中出现大量的if else的时候,是时候考虑一下策略模式了。基本介绍:1)策略模式中,定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。2)这算法体现了几个设计原则:第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)动机(Motivation):>在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将...原创 2020-05-31 19:29:58 · 445 阅读 · 0 评论 -
【Spring】Mybatis Chinese Character Empty Problem
在测试项目的过程中有中文条件查询,但是发现通过spring mybatis竟然查询不到结果,即结果为空,需要解决这个问题。先说一下这个问题的解法:1.在spring的数据库配置中需要使用utf8编码,即:useUnicode=true&characterEncoding=utf8jdbc.driver.default=com.mysql.jdbc.Driverjdbc.url.default=jdbc:mysql://xxx:3306/database?useUnicode=...原创 2020-05-28 20:51:09 · 213 阅读 · 0 评论 -
【大道模式】拦截过滤器模式-Intercepting Filter Pattern
最近在交接项目的过程中看到了拦截过滤器模式,用于在核心请求的"前后处理",比如在请求前对参数进行校验、做请求统计、数据埋点;在请求后记录返回结果、打印日志、处理日志(写入ES,HBase等),有点类似于aop的环绕around通知。核心组件:Filter(过滤器):在处理请求之前或者之后执行相应动作。Filter Chain(Filter Chain):一组过滤器的组合,按照添加的顺序依次执行。Target:目标处理对象Filter Manager:过滤管理器管理...原创 2020-05-23 19:18:40 · 365 阅读 · 0 评论 -
JDK8 Stream用法分析-双端队列和工作密取
最近在做项目的时候使用到了jdk8的parallelStream想来加快程序的执行效率,没有想到得到的集合里面有很多null,同时偶尔也会出现ArrayIndexOutOfBoundsException错误,下面就逐步进行解析。Jdk8有如下几个新特性:>Lambda表达式:允许把函数作为一个方法的参数传递进去。>方法引用:直接引用已有Java类或对象(...原创 2019-06-02 15:49:43 · 718 阅读 · 0 评论 -
【动态代理之三】AOP简介
AOP作为动态代理的一个典型应用,我们还是重新温习一下。一、AOP简介1.1 基本概念切面(aspect):用来切入目标方法的类;连接点(joinpoint):业务类和切面类的连接点,可以获取业务对象的类名,方法名和参数;通知(advice):在切面类中,对业务方法做出额外处理的方法;切入点(pointcut):需要切入的业务目标方法;目标对象(targe...原创 2019-04-09 12:02:22 · 380 阅读 · 0 评论 -
高可用进程内缓存设计和实现【二】
在系统设计中,为了提升性能往往需要使用到缓存,分布式缓存效率已经很高了,例如常用的redis以及memcache,但是对于极高并发,对响应要求极高的系统,则需要使用进程内缓存,下面将进程内缓存和分布式缓存进行了对比: 优点 缺点 方案 应用场景 进程间缓存 1....原创 2019-06-21 23:06:03 · 501 阅读 · 0 评论 -
内置锁和重入锁
一、重入锁 Java提供了一中内置的锁机制来支持原子性:同步代码块(Synchronized Block)。同步代码块包括两部分:一个作为锁的对象引用(因为synchronized锁住的是对象),一个作为这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态static的synchroni...原创 2019-06-29 23:29:48 · 674 阅读 · 0 评论 -
高可用进程内缓存设计和实现【一】
几乎所有的服务器应用程序都会使用某种形式的缓存,可以提升吞吐量,但是却要消耗更多的内存。本文从ConcurrentHashMap开始,来个一步一步的优化一个高效的进程缓存。一、ConcurrentHashMap(JDK7) ConcurrentHashMap是一个基于散列的Map,但是它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。Concurren...原创 2019-06-30 13:04:08 · 344 阅读 · 0 评论 -
volatile语义及底层原理
当我们使用volatile关键字去修饰变量的时候,所以线程都会直接读取该变量并且不缓存它。这就确保了线程读取到的变量是同内存中是一致的。结合JMM的特性,volatile是一个最轻量级的同步机制,三大特点,1.保证主存可见性;2.不保证原子性;3.禁止指令重排序。一、可见性 可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以"立即"得知的...原创 2019-07-29 17:17:28 · 223 阅读 · 0 评论 -
从CAS底层原理说到ABA问题
一、什么是CAS? CAS(Compare and sweep):比较并交换(compareAndSet),是解决多线程并行情况下使用锁造成性能损耗的一种机制。比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较知道主内存和工作内存中的值一致为止。CAS有3个操作数,内存值为V,旧的预期值为A,要修改的更新值为B。当且仅当预期值A和内存值V相同时,将内存值V修...原创 2019-07-30 23:03:57 · 539 阅读 · 0 评论 -
Java Memory Model - Java内存模型
Java虚拟机规范定义了Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态变量和构成数组对象的元素)的访问方式。一、主内存和工作内存 ...原创 2019-07-28 21:04:40 · 166 阅读 · 0 评论 -
深入线程池ThreadPoolExecutor
我们先从阿里编程手册里面关于并发编程的两点来说明。6.3:线程资源必须通过线程池创建,不允许在应用中自行显示创建线程。说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源的不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者"过度切换"的问题。6.4:线程池不允许使用Executors创建,而是通过ThreadPool...原创 2019-08-18 17:48:39 · 527 阅读 · 0 评论 -
【动态代理之二】实现原理探究
代理模式的作用即使为其他对象提供一种以控制对方的访问。在某种情况下,一个客户不想想或者不能直接引用另一个对象,那么可以在客户端和目标对象之间起到中介的作用。 一、代理的角色第一种:抽象角色,声明真实对象和代理对象的共同接口,也就是定义的interface。第二种:代理角色,代理对象角色内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象提供与真实对象相同的接...原创 2019-01-15 14:51:30 · 1269 阅读 · 0 评论 -
【动态代理之一】反射基础
在理解动态代理之前,需要理解一下反射的概念和基础。一、定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反...原创 2019-01-10 23:19:13 · 277 阅读 · 0 评论 -
【Redis】Redis间歇性超时之minIdle参数的影响
最近在做一个服务的过程中,需要从redis中读取热点数据,限制的超时时间不超过10ms,在1000并发压测的情况下,平均每个请求的耗时为4~5ms,但是和上游联调调用的时候总会很多请求超时,让人胆战心惊,百思不得其解,那么看一下Spring中JedisPoolConfig的配置:<bean id="poolConfig" class="redis.clients.jedis...原创 2018-11-24 16:58:52 · 8087 阅读 · 1 评论 -
Java对Mysql的简单数据操作
最近项目中有个简单的需求就是需要读取数据库中的数据,并调用远程api去操作数据,成功则更新相应字段。那么最首要的一步就是java对Mysql数据库的操作,在此简单的记录一下。整个操作流程如下:1.加载数据库驱动:"com.mysql.jdbc.Driver"2.通过url,user,password来建立连接3.创建statement对象4.执行sql语句,取出数据,更原创 2016-08-27 15:03:06 · 813 阅读 · 0 评论 -
各种语言代码规范
1. Chttp://wiki.nginx.org/CodingStylehttp://tengine.taobao.org/book/appendix_a.html2.C++http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml中文版:http://zh-google原创 2016-05-18 10:27:47 · 5161 阅读 · 0 评论 -
Java对IpAddress排序
需要对存在ArrayList中的ipAddress进行排序,下面做法是达不到效果的:List ipAddress = new ArrayList();ipAddress.add("10.1.2.1");ipAddress.add("10.121.76.89");ipAddress.add("10.121.76.132");ipAddress.add("10.121.76.89");C原创 2016-04-11 21:34:12 · 2764 阅读 · 2 评论 -
构建Spring Restful API请求参数解析
编写Spring restful api接口是一个非常常用的手段来接受http请求服务,那么接收参数的方法以及使用Mock进行测试可以值得探究一下。原创 2016-04-08 16:32:03 · 11818 阅读 · 0 评论 -
文件递归的简单Java实现
有时候在写项目的时候我们需要遍历某个文件夹下面的所有文件,并对这些文件进行处理,而用递归的方法去遍历这些文件成为了首选。假设在D盘下面有文件夹A,它的目录树为:那么递归遍历A文件夹下的文件的Java代码为:package String;import java.io.*;public class FileRecursive { public static void m原创 2013-11-21 10:18:00 · 1531 阅读 · 0 评论 -
Java和C++在堆栈中创建对象的简单对比
最近写java的项目,由于对java不熟悉,即使是一个简单的错误和bug都要调试很久,因此只有不断总结才能更加深刻的认识。出现错误的代码是这样的:List<File> filelist = null;filelist.clear();报的错误是:java.lang.NullPointerException;这应该就是一个空指针的错误,现在想想应该不合理,但是之前...原创 2013-09-28 13:35:21 · 1107 阅读 · 0 评论 -
正则表达式简介以及C++/Java实现
由于最近的项目中用到了正则表达式,正好也遇到了一个面试题,题中也有对正则表达式就行考察,所以简单学习一下Regular Expression,然后以一道笔试题的实现来作为练习。首先可以熟悉一下正则表达式的概念:http://baike.baidu.com/view/94238.htm常用的正则表达式正则表达式匹配举例x指定字符x原创 2013-11-04 13:54:20 · 2236 阅读 · 2 评论 -
Java Set对象去重
我们可以知道Set集合是没有重复数据的特性,那么对于元素为对象 的情况是否也同样奏效?可以看一下。举一个例子:SetTest.java:class VO { private String name; private String addr; public VO(String name, String addr) { this.name = nam...原创 2018-05-23 16:41:19 · 62464 阅读 · 16 评论 -
Kafka Java示例
由于项目原因需要升级kafka,需要重新申请kafka服务,用新的Java API来编写producer和consumer,顺便接触一下Kafka。准备工作就是安装zookeeper和kafka,由于关于安装方面的文章很多,在此就不细说了。一、一些问题1.1 kafka错误错误:WARN Error while fetching metadata with correlatio原创 2018-01-04 15:56:37 · 6503 阅读 · 0 评论 -
权重选择算法Java实现
我们有时候会遇到这种需求,那就是根据权重,按照比例去获取相应的信息,比如配置信息获取,负载均衡RS获取等。 在此就举一个例子,然后简单的实现。需求:后端有三台机器,信息分别为,S1, S2ip:"10.0.0.2",port:8082,weight:40>, S3ip:"10.0.0.3",port:8083,weight:60>,根据weight按照比例返回响应的机器信息。原创 2017-10-23 16:38:21 · 8318 阅读 · 2 评论 -
【大道模式】单例模式-Singleton Pattern
最近做项目遇到了一个问题,看了很久都没有得到解决,问题描述如下:用Java实现了文件上传的后台代码,主要文件是UploadServlet,那么在上传的时候会发现当我上传一个文件的时候会触发多个连接数据库的操作,这样上传多个文件就会触发更多的操作,这样就会是一个遭难,因为数据库连接数过多就会造成以后创建失败。仔细观察一下有问题的伪代码:public class UploadServle...原创 2013-11-07 23:56:41 · 1355 阅读 · 0 评论 -
C语言MD5加密算法的简单调用实现(另附:Java/Python/Shell/Golang方法)
1.首先加上一些库:apt-getinstallopenssllibssl-devlibssl-doclibcurl4-openssl-dev2.实现一个用MD5加密密码的小程序:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<openss...原创 2013-09-09 22:55:17 · 3898 阅读 · 0 评论 -
ActiveMQ介绍(二)
3 ActiveMQ3.1 MessageProducer异步/同步发送ActiveMQ支持以同步(sync)方式或者异步(async)方式向broker发送消息。使用何种方式对send方法的延迟有巨大的影响。对于生产者来说,既然延迟是决定吞吐量的重要因素,那么使用异步发送方式会极大地提高系统的性能。ActiveMQ缺省使用异步传输方式。按照JMS规范,当在事务外发送持久化消息的时原创 2017-03-26 23:29:49 · 811 阅读 · 0 评论 -
ActiveMQ介绍(一)
本文主要介绍一下ActiveMQ的使用方法,介绍ActiveMQ的基本概念和相关示例。原创 2017-03-24 16:46:10 · 1616 阅读 · 0 评论 -
What is a callback api
什么是callback接口,在stackoverflow上看到了两个不错的答案,结合在实际工作中用到的来说一下自己浅显的理解。原创 2017-02-27 15:01:37 · 1103 阅读 · 0 评论