- 博客(42)
- 收藏
- 关注
原创 阿里巴巴Java开发规约p3c插件扩展-自定义开发规范
前言工作中难免会遇到维护别人代码的情况,那么首先就得看懂别人写的代码。如果对方写的代码混乱臃肿,维护成本必然很高,如果对方写的代码优雅清晰,那维护的人看起来必然心情愉悦。正所谓“前人栽树,后人乘凉;前人埋坑,后人骂娘”。代码首先是给人看的,其次才是给机器看到,如何编写出任何人都看到懂的代码?答案是制定规范!每个公司都会有自己的编码规范,但是往往的情况是赶项目进度或者懒惰或者个人水平...
2018-01-29 09:26:13 6996 10
原创 Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现
1、前言Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,目前已经加入Spring Cloud项目,跟随Spring Cloud一起维护。集成Nacos需要使用Spring Cloud Alibaba Nacos模块。拓展阅读:Spring Cloud 加盟重量级成员Spring Cloud Alibaba,打造更符合中国国情的微服务体系2、启动naco...
2020-03-15 15:45:32 1192 1
原创 Nacos快速入门(二):Nacos集群安装部署
1、集群部署架构图官方提供了三种部署架构:http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式...
2020-03-15 15:43:11 5058
原创 Nacos快速入门(一):Nacos初探
1、简介Nacos官网:https://nacos.io/zh-cn/index.html1.1、概览Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。1.2、功能特性动态配置服务:动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用...
2020-03-15 15:41:13 12718 2
原创 Consul快速入门(三):Spring Cloud Consul实现服务注册与发现
1、前言本文通过创建provider-service、consumer-service两个微服务,并通过feign接口调用来演示Spring Cloud整合Consul。阅读本文需要前置知识:Spring BootSpring CloudSpring Cloud Feign2、搭建provider-service服务2.1、创建maven模块创建provider项目,添加prov...
2020-03-01 18:48:04 1372
原创 Consul快速入门(二):Consul集群安装部署
1、安装1.1、下载以linux下安装为例,首先下载安装包,下载地址:https://www.consul.io/downloads.html下载后上传到linux服务器,或者直接在linux上下载,版本可自行替换wget https://releases.hashicorp.com/consul/1.7.0/consul_1.7.0_linux_amd64.zip1.2、解压缩un...
2020-03-01 18:46:49 6517
原创 Consul快速入门(一):Consul初探
1、Consul是什么Consul官网:https://www.consul.io/Consul是HashiCorp公司推出的开源产品,用于实现分布式系统的服务发现、服务配置、服务隔离,这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。与其它分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Valu...
2020-03-01 18:44:42 1671 1
原创 分布式系统那些事-分布式ID生成策略
1.数据库自增ID的弊端暴露业务数据,比如用户表采用自增ID,别人可以根据ID知道系统有多少用户分库分表时无法保证ID唯一性2.需要什么样的ID生成策略全局唯一有序性高性能,生成ID时延低可扩展,支持数据库水平扩展安全性,不能暴露业务数据3.几种ID生成方案3.1.UUIDUUID(Universally Unique Identifier)的...
2018-07-19 13:59:05 1050
原创 分布式系统那些事-2PC和3PC协议
前言在分布式系统中,每个节点虽然都能明确知道自己事务操作结果是成功还是失败,但是无法直接获取到其他分布式节点的操作结果。因此,当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个称为“协调者(Coordinator)”的组件来统一调度所有的分布式节点的执行逻辑,这些被调度的节点称为“参与者(Participant)”。协调者负责调度参与者的行为,并最终决定...
2018-06-27 22:04:10 2423
原创 分布式系统那些事-CAP和BASE理论
CAP理论定义CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(Consistence) 每次读取到的数据都是最近一次写的数据,等同于所有节点访问同一份最新的数据副本。可用性(Availability)每次请求都能在一定时间内获取到非错的响应——但是不保证获取的...
2018-06-27 18:32:34 792
原创 Arrays.asList()的坑
异常代码ListInteger> list = Arrays.asList(1,2,3);list.add(4);list.remove(1);list.clear();运行这段代码,执行的三个方法都会抛异常:java.lang.UnsupportedOperationException原因分析跟踪源码,Arrays中asList实现: /**
2018-01-22 16:07:17 1043
原创 MySQL优化系列之查询优化
前言MySQL优化有两大层面,第一是数据库层面,第二是硬件层面。数据库层面可以细分为以下几个方面:数据库schema设计优化SQL查询优化锁策略优化存储引擎优化服务器配置优化主从,读写分离集群,负载均衡本文讲解SQL查询优化分析你的SQLExplain查看SQL执行计划Explain命令用来帮助我们获取Query的执行计划,用法很简单:在你的Query前
2017-09-14 16:12:21 1330
原创 MySQL优化系列之数据库schema设计优化
前言MySQL优化有两大层面,第一是数据库层面,第二是硬件层面。数据库层面可以细分为以下几个方面:数据库schema设计优化SQL查询优化锁策略优化存储引擎优化服务器配置优化主从,读写分离集群,负载均衡本文讲解数据库schema设计优化高效的模型设计适度冗余(反范式)在很多人眼里,数据库schema满足的范式级别越高越好,目的是尽量减少数据的冗余,保持数据一致。但是适当的冗余能减少多
2017-09-14 16:07:55 1188
原创 MySQL Replication主从复制搭建
MySQL安装环境版本:Linux:CentOS6.5MySQL:5.7.19IP:192.168.48.33(Master)、192.168.48.34(Slave)安装步骤:1.根据Linux版本下载RPMwget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm2.安装RPM yum install mysql-communi
2017-09-11 23:51:02 529
原创 MySQL Replication主从复制原理及拓扑结构
复制解决的问题1.备份容灾不同备库分布在不用的地理位置,物理隔绝,可以用来备份数据和容灾2.负载均衡复制可以将多个读操作分布到不用的备库服务器,实现对读密集型应用的优化3.高可用性能和故障切换复制能避免MySQL单点故障,某个节点发生宕机,可以快速记性故障切换,提高系统高可用性4.MySQL升级测试这种做法较普遍,使用一个更高版本的MySQL作为备库,保证在升级全部实例前,查询能正常在其他备库上进行
2017-09-11 23:04:24 823
原创 RabbitMQ消息监听异常问题探究
问题场景在使用Spring RabbitMQ做消息监听时,如果监听程序处理异常了,且未对异常进行捕获,会一直重复接收消息,然后一直抛异常。为了更好的描述问题,下面写个简单的例子。通过访问null对象来引发空指针异常,消息监听处理程序代码清单:package amqp;import org.springframework.amqp.core.Message;import org.springfram
2017-09-09 10:27:54 56806 4
原创 Spring整合Quartz浅析
Quartz概念基础Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。核心元素概念:Job: 是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMa
2017-08-15 21:19:44 2239
原创 Spring整合Redis之哨兵与故障转移
前言上篇博客谈到了Spring整合redis集群以及故障转移演示,会发现redis集群模式存在一个很明显的问题:当某个主节点及其所有从节点挂掉,整个集群因为缺少该节点负责范围的哈希槽(hash slot)而宕掉,不具高可用性。redis引入了哨兵(sentinel)模式,能很好解决集群模式存在的不足。引用官网,redis哨兵系统有三个作用: - 监控(Monitoring): Sentinel 会
2017-08-10 10:22:43 5322
原创 Spring整合Redis之集群与故障转移
前言本文主要讲解spring整合redis集群,关于redis集群搭建网上相关文章挺多的,大家可以自己先搭建好,可以参考官网或中文版官网。本文假设你已经搭建好集群了,笔者redis(版本4.0.1)集群环境如下图:7000、7001、7002三个主节点,7003、7004、7005三个从节点。Redis集群共有16384个哈希槽(hash slot)用于存放key,当前3个节点哈希槽分布为: -
2017-08-06 18:26:17 8384
原创 Spring整合RabbitMQ简介
AMQP简介AMQP(Advanced Message Queuing Protoco)高级消息队列协议,属于应用层协议。他有producer、exchange、binding、queue、consumer五种角色,producer将消息发送到exchange,bingding决定exchange的消息该发往哪个queue,consumer直接从queue中读取消息。exchange是AMQP协议的
2017-04-10 11:50:09 18511
原创 Spring整合MyBatis后引入自定义类型转化器TypeHandler
MyBatis预定义了许多类型转化器,并不一定能满足所有的需求,如笔者遇到这么个问题:数据库字段类型为datetime时间戳类型,项目组规定ResultMap映射实体时间必须是String类型,MyBatis自带的StringTypeHandler类型转化器转化后的时间字符串会有.0这个小尾巴,然后被测试MM提了BUG。常规的解决方式改下实体的get方法,截掉这个小尾巴就行了,但是笔者觉得不够优雅,
2017-03-27 08:52:08 4456
原创 IntelliJ IDEA远程调试
远程服务DEBUG模式启动 远程服务以debug模式启动需要执行java命令时带上以下JVM参数java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=naddress指定调试端口,可以按需更改。无论你的服务是普通的java进程,还是jetty、t
2016-12-12 15:46:05 27740 4
原创 MyBatis树形结构查询
前言 对于树形结构的数据库设计通常是基于继承关系设计的,也就是通过父ID关联来实现的,还有就是基于左右值编码设计。本文以继承关系设计的树形结构来讨论下MyBatis树形结构查询。以深度为二的树为例,要将这种结构的数据查询出来,通常的做法是先查询一级数据,再查询二级数据,然后在程序里组装起来,想了下,其实还可以更简单,不用分开两次,就能将不同级别数据一次性查询映射出来。 1.数据准备以区域表
2016-11-24 14:59:18 23551 14
原创 Maven插件之MyBatis Generator
MyBatis Generator(MBG)是MyBatis和iBATIS的逆向工程插件工具,可以根据表结构自动生成实体类、包含简单的CRUD操作的mapper映射文件和mapper接口,无需手工编码,非常的方便,具体用法只需以下三步。
2016-11-07 10:52:00 742
原创 Spring Retry实现原理
在前面这篇博客中介绍了Spring Retry的使用,本文通过一个简单的例子演示Spring Retry的实现原理,例子中定义的注解只包含重试次数属性,实际上Spring Retry中注解可设置属性要多的多,单纯为了讲解原理,所以弄简单点,关于Spring Retry可查阅相关文档、博客。注解定义package retry.annotation;import java.lang
2016-09-30 17:44:46 9822 3
原创 Bootstrap模态框使用WebUploader点击失效问题解决
JSP代码<%@ page contentType="text/html;charset=UTF-8" language="java" %><c:set var="ctx" value="${pageContext.request.contextPath}"/><html><head> <meta http-equiv="Content-Type" content="text/html
2016-09-29 10:43:55 10728 4
原创 jpinyin介绍
简介JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。github:https://github.com/stuxuhai/jpinyinmaven依赖<dependency> <groupId>com.github.stuxuhai</groupId> <artifactId>jpinyin</artifactId> <versi
2016-09-23 19:02:51 7438
原创 pinyin4j介绍
简介pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,核心API为PinyinHelper和HanyuPinyinOutputFormat官网: http://sourceforge.net/projects/pinyin4j github:https://github.com/belerweb/pinyin4jmaven依赖<dependency> <groupI
2016-09-23 19:01:14 1173
原创 Spring重试支持Spring Retry
第一步、引入maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.
2016-08-30 17:14:29 29565 15
原创 Spring任务调度Scheduling Tasks
注解方式第一步、创建maven工程,引入依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version></parent><dependencies>
2016-08-29 21:23:19 9740
原创 tomcat配置gzip压缩与解压缩
前言最近的做的项目中,遇到这么一个问题:服务器返回给客户端的xml报文数据量太大,费时耗流量,于是要求服务端添加gzip支持,现在把整个流程写下来,以供以后有需要是参考。gzip是一种文件压缩算法,http服务器端添加支持后,客户端请求时添加请求头信息Accept-Encoding:gzip即可享受服务端的gzip压缩服务,获取压缩后的数据,极大减小网络传输数据,提高响应速度和减少流量。当然,
2016-03-10 10:18:45 5564 1
原创 从一道题目验证Servlet单实例
1、题目在servlet的开发中,人们通常喜欢用StringBuffer对象来append日志,然后将日志打印出来。在走读某同事的代码时,发现其servlet代码是这么写的public class DoSomethingServlet extends HttpServlet { private static Logger logger = org.apache.log4j.Logger.
2016-01-16 17:28:58 1485
原创 伪造客户端IP实例
搭建WEB服务 创建一个web工程,编写一个简单的servlet获取客户端ip protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String clientIp = null; clientIp =
2015-12-10 15:22:14 7395
原创 Java泛型中<? extends E>和<? super E>的区别
在阅读JDK源码时经常看到这样的泛型声明和。他们有什么作用又有什么区别呢? 是 Upper Bound(上限) 的通配符,用来限制元素的类型的上限,比如List fruits;表示集合中的元素类型上限为Fruits类型,即只能是Fruit或者Fruit的子类,因此对于下面的赋值是合理的fruits = new ArrayList();fruits = new
2015-11-13 17:07:45 8615 2
原创 MongoDB批量操作及与MySQL效率对比
本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用。顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率。如果只是想学习bulkWrite()的使用的看第一部分就行。 测试环境:win7旗舰版、16G内存、i3处理器、MongoDB3.0.2、mysql5.0一、MongoDB批量操作 MongoDB对数
2015-10-23 20:49:23 21991 3
原创 Nginx+Tomcat实现负载均衡小demo
一、搭建Tomcat服务 下载安装JDK和Tomcat就不说了,太简单了。由于是win7单机环境测试,启动多个Tomcat服务可以通过在server.xml配置文件中修改端口实现。准备两个Tomcat,比如使用两个不同版本的Tomcat(相同版本可以更改下文件名或者放到不同目录下)1、创建项目在webapps目录下,创建一个文件夹,例如test,并在该文件夹下面创
2015-09-18 19:13:41 3408
转载 双重检查锁定与延迟初始化
在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:public class UnsafeLazyInitialization {private static Instance instance;
2015-09-11 16:17:26 473
原创 MongoDB入门学习笔记之mongo shell和java客户端
MongoDB提供Shell、Python、Java、Node.js、C++、C#等实现方式。本文介绍使用Shell和Java两种方式实现MongoDB的CRUD操作。首先需要导入数据,从官网下载测试数据,打开此页面:https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/dataset.json,创建一个文件,将页
2015-09-09 10:34:01 4487
原创 MongoDB入门学习笔记之简介与安装配置
一、MongoDB简介1、文档数据库 MongoDB是一款开源的文档型非关系数据库,具有高性能、高可靠性和自动扩展等特点。MongoDB中的每一条记录是一个文档,其数据结构为字段和值对,类似JSON对象。每个字段的值可以包含其他文档、数组、文档数组。如:使用文档的好处:在许多编程语言中文档(即对象)对应于本地数据类型内嵌的文档和数组减少对昂
2015-08-31 21:18:34 808 5
原创 邮件传输协议(SMTP/POP3)初探
1、邮件传输协议简介1.1、SMTP协议SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,属于TCP/IP协议簇。定义邮件发送的通讯规则,用于处理用户smtp请求,将邮件发送到SMTP服务器。1.2、POP3协议POP3(Post Office Protocol - Version 3)即邮局协议版本3,属于TCP/IP协议簇。定义邮件接
2015-08-26 12:03:30 2640
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人