Java语言
文章平均质量分 88
叉叉哥
这个作者很懒,什么都没留下…
展开
-
Java 中的加密算法: AES
加密算法加密算法通常分为对称加密算法和非对称加密算法:对称加密算法(symmetric-key cryptography):加密和解密时使用相同的密钥。常用的对称加密算法有 DES、AES。非对称加密算法(asymmetric-key cryptography):加密和解密使用不同的密钥,例如公钥加密的内容只能用私钥解密,所以又称为公钥加密算法(public-key cryptography)。使用最广泛的非对称加密算法是 RSA 算法。两者有不同的使用场景,而且经常会一起搭配起来使用,例如 S原创 2021-08-07 17:48:36 · 873 阅读 · 0 评论 -
Java try-with-resources 中的细节
在 Java 7 之前,程序中如果有需要关闭的资源,例如 java.io.InputStream、java.sql.Connection 等,通常会在 finally 中关闭,例如:InputStream inputStream = null;try { inputStream = new FileInputStream("/my/file"); // ...} catch (Exception e) { e.printStackTrace();} finally {原创 2020-07-29 14:52:27 · 635 阅读 · 0 评论 -
Java 8 Stream 总结
Stream 简介Stream 是什么Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections.Stream 是 Java 8 新特性,可对 Stream 中元素进行函数式编程操作,例如 map-reduc...原创 2020-04-24 11:00:26 · 510 阅读 · 0 评论 -
Java 8 函数式编程:Lambda 表达式和方法引用
背景在很多其他语言中,函数是一等公民。例如 JavaScript 中,函数(Function)和字符串(String)、数字(Number)、对象(Object)等一样是一种数据类型。可以这样定义函数:var myFunction = function () { doSomething();};也可以将函数作为参数:setTimeout(function() { do...原创 2020-04-23 18:19:17 · 2345 阅读 · 0 评论 -
Zipkin架构
代码埋点 instrumentation:BraveJava 可以通过 Brave 来埋点:https://github.com/openzipkin/brave实现在各种开源组件(例如 HTTP Client、JDBC Driver、Dubbo 等)的埋点(instrumentation)上报例如有:brave-instrumentation-spring-webmvc Spri...原创 2020-03-26 15:24:03 · 857 阅读 · 0 评论 -
Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署
问题互联网产品高速迭代,通常伴随着高频次的版本发布。部署新版上线需要重启服务,直接 kill 服务进程可能会造成服务短暂不可用,从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡,那么是不是只要保证每个服务部署多台服务器,发布时采用 Rolling Update 分批次部署,保证一部分服务器正常提供服务的同时发布另一部分服务器,Ribbon 就能自...原创 2020-03-25 11:55:17 · 3220 阅读 · 2 评论 -
Spring Data Redis 如何将 RedisTemplate 注入为 ListOperations 类型
问题在 Spring Data Redis 官方文档中,可以看到这样一个常规用法:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst...原创 2020-03-12 18:04:25 · 1594 阅读 · 0 评论 -
Spring Session + Redis实现分布式Session共享
通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?实际上实现Sessi原创 2016-09-30 00:10:25 · 75346 阅读 · 31 评论 -
MINA、Netty、Twisted一起学(十二):HTTPS
由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成。HTTPS介绍上一篇博文中介绍了SSL/TLS协议,我们平时接触最多的SSL/TLS协议的应用就是HTTPS协议了,现在可以看到越来越多的网站已经是https开头了,百度搜索也由曾经的http改为https。有关百度为什么升原创 2017-02-28 12:33:18 · 2866 阅读 · 0 评论 -
MINA、Netty、Twisted一起学(十一):SSL/TLS
什么是SSL/TLS不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。SSL/TLS协议就是为了解决这些安全问题而设计的。SSL/TLS协议位于TCP/IP协议之上,各个应用层协议之下,使网络传输的内容通过加密算法加密,并且只有服务器和客户端可以加密解密,中间人即使抓到数据包也无法解密获取传输的内容,从而避免安全问题。例如广泛使用的HTTPS原创 2017-02-27 15:49:44 · 1826 阅读 · 1 评论 -
Mina、Netty、Twisted一起学(十):线程模型
要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要。MINA、Netty、Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器。但是如果不了解它们的线程模型,就很难写出高性能的代码。框架本身效率再高,程序写的太差,那么服务器整体的性能也不会太高。就像一个电脑,CPU再好,内存小硬盘慢散热差,整体的性能也不会太高。玩过Android开发的同学会原创 2014-10-16 13:14:01 · 5354 阅读 · 11 评论 -
Mina、Netty、Twisted一起学(四):定制自己的协议
在前面的博文中,介绍一些消息分割的方案,以及MINA、Netty、Twisted针对这些方案提供的相关API。例如MINA的TextLineCodecFactory、PrefixedStringCodecFactory,Netty的LineBasedFrameDecoder、LengthFieldBasedFrameDecoder,Twisted的LineOnlyReceiver、Int32StringReceiver。除了这些方案,还有很多其他方案,当然也可以自己定义。在这里,我们定制一个自己的方案,并原创 2014-08-25 13:03:48 · 4274 阅读 · 0 评论 -
Maven仓库搭建(二):GitHub、又拍云、七牛云存储
在上一篇博文中,主要介绍了Maven仓库搭建原理,除了Nexus外,随意使用一个HTTP服务器,例如Tomcat或Nginx,都可搭建一个自己的Maven仓库。无论是用Nexus还是HTTP服务器搭建Maven仓库,总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus一般是公司用的比较多,个人不推荐使用。本文就是介绍一些适合个人搭建Maven仓库的方式,相对来说比Nexus更原创 2016-09-23 17:03:13 · 3096 阅读 · 0 评论 -
云存储Java客户端上传文件
什么是云存储准确来说应该称为对象存储。云存储是比较流行的一种云服务,提供图片、视频等文件的存储服务。具有代表性的产品有:七牛云、阿里云对象存储OSS、又拍云、腾讯云对象存储服务COS。云存储能做什么打个比方,文件上传这种需求在开发中会经常遇到,例如开发一个BBS,用户会在帖子中插入图片、用户上传头像、上传视频、上传附件等。碰到此类需求,传统的做法是自备服务器和存储,将上传的文件存入自己的存储上,再来原创 2016-09-20 14:17:02 · 6646 阅读 · 3 评论 -
Maven仓库搭建(一):一台HTTP服务器即可(Tomcat、Apache或Nginx)
作为一个Java老程序员,多多少少都会有一些自己写的各种常用代码,如果每写一个项目都把这些代码拷贝一份到新项目比较麻烦的,打成jar包引入到项目会方便很多。如果想让这些jar包能通过Maven引入进项目,那就需要搭建Maven仓库。说到Maven仓库搭建,很多人第一想到的一般都是Nexus。Nexus的确是非常好的方案,但是总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus原创 2016-09-22 18:22:20 · 17080 阅读 · 1 评论 -
MyBatis Generator实现MySQL分页插件
MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求。但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能。本文介绍如何让MyBatis Generator生成的代码具有分页功能。MyBatis Generator结合Maven的配置和使用在实现分页之前,首先简单介绍MyBatis Generator如何使用。MyBatis Ge原创 2016-05-06 18:16:17 · 29332 阅读 · 7 评论 -
Maven profile结合Maven AntRun Plugin实现不同环境配置文件分离打包
在Java项目中通常会有各种配置文件,例如有xml、properties。在不同的环境下配置文件的内容可能会不一样,例如正式环境、测试环境、开发环境连的不是同一个数据库,访问的接口不一样,或者日志的级别不同。如果每次部署不同环境时都要改配置文件的各种配置是非常麻烦的。在这种情况下,可以将这些配置文为每个环境复制一个,分别配置不同的内容,打包部署时不同环境的包中打入对应的配置文件。原创 2016-05-05 23:56:41 · 13484 阅读 · 1 评论 -
使用Tomcat实现基于iframe streaming的Comet聊天室
这是一个基于Comet实现的聊天室Demo,功能类似于QQ群聊。聊天过程中如果有新想消息,那么就需要服务器推送消息到浏览器,所以这里可以使用Comet技术。Comet一般有两种实现方式:长轮询(long-polling)、流(streaming)。而本文中的这个Demo的实现方式是基于流(streaming),前端使用了一个隐藏的iframe,这也是比较常用的一种方式。不过由于使用iframe流,导致浏览器上面的进度一直在转,这是因为iframe一直在加载的原因,先不要在意这些细节。Tomcat提供了C原创 2014-08-11 09:48:25 · 5517 阅读 · 35 评论 -
Java线程池详解:ThreadPoolExecutor、Executors
在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能。Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExecutorThreadPoolExecutor是线程池的核心类。首先看一下如何创建一个ThreadPoolExecutor。下面是ThreadPoolExecutor常用的一个构造方法:ThreadPo原创 2016-04-05 14:04:29 · 15703 阅读 · 5 评论 -
Mina、Netty、Twisted一起学(九):异步IO和回调函数
用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax、jQuery的动画等。在异步网络编程中,由于IO操作是异步的,也就是一个IO操作不会阻塞去等待操作结果,程序就会继续向下执行。在MINA、Netty、Twisted中,很多网络IO操作都是异步的,比如向网络的另一端write写数据、客户端连接服务器的connect操作等。例如Netty的write方法(以及writeAndFlush方法),执行完write语句后并不表示数据已原创 2014-10-12 16:59:04 · 5523 阅读 · 0 评论 -
Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输。HTTP协议也是基于TCP协议,所以也有服务器和客户端。HTTP客户端一般是浏览器,当然还有可能是其他东西。HTTP服务器,也就是Web服务器,目前已经有很多成熟的产品,例如Apache HTTP Server、Tomcat、Nginx、IIS等。本文的内容不是讲解如何使用以上的HTTP服务器,而是原创 2014-09-23 17:32:27 · 6541 阅读 · 4 评论 -
Mina、Netty、Twisted一起学(七):发布/订阅(Publish/Subscribe)
消息传递有很多种方式,请求/响应(Request/Reply)是最常用的。在前面的博文的例子中,很多都是采用请求/响应的方式,当服务器接收到消息后,会立即write回写一条消息到客户端。HTTP协议也是基于请求/响应的方式。但是请求/响应并不能满足所有的消息传递的需求,有些需求可能需要服务端主动推送消息到客户端,而不是被动的等待请求后再给出响应。发布/订阅(Publish/Subscribe)是一原创 2014-09-19 13:35:25 · 4997 阅读 · 0 评论 -
Maven profile整合Spring profile
在Maven和Spring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。两者一个是Maven编译和打包时生效,另一个是运行时生效,默认是没有关联的,本文会...原创 2019-03-05 16:52:00 · 2421 阅读 · 0 评论 -
Apache Commons DbUtils整合Spring框架实现简单的CRUD
Commons DbUtils是Apache提供的一个对JDBC进行简单封装的开源工具类库,能够简化JDBC相关的开发。Commons DbUtils可以非常方便的整合Spring Framework,比较轻量级,执行SQL语句非常方便(特别是查询语句),可以代替Spring JdbcTemplate、MyBatis等数据库访问层技术。配置DbUtils通过QueryRunner类来执行S...原创 2018-08-31 15:43:52 · 2147 阅读 · 2 评论 -
去除Spring Security认证:Pre-Authentication配置
Spring Security官方文档对Pre-Authentication是这样解释的: There are situations where you want to use Spring Security for authorization, but the user has already been reliably authenticated by some external sy...原创 2018-05-27 22:51:25 · 12071 阅读 · 0 评论 -
ActiveMQ整合Spring JMS
JMS即Java消息服务(Java Message Service),是Java平台上的一套关于消息中间件的规范,或者说是一套统一的API。支持JMS的消息中间件有很多,ActiveMQ算是其中最常用的一个。JMS两种模型JMS支持以下两种模型,本文将会对这两种模型分别介绍如何整合Spring: - 点对点(Point-to-Point),对应的destination是Queue ...原创 2018-05-13 00:01:25 · 597 阅读 · 0 评论 -
开源异常管理平台JCatch
Githubhttps://github.com/wucao/JCatch什么是JCatch当程序发生异常(Exception), 处理方式一般是通过日志文件记录下来, 这种方式很容易被忽略, 而且查询起来比较麻烦.JCatch提供了一种方案, 当程序发生异常时, 通过JCatch平台接口提交到JCatch平台, 由JCatch平台统一管理所有异常, 这样可以方便查询, 并且JCatch平台提供异常原创 2017-11-17 11:11:32 · 1899 阅读 · 1 评论 -
Mina、Netty、Twisted一起学(二):TCP消息边界问题及按行分割消息
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总是按照剧本来走。原创 2014-08-21 13:51:42 · 5054 阅读 · 0 评论 -
Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
MINA、Netty、Twisted为什么放在一起学习?它们的共同特点:event-driven以及asynchronous。它们都是事件驱动、异步的网络编程框架。由此可见,它们之间的共同点还是很明显的。所以我这里将这三个框架放在一起,实现相同的功能,不但可以用少量的精力学三样东西,而且还可以对它们之间进行各方面的对比。原创 2014-08-15 10:53:19 · 9599 阅读 · 0 评论 -
Mina、Netty、Twisted一起学(三):TCP消息固定大小的前缀(Header)
在上一篇博文中,有介绍到用换行符分割消息的方法。但是这种方法有个小问题,如果消息中本身就包含换行符,那将会将这条消息分割成两条,结果就不对了。本文介绍另外一种消息分割方式,即上一篇博文中讲的第2条:use a fixed length header that indicates the length of the body,用一个固定字节数的Header前缀来指定Body的字节数,以此来分割消息。原创 2014-08-22 10:41:48 · 4266 阅读 · 1 评论 -
Mina、Netty、Twisted一起学(五):整合protobuf
protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化、反序列化),一般应用于网络传输,可支持多种编程语言。protobuf如何使用这里不再介绍,本文主要介绍在MINA、Netty、Twisted中如何使用protobuf,不了解protobuf的同学可以去参考我的另一篇博文。在前面的一篇博文中,有介绍到一种用一个固定为4字节的前缀Header来原创 2014-08-27 09:25:41 · 6865 阅读 · 0 评论 -
Mina、Netty、Twisted一起学(六):session
在同步阻塞的网络编程中,代码都是按照TCP操作顺序编写的,即创建连接、多次读写、关闭连接,这样很容易判断这一系列操作是否是同一个连接。而在事件驱动的异步网络编程框架中,IO操作都会触发一个事件调用相应的事件函数,例如接收到客户端的新数据,会调用messageReceived(MINA)、channelRead(Netty)、dataReceived(Twisted),同一个TCP连接的多次请求和多个客户端请求都是一样的。那么如何判断多次请求到底是不是同一个TCP连接,如何保存连接相关的信息?针对这个问题,原创 2014-09-10 13:51:18 · 6333 阅读 · 2 评论 -
如何线程安全地遍历List:Vector、CopyOnWriteArrayList
遍历List的多种方式在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式。方式一:for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i));}方式二:Iterator iterator = list.iterator();while(iterator.hasNext()) {原创 2016-04-03 19:18:24 · 11909 阅读 · 2 评论 -
Java用WebSocket + tail命令实现Web实时日志
在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者taif命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器。所以这里使用的是HTML5的WebSock原创 2015-11-25 19:59:42 · 29413 阅读 · 86 评论 -
Java解析魔兽争霸3录像W3G文件(一):Header
魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。魔兽争霸的录像大家都知道,是用来回放的,文件后缀名是.w3g,保存在魔兽争霸下的REPLAY目录下。现在很多软件可以分析魔兽争霸录像,直接可以查看录像的玩家、地图,以及玩家的APM等信息。最近在YY对战平台打魔原创 2014-01-05 13:39:22 · 8800 阅读 · 2 评论 -
Java解析魔兽争霸3录像W3G文件(二):压缩数据块解压合并
魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。在上一篇博文中,分析了魔兽争霸3录像W3G文件的Header部分的解析。Header部分占文件的前68个字节,紧接着Header之后,也就是从68字节之后,就是多个压缩数据块。压缩数据块的个数保存在Header中,原创 2014-01-08 10:29:39 · 3553 阅读 · 0 评论 -
Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的。例如,第一次请求时已经登录了,第二次再请求服务器会“忘了”你已经登录过。为了解决这个问题,就有了Cookie和Session。它们的出现是为了让服务器“记住”之前这个客户端的一些数据,让HTTP保持状态。下面通过Java Socket实现的HTTP客户端来理解二者之间的原理,以及它们的区别和联系。原创 2013-12-13 10:52:12 · 9031 阅读 · 1 评论 -
Java Socket实现HTTP客户端来理解Redirect和Forward区别
在JSP/Servlet开发中,经常会有页面跳转。而常用的两种方式,一种是Forward(转发),还有一种是Redirect(重定向)。两者也有很多不同点。两种方式的区别不再多说,本文重点是两者的原理、实现方式的区别。原创 2013-12-05 11:37:48 · 4343 阅读 · 0 评论 -
Java自己实现HTTP服务器来理解GET和POST区别
GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上;POST可以比GET请求更大的数据…一般的回答都是这样。但是作为一个高端大气上档次的程序员,这样回答就弱爆了。为了搞清楚GET和POST的区别,下面写了一个Java程序来接收HTTP请求。原创 2013-11-27 10:50:26 · 9313 阅读 · 9 评论 -
PostgreSQL:Java使用CopyManager实现客户端文件COPY导入
在MySQL中,可以使用LOAD DATA INFILE和LOAD DATA LOCAL INFILE两种方式导入文本文件中的数据到数据库表中,速度非常快。其中LOAD DATA INFILE使用的文件要位于MySQL所在服务器上,LOAD DATA LOCAL INFILE则使用的是客户端的文件。在PostgreSQL中也可以导入相同类型的文本文件,使用的是COPY命令。但是这个语句只能导入PostgreSQL所在服务器上的文件,要想导入客户端文件,就需要使用下面的语句:COPY table_name F原创 2013-09-27 13:38:50 · 13131 阅读 · 2 评论