
架构和设计
文章平均质量分 68
jzq1999
这个作者很懒,什么都没留下…
展开
-
使用AOP统计方法的执行时间
1. 需求背景 性能调优阶段,需要找出执行时间比较长的方法,针对这些方法进行调优。 2. 可行方案一种是传统的在每个方法前后获取System.currentMis(),然后得到方法的执行时间。这种方式的缺点是方法多会写很多耦合代码,而且不可重用,测试完需要删掉。 另一种使用AOP监控方法的前后点,监控方法的执行时间,比较优雅且无侵入。可行的方案之一是使用...原创 2017-06-08 21:26:35 · 757 阅读 · 0 评论 -
Linux以服务方式启动单个tomcat
1. 下载tomcatapache-tomcat-8.0.26.tar.gz 2. 传到远程服务器scp Downloads/apache-tomcat-8.0.26.tar.gz wumart@42.159.80.106:/home/wumart 3. 把tomcat移动到/usr/local目录:[wumart@dmallsol10007 lo...原创 2015-08-27 11:24:16 · 157 阅读 · 0 评论 -
观察者模式和发布/订阅模式的区别
在事件总线(EventBus)的架构设计中,用到了发布/订阅模式,但发现和观察者模式挺接近,有时容易发生混淆,现试图分清一下他们的关系。 观察者模式的角色为观察者(observer)和主题(subject)对象,observer需要观察subject时,需先到subject里面进行注册(subject对象持有observer对象的集合句柄),然后,当su...原创 2015-08-02 17:19:16 · 397 阅读 · 0 评论 -
Sonar的安装与设置
Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。 1. 配置数据库...原创 2015-07-25 17:21:17 · 226 阅读 · 0 评论 -
动态代理之CGLIB
CGLIB 介绍CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。CGLib 可以在运行时扩展Java类与实现Java接口。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口实现类的方法,还可以接管普通类的方法.CGLib 的底层是Java字节码操作框架 —— A...原创 2015-07-17 17:35:46 · 77 阅读 · 0 评论 -
同步、异步、阻塞、非阻塞的区别
同步、异步、阻塞、非阻塞这几个概念在并发编程和架构设计中用的比较多,这里小记一下对他们的理解,先阐释一下他们之间的区别: 同步:多个任务或事件必须顺序执行,前一个任务没执行完,后一行任务就不能进行。实现:常见的顺序编程, 串行执行场景:B/S架构的HTTP请求-响应模式、OA流程。 异步:多个任务或事情可以并行执行,任意一个任务的执行不会阻塞另外一个任务的执行。异步调用...原创 2015-07-15 14:32:55 · 98 阅读 · 0 评论 -
代理模式之动态代理
从JDK1.3开始,java中引入了动态代理机制,有关的接口和类是InvocationHandler和Proxy,都位于java.lang.reflect包下。InvocationHandler接口只定义了一个抽象方法: Object invoke(Object proxy, Method method, Object[] args) Proxy类中主要的2个静态方法...原创 2015-06-30 16:11:31 · 87 阅读 · 0 评论 -
代理模式之静态代理
代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。比如:代理服务器、产品代理、工商代理、会计代理、房地产中介、职业中介等。 组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来...原创 2015-06-29 13:06:17 · 85 阅读 · 0 评论 -
Spring配置文件常用注解
1. <context:component-scan base-package="com.base.controller" />是Spring的组件扫描设置,通过注解的方式注入bean,是除xml注入bean的另一种实现方式。 base-package 为需要扫描的包,该包下的子包也会被扫描到。 @Component是所有受Spring管理组件的通用形式, @Repo...原创 2015-06-18 13:53:04 · 145 阅读 · 0 评论 -
Linux Shell启动多个Tomcat
有时部署项目时使用多个应用服务器做负载均衡,这里使用多个Tomcat做负载。服务器环境: CentOS 6.5Tomcat目录: /usr/localTomcat目录下有tomcat1、tomcat2、tomcat3、tomcat4 四个tomcat实例。tomcat实例的命名规则: tomcat${i} 1. 新建一个shell文件命名为 tomcat.sh#!...原创 2015-09-20 09:23:41 · 2613 阅读 · 0 评论 -
软件设计中的心跳机制
前言 在软件的设计架构中,心跳检测很重要,像在dubbo service、web api invoke中,需要consumer端感知provider端是否存活,不存活则切换调用另一个provider。 一、什么是心跳检测 判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对...原创 2016-08-17 18:59:09 · 726 阅读 · 0 评论 -
MyBatis 批量操作
使用MyBatis做数据处理框架时,操作大量数据的插入、更新等耗时的工作时,可以使用批量处理来提高效率,MyBatis的批量处理主要使用foreach标签来实现。 foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶...原创 2016-09-02 15:24:09 · 165 阅读 · 0 评论 -
Dubbo与Spring的配合使用
Dubbo是一个服务治理框架,对分布式服务的管理和治理、监控有较好的实现。 本案举例说明Dubbo与Spring的配合使用:1. Maven引入dubbo的配置<dependency> <groupId>com.alibaba</groupId> <artifactI...原创 2016-02-21 22:44:21 · 238 阅读 · 0 评论 -
logback异步记录日志
logback支持异步记录日志,这样可加快程序的主流程处理速度,提高接口的qps。logback异步记录日志的原理,也是使用一个缓冲队列,当缓冲数量到一定阀值时,才把日志写到文件里。 下面是配置示例:<?xml version="1.0" encoding="utf-8"?><configuration scan="false"> &l...原创 2016-01-12 19:57:23 · 495 阅读 · 0 评论 -
设计模式之---策略模式
策略模式,顾名思义,是使用不同的策略解决问题的模式,孙悟空有七十二变,孙子兵法有三十六计,这里的七十二变和三十六计里的每一个变法和计谋,都是一种策略。需要当事者根据具体的情形,去做选择变成什么和使用哪一个计谋。 1. 策略模式类图 2. 策略模式的组成:抽象策略基类、策略实现类、调用者。基类中有抽象的算法,实现类实现具体和算法行为,调用者类持有策略接口的引用,可以灵活调...原创 2016-11-19 01:20:29 · 274 阅读 · 0 评论 -
SSL双向通信
keytool操作步骤:1. 分别生成客户端和服务器端密钥库keytool -genkey -alias server1 -keysize 2048 -validity 3650 -keyalg RSA -dname "CN=ABC, OU=BetterWood CA, O=ABC Inc, L=BeiJing, S=BeiJing, C=CN" -keypass abcdef1 -...原创 2014-11-01 23:27:20 · 176 阅读 · 0 评论 -
SSL/TLS 协议详解
SSL(Secure Sockets Layer,安全套接层),及其继任者 TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃...原创 2014-10-29 19:00:51 · 132 阅读 · 0 评论 -
Spring 初始化2次的问题
在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常。 一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理。 此处是一个jedis工厂类的...原创 2015-11-16 21:28:07 · 322 阅读 · 0 评论 -
聊聊缓存
缓存在应用中经常可以遇到,大的可以表现为分布式缓存服务和外部的缓存服务应用,小的可以使用应用级的缓存。缓存的主要作用,一是可以加快热点数据访问速度,二是保护后端的数据库不被突然增长的压力压垮,三是减少计算,是以空间换时间的典型应用。 从分类上来说,缓存可以分为外部缓存服务和应用缓存。外部缓存服务可以表现为MemCache、Redis、MongoDB等。应用缓存可以使用Has...原创 2016-09-29 21:44:58 · 112 阅读 · 0 评论 -
Mongo支持地理索引
1. Geospatial Indexing MongoDB支持二维空间索引,这是设计时考虑到基于位置的查询。例如“找到离目标位置最近的N条记录”。可以有效地作为附加条件过滤。 2. Creating the Index db.places.ensureIndex( { loc : "2d" } ) // 支持平面位置索引或 db.p...原创 2015-10-31 15:37:15 · 135 阅读 · 0 评论 -
redis配置文件
1. 配置redis-server以守护线程运行sudo vi redis.conf# 修改下面的no为yesdaemonize yes 2. 参数的含义daemonize:是否以后台daemon方式运行pidfile:pid文件位置port:监听的端口号timeout:请求超时时间loglevel:log信息级别logfile:log文件位置...原创 2015-06-08 00:12:03 · 94 阅读 · 0 评论 -
redis状态与性能监控
1. redis-benchmark是 redis的性能监测工具Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server h...原创 2015-06-03 09:41:08 · 140 阅读 · 0 评论 -
bonecp所依赖jar包
bonecp是一个轻型、高效的连接池解决方案,除了自身bonecp.jar外,还需要依赖一些外部jar包才能正常运行,这些jar包是:bonecp-0.7.0.jarmysql-connector-java-5.1.13-bin.jarslf4j-log4j12-1.6.1.jarslf4j-api-1.6.1.jarlog4j-1.2.16.jarguava-r07.jar解读:Gu...原创 2013-04-15 12:38:32 · 479 阅读 · 0 评论 -
Spring mvc中一个service中使用多个dao
在当前的一个项目中,一个Service中需要操作多个数据库表,默认是一个service对应一个dao,一个dao对应一个entity,一个entity对应一个表。Realize:/** * Description: 课件服务 * @author user * 2012-5-25 */@Component@Transactionalpublic class C...2012-05-26 14:09:36 · 869 阅读 · 0 评论 -
如何自定义MVC框架
①用一个容器(拦截器或者servlet类、filter类)接受请求; 一般在web.xml中进行配置,拦截请求到ActionServlet(控制Servlet)中。②分割请求路径:得到请求访问类以及访问方法的标示字符串; 解析请求的URL路径,读取配置文件。③通过字符串获得Action类对象以及方法; 找出字符串对应的Action类名,加载Action类,并实例化一个对象...原创 2011-06-17 17:49:45 · 104 阅读 · 0 评论 -
一个需求技术选型的考虑过程
前段时间,项目中遇到一个需求,是在A系统进行一些操作后,往数据库存数据时,触发B系统,B系统把数据也同时存放到数据库中,要求是两边的数据要相同,在A系统又不能直接操作B系统中的表(出于耦合性的考虑)。技术选型的考虑过程是:1. 用service+httpclient的方法,结果逻辑太多,计算复杂,很可能会出现数据漏计算或计算错的情况。2. 用socket的方法,缺点是...原创 2011-06-01 17:23:04 · 216 阅读 · 0 评论 -
java中的设计模式
1.工厂模式:可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。 DateFormat类的getDateInstance(),Collection接口的iterator()返还一个具体的Iterator类,也是一个工厂方法。 2.单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。资源管理器、Runtime对象和Introspector对象都是单...原创 2010-08-03 22:17:15 · 148 阅读 · 0 评论 -
struts+hibernate+spring结合时遇到的问题
近日在尝试用 struts+hibernate+spring做一项目,版本分别是struts1.2,hibernate3.1,spring2.0,在导入各自的jar包后启动,报这样的错误: cann't create sessionFactory java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visi...2008-12-04 21:42:23 · 113 阅读 · 0 评论 -
用Java动态代理实现AOP
AOP(Aspect Oriented Programing)面向切面编程,有大量支持AOP的优秀Framework,Spring,JAC, Jboss AOP 等等。 为了简单起见,本文例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP. 让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制...原创 2009-05-08 16:30:19 · 78 阅读 · 0 评论 -
Java对象池技术的原理及其实现
Java对象的生命周期分析 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除。因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3。其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间。由此,我们可以看出,只有T2是真正有效的时间,而T1、T3则 是对象本身的开销。下面再看看T1、T3在对象的整个生命周期中所占的比例。 ...原创 2009-05-01 09:14:55 · 69 阅读 · 0 评论 -
tomcat性能优化设置
tomcat的优化策略有2处,1是JVM内存的优化,2是线程并发量的优化。 JVM内存的优化在bin目录的catalina.sh,在"OS"下增加:set JAVA_OPTS=-server -Xms1300M -Xmx1300M -Xss256k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=1...原创 2013-04-25 19:19:55 · 175 阅读 · 0 评论 -
Hibernate延迟加载机制
延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。A、实体对象的延迟加载:如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中...原创 2012-09-17 07:51:42 · 76 阅读 · 0 评论 -
memcached配置和使用
memcached作为著名的分布式内存对象缓存系统,具有高性能、免费和开源的特点,在互联网应用中大行其道,用于加快web动态应用程序的响应和减轻数据库的负荷。memcached的实现机制为K-V,类似Map容器机制。Windows环境下载:1. memcached的windows版本,地址在http://code.jellycan.com/memcached/,此例用的是memca...原创 2012-10-16 00:17:41 · 82 阅读 · 0 评论 -
Mac安装redis
1. 下载redis ,最新可用版本为 redis-3.0.1.tar.gz, 下载地址 http://redis.io。 2. 安装:tar zxvf redis-3.0.1.tar.gz makemake installRedis 由四个可执行文件:redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上...原创 2015-05-28 23:53:50 · 104 阅读 · 0 评论 -
使用Jersey的两种方式
Jersey可以较好地构建Rest API服务,特别在当前多客户端,一个服务端的情况下,使用API向手机端和网页端提供服务,关于Jersey的介绍可以参见:https://jersey.java.net,Jersey在Project使用时有两种jar实现,一种是使用sun的jar,一种是使用glassfish的jar。在web.xml中的配置:<!-- jersey web se...原创 2015-04-28 16:34:08 · 420 阅读 · 0 评论 -
一致性哈希算法
一致性哈希算法,是1997年麻省理工学院提出,用来解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。不同的是,一致性哈希修正了CARP使用简单哈希算法中未决的问题,是第一个实用的DHT算法。 一致性哈希算法有4个特点:1. 平衡性(Balance)指哈希的结果尽可能分布到所有的缓冲中,使所有的Cache都得到利用,这一点多数Hash算法基本上都已实现了。2...原创 2015-04-24 14:13:23 · 250 阅读 · 0 评论 -
http请求的过程
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规...原创 2015-04-17 09:33:53 · 205 阅读 · 0 评论 -
设计模式六大基础原则
1. 单一职责原则:(Single Responsibility Pinciple) 一个类只负责一项职责,就负责一件事情。 当超过一项职责需要负责时,需要增加新的类来负责新的职责,而不是在类中增加新的代码。 如果一个类承担的职责太多,就是高度地职责耦合,非常不利于扩展功能。这是非常脆弱的设计。容易发生修改一个地方而影响其他地方的情况。遵循单一职责原则的优点:...原创 2015-02-13 00:38:20 · 173 阅读 · 0 评论 -
工厂方法模式
工厂方法模式定义:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses。定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂...原创 2015-02-12 00:04:17 · 124 阅读 · 0 评论 -
面向抽象编程和面向接口编程
面向接口编程,是指面向超类型编程,比如抽象类和接口,或super class,这样的话,可以按照约定进行获取数据,不用关心内部处理的细节,封装了业务逻辑,维护了系统的稳定性和系统间的低耦合性。 面向抽象编程,是指面向抽象角色编程,而不面向具体类编程。好处是程序可以灵活地增加功能,良好的解耦性、可扩展性,符合“开-闭”准则。 抽象类:类中有抽象方法,继承类必须实现这些抽象方法...原创 2015-02-11 13:34:19 · 534 阅读 · 0 评论