自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(223)

原创 Redis客户端简单封装(spring)

    Jedis客户端已经比较易用了,不过在spring环境下,可能还需要简单的封装一下。一、单节点Redis服务使用    即只有一个Redis server,或者在M-S模式下,只有Master提供读写服务时使用,配置中指定Master的IP和Port即可。此处使用了Spring FactoryBean方式来创建JedisPool实例。    1、SingletonClient...

2017-04-28 12:27:33 231

原创 Flume基本特性(1.7)

    Apache Flume是一个分布式的、可靠的、高效的日志数据收集组件;我们通常使用Flume将分散在集群中多个Servers的log文件,汇集到中央式的数据平台中,以解决“从离散的日志文件中查看、统计数据困难”的问题。当然,Flume不仅仅可以收集log文件,它也支持比如TCP、UDP等消息数据的收集;无论如何,我们最终解决的问题就是“将离散的数据进行收集”。我们先描述几个概念:...

2017-03-27 11:36:39 2233

原创 JAVA正则表达式过滤文件

    正则表达式过滤文件列表,听起来简单,如果用java实现,还真需要一番周折,本文简析2种方式 1、适用于路径确定,文件名时正则表达式的情况(jdk6的写法)String filePattern = "/data/logs/.+\\.log";File f = new File(filePattern);File parentDir = f.getParentFile()...

2017-02-14 11:12:54 980

原创 nginx/tomcat日志格式规范

    最近准备设计和开发一套日志收集平台,进而后续进行实时的日志分析、业务监控和预警等。在此之前,需要制定日志的格式规范,当然还有其他的约束性规范,才能良好的实现日志搜集、数据分拣、数据分析等特性。     制定日志格式规范的方式与目的:    1)所有项目,日志格式统一,可以极大的简化日志收集和分析的复杂度。    2)nginx、tomcat等日志格式,需要合理,让日志查...

2017-01-12 21:13:02 577

原创 JAVA执行Shell命令

    基于JAVA执行shell指令,通常的代码范例为:Process process = Runtime.getRuntime().exec("jps -v");BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));while (true) { ...

2017-01-11 23:34:10 330

原创 logback日志与MDC机制

    logback是个比较好用的java日志输出工具包,可配置型高,而且性能优秀。 一、Layout描述1、%logger{length}、%c{length}、%lo{length}:在日志事件的源点输出logger的名称,比如    1)LoggerFactory.getLogger(TestMain.class),此时%logger的值为“com.xxx.TestMa...

2016-12-16 14:48:42 6269

原创 《架构与未来》摘要(三)

《确立架构原则》(特别推荐)    1、目标和原则    目标树的主题是:在降低成本基础上创造更多的盈利机会和更大的收入。这一主题可以进一步分解为:质量(体现在错误率和故障级别、测试覆盖率等)、可用性(服务的可用时间,SLA)、成本(软硬件投入、团队规模等)、市场响应时间(体现在SLA、发布时效性、自动化水平)、效率(需求迭代与人员投入时间比、自动化水平等)    理想情况下,架构...

2016-12-13 16:43:37 122

原创 《架构与未来》摘要(二)

一、    管理和领导有许多区别,但两者都很重要。如果领导是承诺,那么管理就是行动。如果领导是目的地,那么管理就是方向。如果领导是激励,那么管理就是动机。如果领导是拉力,那么管理就是推力。     管理包括度量活动、目标评估、指标制订。    因此,在AKF我们实践了5-95规则:即用5%的时间制订一个充足、保守和详细的计划,同时承认这个计划不是完备的,把其余95%的时间投入到...

2016-12-12 22:04:05 89

原创 《架构与未来》摘要(一)

一、    根据我们的经验,与扩展性有关的事故也遵循着同一规律。首席技术官(CTO)或者负责系统平台扩展性的高管也许把扩展性当成一个纯技术性的计划。这种理解纯粹是人为的失败,也是错误链上的第一个失败点。因为CTO过于聚焦技术,所以他没能清楚地定义必要的流程,以确定扩展性的瓶颈,这事第二个失败点。因为没有人在架构上寻找和定位瓶颈点与堵塞处,所以当用户数或者交易笔数超过某个限额的时候,整个系统...

2016-12-07 15:05:03 72

原创 《架构漫谈》摘要

一、“Architecture is like teenage sex,everybody talks about it,nobody really knows what is it.”     “Architecture is both the process and the product of planning,designing,and constructing buildings...

2016-12-01 19:59:17 127

原创 《架构师》期刊摘要(2016年)三

一、我对架构师职责定义如下:    1)以工程思维全面理解业务需求    2)基于模型和基础模式抽象简化    3)提出恰当可行的整体解决方案    4)在限定资源范围完成明确目标    5)满足业务需求且保证系统质量        架构师的责任心很重要,因为架构方面工作往往处于重要但不紧急的尴尬境地,如果架构师在这方面自己不重视,那还怎么能做好呢?当然,要是只关注技...

2016-12-01 17:22:14 55

原创 《架构师》期刊摘要(2016年)二

一、    1、分层架构    分层架构是最常用的架构,也被称为n层架构;多年来,许多企业和公司都在他们的项目中使用这种架构,它已经几乎称为事实标准,因此被大多数架构师、开发者、软件设计者所熟知。    分层架构中的核心概念是管理依赖。如果我们使用依赖倒置原则和测试驱动开发(Test Driven Development),我们的架构会有更好的健壮性。因为,我们要保证所有可能的用例...

2016-11-28 12:54:41 168

原创 《架构师》期刊摘要(2016年)一

一、《软件设计精要与模式》作者张逸在接收InfoQ采访时曾说:“评价一个架构的优劣方法之一是,把每个功能、非功能的因素扩大化,再看这个架构会不会出问题。”(本人赞同此说法)他的观点是说,架构设计要面向业务未来,而未来是不断发展的。架构不仅要承载业务的增长,还要兼顾技术发展的趋势。《前言》(2016年6月) 二、我想任何人做架构多需要秉承“业务需求决定技术演化路线”的思路,那些暴露出...

2016-11-27 20:35:06 229

原创 Flume + kafka + HDFS构建日志采集系统

    Flume是一个非常优秀日志采集组件,类似于logstash,我们通常将Flume作为agent部署在application server上,用于收集本地的日志文件,并将日志转存到HDFS、kafka等数据平台中;关于Flume的原理和特性,我们稍后详解,本文只简述如何构建使用Flume + kafka + HDFS构建一套日志采集系统。    1)Flume:作为agent部署在...

2016-11-25 22:13:56 2916

原创 nginx线程池模式探讨

    nginx的IO模型其实大家应该有所了解,简单而言,就是一个master进程和多个worker进程(进程数由配置决定),master进程负责accept请求并队列化,最后转发给worker进程并由其进行处理请求和响应的整个过程。不过,这是进程层面,每个进程单线程处理。nginx在1.7.11版本提供了多线程特性(multi-threading),不过这个多线程仅用在aio模型(IO模型...

2016-11-12 17:23:22 863

原创 《架构师》期刊摘要(2015年)三

一、微服务解决我们哪些痛点呢?    1)技术架构、平台升级难:传统的单体式架构系统倾向于采用统一的技术平台或者方案解决所有的问题;而微服务的异构性,可以针对不同的业务特征选择不同的技术方案,有针对性的解决具体的业务问题。    对于单体式架构系统,初始的技术选型严格限制将来采用的不同语言或者框架的能力,没有完备的功能测试集,很难平滑的完成替换,而且系统规模越大,风险越高。基于微服务架...

2016-11-06 19:35:43 54

原创 《架构师》期刊摘要(2015年)二

一、一个优秀的设计过程或者方法论定义了一组一致的、可以重复的步骤,可以在将一个服务端服务组件输出为一个可访问的、有用的WEB API时使用。那就是说,一个清晰的方法论可以由开发人员、设计师和软件架构师共享,以便在整个实现周期内帮助大家协同活动。一个成熟的方法论还可以随着时间的发展,随着每个团队不断发现改善和精简过程的方式而得到精炼,却不会对实现细节产生不利的影响。    1、列出所有组成部...

2016-11-05 19:38:44 52

原创 《架构师》期刊摘要(2015年)一

一、架构应该是从简单到复杂,不断演变的一个过程。工程师思维驱动人们去开发一个理想化的系统。然而最好的架构却通常不是最理想的架构,而是最适合的架构。我们见过许多因为过度的架构设计而浪费宝贵的时间的案例,更有甚者因为过多不切实际的假想而导致架构迟迟无法落定,这种现象的术语描述,叫做“分析瘫痪”。    所以优秀的架构应该结合业务目标,在权衡之中寻求一个最优的点。 二、分布式系统在扩展性...

2016-11-04 15:01:12 112

原创 《架构师》期刊摘要(2014年)

1、WikiPedia上说“DevOps是软件开发、运维和质量保证三个部门之间的沟通、协作和集成所采用的流程、方法和体系的一个集合。它是人们为了及时生产软件产品或服务,以满足某个业务目标,对开发和运维之间相互依存关系的一种新的理解。”这恰好体现了精益管理中的客户价值原则,即:客户的关键来确定企业从设计到生产交付的全部过程,实现客户需求的最大满足。我们也可以把DevOps看作是一种能力,在缺乏这...

2016-10-26 11:33:34 82

原创 Maven+Nexus进行SCM发布

    对于java的一些公用依赖包,我们通常需要发布在私有的nexus平台中,以便其他项目组使用。    1)我们首先需要搭建自己的nexus平台。    2)用户授权,指定用户具有release权限。    3)调整maven中的setting.xml文件。    4)调整project中的pom.xml文件。 1、setting.xml配置样例: <...

2016-10-25 16:10:55 293

原创 nginx + tomcat实现请求链跟踪

    我们很多时候需要排查HTTP请求的问题,比如请求的响应延迟的原因、跟踪请求的转发链等,这个时候我们需要nginx和tomcat配合调整日志格式来实现。    1)在nginx层面,对所有的请求添加一个特殊的header,header的值为一个有意义的(或者无意义)的值,本例则在request转发给upstream server之前,添加一个“X-Request-Track-Seed...

2016-10-21 02:36:01 575

原创 nginx实现简单的A-B测试(灰度发布)

    灰度发布,现在是很多大项目的一个标配运维特性,我们可以将一个“新的版本代码”发布到集群中的少数几台(组)机器上,以便引入线上少量真实用户进行测试,用于验证产品改进的收益、小规模试错等。nginx提供了“nginx_http_split_clients_module”、“nginx_stream_split_clients_module”,分别适用于http和tcp,可以帮助我们简单实现...

2016-08-25 19:05:49 1976

原创 【转发摘要】微服务架构设计

    前言:本文摘自infoQ《架构师》期刊201606期中《谈谈后端业务系统的微服务化改造》一文,作者:张旭;与本文相关的文献包括:1)《微服务(翻译版)》2)《微服务(原文)》;非常感谢多位作者为我们提供如此优秀的文档! 1. 篇首语    业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心。例如,广告业务系...

2016-08-22 13:44:02 165

原创 JAVA WEB项目中开启流量控制Filter

    前言:流量控制,即Flow Control,主要是用来限定server所能承载的最大(高并发)流量峰值,以免在峰值是Server过载而宕机,对于WEB系统而言,通常是分布式部署,如果请求并发量很大,会导致整个集群崩溃,也就是通常所说的“雪崩效应”。所以,我们不仅在网络代理层面(比如nginx)设置流量控制以抵抗、拒止溢出流量,我们还应该在application server层面有一定的...

2016-08-02 16:09:07 760

原创 JDBC查询超时时间设置

    我们有时候需要控制SQL查询的最大耗时,比如一个“执行时长”的SQL在指定时间内如果没有执行完毕,我们需要“取消”此SQL,我们知道在JDBC中Statement类可以通过setQueryTimeout()来实现此特性。    当设置query timeout之后,JDBC客户端发送请求,并等待直到执行完成或者超时,当超时后,客户端尝试cancel当前SQL,要求mysql ser...

2016-07-28 14:48:23 4007

原创 几个JAVA常用的监控、调优工具

一、jps:JVM Process Status Tool,查看当前机器上所有JVM进程的状态和启动参数    命令格式:jps [options] [hostid]    我们可以通过“jps --help”来查看相关帮助。如下为允许使用的options:    1)-q:只列出JVM进程的id,不展示进程的其他信息。> jps -q -v2658226586...

2016-07-13 21:02:39 246

原创 Phaser功能简述

    在JAVA 1.7引入了一个新的并发API:Phaser,一个可重用的同步barrier。在此前,JAVA已经有CyclicBarrier、CountDownLatch这两种同步barrier,但是Phaser更加灵活,而且侧重于“重用”。一、简述    1、注册机制:与其他barrier不同的是,Phaser中的“注册的同步者(parties)”会随时间而变化,Phaser可...

2016-06-05 14:58:45 487

原创 Spring + JPA实现数据库读写分离

    SQL的读写分离方案,是一种通用的设计,通常可以较好的提升数据库集群的整体负载能力,当一个mysql实例无法支撑客户端的读写负载时,我们首先会想到对数据库进行“读写分离”    1)在数据库的架构层面,我们使用M-S架构模式,即一主多从,Master主要用于处理write、transaction等核心操作,这些操作必须发生在master上,否则将会导致数据一致性问题。对于slave...

2016-05-11 10:08:31 949

原创 Tomcat JNDI连接池配置

    对于线上应用,我们通常将数据库连接交给容器,比如tomcat容器,那么开发者只需要通过JNDI的方式获取dataSource即可,不需要再关注数据库地址、密码等敏感信息,这样我们就可以简单做到配置隔离。1)在tomcat的context.xml中增加如下配置: <Resource name="jdbc/localDB" factory="org.apa...

2016-04-29 11:36:29 231

原创 GRPC原理解析

    GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。GRPC与thrift、avro-rpc等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新。(如下描述,均基于JAVA语言的实现)    对于开发者而言:    1)需要使用protobuf定义接口,即.proto文件...

2016-04-27 18:35:40 4330

原创 Redis Cluster实现原理

一、Redis Cluster主要特性和设计    集群目标    1)高性能和线性扩展,最大可以支撑到1000个节点;Cluster架构中无Proxy层,Master与slave之间使用异步replication,且不存在操作的merge。(即操作不能跨多个nodes,不存在merge层)    2)一定程度上保证writes的安全性,需要客户端容忍一定程度的数据丢失:集群将会尽...

2016-04-04 22:06:26 367

原创 Redis Cluster实践

    Redis Cluster提供了在多个redis实例间数据自动分片(sharded)的特性,同时在partitions之间提供了一定程度的可用性保障,比如一些nodes失效时集群仍可以继续读写操作;不过当集群中较大规模的节点失效会导致集群停止服务,比如多数master失效(majority of masters)。在实用性方面,Redis Cluster能够做到:    1)在多个...

2016-03-21 22:42:05 153

原创 算法编程(五)

一、指定一个正序排列的数组和目标数字S,从数组中找到两个元素它们的和值为S(数字不重复,如果有多个,只需要得到一组即可)    题目很好理解,比如输入数组{1,3,4,6,8,11,20}和目标数字11,那么其中3、8的和值为11,找到它们即可。    这个题目最粗暴的解法就是逐个元素遍历数组,逐个相加...比如从1开始,让1与此后的每个元素相加并判断和值是否等于11,直到相等或者和值...

2016-03-17 22:29:14 38

原创 算法编程(四)

一、给定一个整数序列,请获取最小(最大)的K个数字    这个题还算比较熟悉,在大数据计算时,经常会遇到类似于“Top N”的情况,这个题的解法有很多种,本例还是采用惯例做法:创建一个K大小的容器,容器内的数字都是排序的;在遍历输入序列时,如果遇到比容器内最大值还要大的数字时,则将容器中的最小值移除,即容器中保留K个“已经遇见”的最大数字。在java中,我们直接使用TreeSet作为容器,当...

2016-03-17 18:01:15 26

原创 算法编程(三)

一、请使用栈,设计一个数据结构,它具有栈的“先进后出”的特性,同时还可以获取栈中的最小值,要求此数据结构的pop、push、min方法的复杂度均为O(1)    这个题,最大的问题就在min方法上,如果不使用其他的辅助数据结构,是无法满足min方法的设计要求,即使使用一个临时变量保存当前的最小值(这种情况下,如果最小是被pop,就断片了。。)。所以我们的注意力就集中在:怎们能让一个栈是有序...

2016-03-16 21:07:57 37

原创 算法编程(二)

一、用栈来实现队列的功能    描述:栈,stack,特点是先进后出;队列,queue,先进先出;请使用栈来实现队列的功能,且此队列具有两个基本操作--添加、删除。     这个题本身并不难,但是不能钻”牛角尖“;一个栈是无论如何也无法实现队列的,那么可以考虑用两个栈来试一试:    1)两个栈A、B,其中一个只能“添加”,另一个只能“删除”。    2)初始时,栈为空,如...

2016-03-15 21:51:41 42

原创 算法编程(一)

一、字符串转换成数字    设计要求:将输入的任意字符串,转换成数字(int类型),如果转换失败则抛出异常。    输入:"1234","+1234","-1234","1234567890","1234ab"    输出:1234,1234,-1234,异常,异常     思路:字符串有字符序列组成,每个字符都对应ASCII值,比如字符'0'为48,‘1’为49...'9...

2016-03-14 22:56:21 29

原创 Mysql Replication与Connector/J原理(四)

十九、Connector与Failover协议    Mysql Connector/J支持failover协议:即Client链接失效时,将会尝试与其他host建立链接,这个过程对application是透明的。Failover协议是“Multi-Host”链接模式中最基础的协议,“load balancing”、“replication”、“farbic”协议都基于Failover协议...

2016-01-23 16:11:00 608

原创 Mysql Replication运维与实施(三)

十三、Replication部署准备    我们在三台机器上构建Replication架构,使用MySQL 5.7.10:    1)三个mysql实例分别为“mysql-1”、“mysql-2”、“mysql-3”    2)IP分别为“192.168.1.100”、“192.168.1.101”、“192.168.1.102”,其中mysql-1为初始master。    ...

2016-01-23 15:51:02 54

原创 Mysql Replication配置项简述(二)

八、Replication主要配置项(配置文件)    1、log_bin:指定binlog文件的名称,同时也表示开启binlog功能,在replication模式下,master上必须开启log_bin,如果slave不需要failover,可以不开启。文件将会放置在“datadir”目录下。     2、binlog_checksum:是否开启binlog校验功能,在5.6.6...

2016-01-23 15:47:41 88

空空如也

空空如也

空空如也
提示
确定要删除当前文章?
取消 删除