- 博客(26)
- 收藏
- 关注
原创 HttpClient的SSL证书的相关问题及解决方案
问题描述访问某网站时服务器报出Algorithm constraints check failed on signature algorithm: MD2withRSA这是因为在进行SSL握手时,服务器所采用的ssl证书算法不符合某种约束条件而抛出异常! 问题分析:1. 查询网站证书信息openssl s_client -showcerts -connect hostname:443VeriSig...
2018-03-06 10:38:48 8136 5
原创 对日志规范的思考
概述 系统上线之后,一旦发生异常,第一件事就是要弄清楚当时发生了什么,用户当时做了什么操作,环境有无影响,数据有什么变化,是不是反复发生等,然后再进一步的确定大致是哪个方面的问题。这时,日志就给我们提供了第一手的资料。基本原则● 不影响系统正常运行;● 不允许产生安全问题;● 不允许输出机密信息;● 日志可供开发人员定位问题的真正原因;● 日志可供监控系统自动...
2018-09-16 18:37:51 4942 1
原创 SpringBoot之自定义Schema扩展
最近在写RPC框架时,用到了自定义的xsd配置。我们平时习惯于使用bean配置实例化对象,因此把xsd这种方式单独拎出来。1. 配置ServiceConfig属性,@Datapublic class ServiceConfig { /** 接口 */ private String interfaceClass; /** 引用 */ private St...
2018-07-19 16:09:32 3196
原创 JAVA SPI
概述SPI(Service Provider Interface),服务提供者接口,它是JDK提供的一种服务发现机制。目前在很多开源项目中使用,如common-logging,JDBC等。举个例子,我们在项目开发中经常会用到各种序列化,一般情况下,我们会定义好接口,再继承接口实现具体逻辑,如hession。如果一段时间后想替换成protobuffer,使用SPI机制,就可以通过配置文件可以...
2018-07-16 14:49:06 245
原创 利用Puppeteer实现验证码网站登录
Puppeteerpuppeteer是由Google官方推出的一个node库,可以启动Chromium浏览器模拟人为操作,类似于PhantomJS。登录
2018-06-19 13:00:53 9096 6
原创 基于Redis的分布式锁实现
本节基于Redis简单实现了分布式锁加锁/** * 加锁 * @param key * @param value * @param expire * @return */public boolean lock(String key, String value, int expire){ Jedis jedis = jedisPool.getResource(); tr...
2018-06-01 11:46:01 155
原创 Objenesis,另一种实例化对象的方式
简介Objenesis是一个Java的库,主要用来创建特定的对象。由于不是所有的类都有无参构造器又或者有的类构造器是private等,在这样的情况下,如果我们还想实例化对象,class.newInstance是无法满足的。使用public class Test { private int i; public Test(int i){ this.i = i; ...
2018-05-27 23:10:44 6103
原创 基于Redis的分布式限流实现
本节基于Redis实现了系统的限流控制。Lua脚本准备local val = redis.call('incr', KEYS[1])local ttl = redis.call('ttl', KEYS[1])redis.log(redis.LOG_NOTICE, "incr "..KEYS[1].." "..val);if val == 1 then redis.call('exp...
2018-05-18 11:21:21 3402 3
原创 基于数据库乐观锁的防超卖控制
假设上层缓存已经做了限流。那么需要在一个事务中完成查库存,扣库存,创建订单的操作。借助数据库乐观锁机制可以轻松完成。@Service@Transactional(rollbackFor = Exception.class)public class ShopOrderServiceImpl implements ShopOrderService { @Autowired priv...
2018-05-18 10:31:34 1744
原创 Netty之Reactor模型
Reactor单线程模型所有的I/O操作都由同一个线程完成。接收对端的请求或向对端发送请求消息。这种模式使用非阻塞I/O,在并发场景小的时候可以适用,但是对于高并发场景不合适。如果单线程出现死循环,那么整个通信将不可用。Reactor多线程模型有一个Acceptor线程专门用于接收客户端的连接,接收到请求后将请求分发到后端线程池,消息的读取,编解码和发送都由这个线程池完成。这种模式可以满足大部分应...
2018-05-14 16:44:45 669
原创 Netty源码分析-客户端启动流程
上接Netty源码分析之服务端启动流程,本节看下客户端启动的流程。public class Client { private static final Logger LOGGER = LoggerFactory.getLogger(Client.class); private static String host = "127.0.0.1"; private static ...
2018-05-14 14:11:05 219
原创 Netty源码分析-服务端启动流程
接上一节NioEventLoopGroup初始化,本节分析服务端启动的流程。//配置服务端的NIO线程组EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workGroup = new NioEventLoopGroup();try { ServerBootstrap bootstrap = new S...
2018-05-11 19:58:58 272
原创 Netty源码分析-NioEventLoopGroup初始化
public class GateServer{ private static int port = 9090; public static void main(String[] args) { //配置服务端的NIO线程组 EventLoopGroup bossGroup = new NioEventLoopGroup(); Ev...
2018-05-10 11:40:26 269
原创 Java NIO
NIO通信模型JDK1.4引入,目的是让Java支持非阻塞I/O。与Socket和ServerSocket相对应,NIO提供了SocketChannel和ServerSocketChannel两种套接字通道实现,并且支持阻塞和非阻塞两种模式。下面介绍NIO的一些概念和功能。1. 缓冲区BufferBuffer是一个对象,任何时候访问NIO中的数据,都要通过缓冲区进行操作,它包含了一些要写入或要读出...
2018-05-08 18:27:17 146
原创 Java BIO
BIO通信模型 BIO通信服务端,通常有一个独立的Acceptor线程负责监听客户端的连接。接收到客户端连接请求后会为每个客户端创建一个新的线程进行链路处理,处理完成后返回应答给客户端,也就是经典的请求-应答通信模型。但是随着客户端并发量上升,服务端的线程数膨胀,系统性能急剧下降,最终会导致系统不可用。Server端代码:import java.io.IOException;impor...
2018-05-08 11:21:52 1020
原创 五种网络I/O模型
UNIX提供了5种I/O模型分类:1. 阻塞I/O模型 最常用的模型就是阻塞I/O模型,默认情况下,所有文件的操作都是阻塞的。应用进程调用recvfrom获取数据,系统调用直到数据包被复制到用户进程的缓冲区或发生错误时返回。从调用recvfrom到系统返回的整段时间内,应用进程都是被阻塞的,因此被称为阻塞I/O模型。2. 非阻塞I/O模型 应用进程调用recvfrom获取数据,...
2018-05-07 16:02:04 863
原创 JAVA设计模式-模版模式
概念定义一个操作的算法流程,共性部分封装到父类,个性部分抽象,由子类自定义实现。使得子类在不改变算法结构的前提下重新定义某些步骤的实现。抽象类(AbstractClass):定义了算法的骨架。具体类(ConcreteClass):实现抽象类中的抽象方法,完成整体流程。例子:餐厅点餐,需要经历排队,点餐以及吃饭的过程,排队和吃饭共性部分封装到AbsOrder类,但是每个人点餐的食物是不一样的,可以将...
2018-04-13 10:37:40 120
原创 JAVA设计模式-策略模式
概念在策略模式中,创建表示策略的对象Strategy和一个行为随着策略对象改变而改变的Context 对象。Context:持有抽象策略接口的引用Strategy:定义了算法的公共接口ConcreteStrategy:定义具体的算法例子:模拟一个超市商品打折活动的场景,定义抽象的策略接口public interface CashSuper { double getCash(double p...
2018-04-11 16:10:37 119
原创 JAVA设计模式-外观模式
概念外观模式对外隐藏了系统的复杂性,向客户端提供了统一的访问接口,使得系统更易于被使用。门面(Facade Class):客户端调用门面类方法。门面类了解一个或多个子系统的功能和责任,将请求委派到相应的子系统去。子系统(SubSystem Classes):每个子系统都不是一个单独的类,可以是一个类、一个功能模块或者一个完整的系统。子系统并不知道门面的存在,对于子系统而言,门面仅仅是一个客户端而已...
2018-04-11 12:05:49 122
原创 Spring Boot之线程池
在写框架的时候需要用到线程池,记录下使用方式ExecutePool配置,开启@EnableAsync支持异步任务@Configuration@EnableAsyncpublic class ExecutorPool { private int corePoolSize = 10; private int maxPoolSize = 50; private int q...
2018-03-30 17:03:30 1065 1
原创 基于数据库悲观锁的幂等性控制
分布式环境下,各个服务经常需要互相调用,如何保证调用的任务只被执行一次?本章基于数据的悲观锁,实现了任务的幂等性控制。幂等性:多次执行所产生的影响均与一次执行的影响相同。比如在一次支付场景中,无论你点击多少次按钮,最终都应该只有一次扣款行为。1. 根据全局业务流水号businessId查询数据库记录IdempotentTask taskResult = idempotentTaskMapper.s...
2018-03-23 18:18:10 833
原创 HttpClient的入门使用
本章使用HttpClient4.5.5完成访问定点网站的简单的功能。pom文件:<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.5<...
2018-03-21 17:54:06 347
原创 Spring Boot之动态数据源配置二
AbstractRoutingDataSource动态路由方式:利用AbstractRoutingDataSource实现动态切换数据源的功能<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www...
2018-03-12 20:11:51 805
原创 Spring Boot之动态数据源配置一
Template配置方式:配置application.properties#主数据源spring.datasource.primary.url=jdbc:mysql://localhost:3306/testspring.datasource.primary.username=testspring.datasource.primary.password=testspring.datasou...
2018-03-12 14:50:33 227
原创 Groovy的类加载机制
Java的双亲委派模型:Java的ClassLoader除了Bootstrap ClassLoader外,每个ClassLoader都有一个parent的ClassLoader,沿着parent最终会追索到Bootstrap ClassLoader;当一个ClassLoader要加载一个类时,会首先委派给parent,如果parent能载入这个类,则返回,否则这个ClassLoader才会尝试去载...
2018-03-08 20:26:55 5606
原创 Java Concurrentmodificationexception异常原因和解决方法
问题: 在对集合迭代的时候,如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常; 原因分析:进入报错信息,定位LinkedHashMap719行,modCount != expectedModCount 抛异常。modCount是HashMap类中的一个成员变量,表示对Map的修改次数,每次调用put()方法或者remove()方...
2018-03-06 10:20:58 1130
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人