自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

叉叉哥的BLOG

Python毁一生,Java穷三代,两者皆不沾,必成高富帅!

  • 博客(109)
  • 资源 (8)
  • 问答 (1)
  • 收藏
  • 关注

原创 软件架构中“弹性”的多种含义

在软件架构领域的中文文档、书籍中,经常可以看到“弹性”这个专业术语,但在不同的语境下含义可能会不同。在英语中,elastic 和 resilient 两个单词都可以翻译为“弹性的”,但是它们在软件架构中代表的含义却完全不同,需要避免混淆。

2023-02-21 21:31:22 507 1

原创 Java 获取本机的外网 IP

原理通过 HTTP 访问第三方获取 IP 的服务接口获取本机的外网 IP,例如:http://checkip.amazonaws.com/https://ipv4.icanhazip.com/http://bot.whatismyipaddress.com/等等…考虑到这些第三方接口不一定 100% 稳定,例如可能出现下线、错误、访问超时或太慢的情况,所以不能仅依赖其中之一。下面提供一种方案,并发访问这些服务接口,并返回第一个成功的结果,也就是其中最快的一个返回结果。实现import

2021-09-27 11:48:03 10034 1

原创 解决 Spring Boot 启动时 TypeNotPresentExceptionProxy / ArrayStoreException 异常

Spring Boot 启动时异常:Initialization of bean failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy这类异常的信息一般很难直接看出来是什么原因引起的。如果深入调试的话会发现是由 NoClassDefFoundError 引起的,而这个错误被隐藏掉了,所以难以排查。下面直接说调试方法:在 sun.ref

2021-09-17 11:52:26 4335

原创 Java 中的加密算法: AES

加密算法加密算法通常分为对称加密算法和非对称加密算法:对称加密算法(symmetric-key cryptography):加密和解密时使用相同的密钥。常用的对称加密算法有 DES、AES。非对称加密算法(asymmetric-key cryptography):加密和解密使用不同的密钥,例如公钥加密的内容只能用私钥解密,所以又称为公钥加密算法(public-key cryptography)。使用最广泛的非对称加密算法是 RSA 算法。两者有不同的使用场景,而且经常会一起搭配起来使用,例如 S

2021-08-07 17:48:36 780

原创 Prometheus 导致 Jaeger API 请求超时 timeout 的故障

问题背景使用 Jaeger 的 9411 端口(用于兼容 Zipkin 的端口)提交调用链的 span 信息,Jaeger 服务运行一段时候后,9411 端口上的请求就会全部超时,必须重启后才能恢复。同样的问题后来我也尝试了其他端口,也有同样的问题。版本Jaeger 1.22产生原因查看日志发现有来源下面路径的请求:/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%A

2021-04-18 15:33:38 951

原创 Docker 运行 Jaeger 指定 Elasticsearch 索引前缀

docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -e SPAN_STORAGE_TYPE=elasticsearch \ -e ES_SERVER_URLS=http://xxx.xxx.xxx.xxx:9200 \ -e ES_INDEX_PREFIX=production \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \

2021-04-17 01:57:18 729

原创 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 563

原创 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 470

原创 Java 8 函数式编程:Lambda 表达式和方法引用

背景在很多其他语言中,函数是一等公民。例如 JavaScript 中,函数(Function)和字符串(String)、数字(Number)、对象(Object)等一样是一种数据类型。可以这样定义函数:var myFunction = function () { doSomething();};也可以将函数作为参数:setTimeout(function() { do...

2020-04-23 18:19:17 2292

原创 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 788

原创 Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

问题互联网产品高速迭代,通常伴随着高频次的版本发布。部署新版上线需要重启服务,直接 kill 服务进程可能会造成服务短暂不可用,从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡,那么是不是只要保证每个服务部署多台服务器,发布时采用 Rolling Update 分批次部署,保证一部分服务器正常提供服务的同时发布另一部分服务器,Ribbon 就能自...

2020-03-25 11:55:17 2952 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 1556

原创 Nginx proxy_pass 后缀规则

proxy_pass 规则Note that in the first example above, the address of the proxied server is followed by a URI, /link/. If the URI is specified along with the address, it replaces the part of the request...

2019-10-23 23:01:03 1751

原创 Nginx失败重试中的HTTP协议幂等问题: non_idempotent

Nginx通过反向代理做负载均衡时,如果被代理的其中一个服务发生错误或者超时的时候,通常希望Nginx自动重试其他的服务,从而实现服务的高可用性。实际上Nginx本身默认会有错误重试机制,并且可以通过proxy_next_upstream来自定义配置。如果不了解HTTP协议以及Nginx的机制,就可能在使用过程中遇到各种各样的坑。例如服务出现了错误或超时却未重试,或者一些例如创建订单或发送短信这...

2019-04-21 22:23:44 2287

原创 Maven profile整合Spring profile

在Maven和Spring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。两者一个是Maven编译和打包时生效,另一个是运行时生效,默认是没有关联的,本文会...

2019-03-05 16:52:00 2367

原创 利用X-Forwarded-For伪造客户端IP漏洞成因及防范

问题背景在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。如何获取客户端IP在Java中,获取客户端IP最直接的方式就是使用request.getRemoteAddr()。这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网Web应用很少会将应用服务器直接对外提...

2018-10-15 09:44:48 63447 8

原创 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 2087 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 11771

原创 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 560

原创 开源异常管理平台JCatch

Githubhttps://github.com/wucao/JCatch什么是JCatch当程序发生异常(Exception), 处理方式一般是通过日志文件记录下来, 这种方式很容易被忽略, 而且查询起来比较麻烦.JCatch提供了一种方案, 当程序发生异常时, 通过JCatch平台接口提交到JCatch平台, 由JCatch平台统一管理所有异常, 这样可以方便查询, 并且JCatch平台提供异常

2017-11-17 11:11:32 1841 1

原创 Jetty/Tomcat + Nginx反向代理获取客户端真实IP、域名、协议、端口

问题Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端浏览器地址栏上的真实域名、协议、端口。例如在某一台IP为10.4.64.22的服务器上,Jetty或者Tomcat端口号为

2017-06-26 11:32:58 8770 1

原创 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 2845

原创 MINA、Netty、Twisted一起学(十一):SSL/TLS

什么是SSL/TLS不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。SSL/TLS协议就是为了解决这些安全问题而设计的。SSL/TLS协议位于TCP/IP协议之上,各个应用层协议之下,使网络传输的内容通过加密算法加密,并且只有服务器和客户端可以加密解密,中间人即使抓到数据包也无法解密获取传输的内容,从而避免安全问题。例如广泛使用的HTTPS

2017-02-27 15:49:44 1779 1

原创 HTTPS配置入门:Nginx、Node.js配置HTTPS服务器

申请数字证书首先需要申请一个免费的数字证书,前提是有个域名,申请起来还是很方便的。例如可以在腾讯云申请:https://www.qcloud.com/product/ssl,具体申请步骤请参考腾讯云文档,本文不再详细介绍。当然还有收费的数字证书,土豪随意。数字证书申请成功后,下载下来,文件包含一个私钥(.key)和一个数字证书(.crt)。申请证书时需要制定域名,例如我自己的域名是gw2.vsgam

2017-02-22 17:47:26 7848

原创 Spring Session + Redis实现分布式Session共享

通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?实际上实现Sessi

2016-09-30 00:10:25 75271 31

原创 Maven仓库搭建(二):GitHub、又拍云、七牛云存储

在上一篇博文中,主要介绍了Maven仓库搭建原理,除了Nexus外,随意使用一个HTTP服务器,例如Tomcat或Nginx,都可搭建一个自己的Maven仓库。无论是用Nexus还是HTTP服务器搭建Maven仓库,总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus一般是公司用的比较多,个人不推荐使用。本文就是介绍一些适合个人搭建Maven仓库的方式,相对来说比Nexus更

2016-09-23 17:03:13 3056

原创 Maven仓库搭建(一):一台HTTP服务器即可(Tomcat、Apache或Nginx)

作为一个Java老程序员,多多少少都会有一些自己写的各种常用代码,如果每写一个项目都把这些代码拷贝一份到新项目比较麻烦的,打成jar包引入到项目会方便很多。如果想让这些jar包能通过Maven引入进项目,那就需要搭建Maven仓库。说到Maven仓库搭建,很多人第一想到的一般都是Nexus。Nexus的确是非常好的方案,但是总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus

2016-09-22 18:22:20 17010 1

原创 云存储Java客户端上传文件

什么是云存储准确来说应该称为对象存储。云存储是比较流行的一种云服务,提供图片、视频等文件的存储服务。具有代表性的产品有:七牛云、阿里云对象存储OSS、又拍云、腾讯云对象存储服务COS。云存储能做什么打个比方,文件上传这种需求在开发中会经常遇到,例如开发一个BBS,用户会在帖子中插入图片、用户上传头像、上传视频、上传附件等。碰到此类需求,传统的做法是自备服务器和存储,将上传的文件存入自己的存储上,再来

2016-09-20 14:17:02 6608 3

原创 MyBatis Generator实现MySQL分页插件

MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求。但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能。本文介绍如何让MyBatis Generator生成的代码具有分页功能。MyBatis Generator结合Maven的配置和使用在实现分页之前,首先简单介绍MyBatis Generator如何使用。MyBatis Ge

2016-05-06 18:16:17 29241 7

原创 Maven profile结合Maven AntRun Plugin实现不同环境配置文件分离打包

在Java项目中通常会有各种配置文件,例如有xml、properties。在不同的环境下配置文件的内容可能会不一样,例如正式环境、测试环境、开发环境连的不是同一个数据库,访问的接口不一样,或者日志的级别不同。如果每次部署不同环境时都要改配置文件的各种配置是非常麻烦的。在这种情况下,可以将这些配置文为每个环境复制一个,分别配置不同的内容,打包部署时不同环境的包中打入对应的配置文件。

2016-05-05 23:56:41 13448 1

原创 Java线程池详解:ThreadPoolExecutor、Executors

在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能。Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExecutorThreadPoolExecutor是线程池的核心类。首先看一下如何创建一个ThreadPoolExecutor。下面是ThreadPoolExecutor常用的一个构造方法:ThreadPo

2016-04-05 14:04:29 15592 5

原创 如何线程安全地遍历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 11844 2

原创 Async.js解决Node.js操作MySQL的回调大坑

由于JavaScript语言异步特性,在使用Node.js执行很多操作时都会使用到回调函数,其中就包括访问数据库。如果代码中的业务逻辑稍微复杂一点,回调一层层嵌套,那么代码很容易进入Callback Hell,无论对写代码的人还是阅读代码的人,都是精神上的折磨。

2015-12-22 12:39:27 13167 1

原创 Java用WebSocket + tail命令实现Web实时日志

在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者taif命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。基于Web的实时日志可以解决这个问题。由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,由服务器主动推送给客户端浏览器。所以这里使用的是HTML5的WebSock

2015-11-25 19:59:42 29224 86

原创 Maven插件wagon-maven-plugin自动化部署Java项目到Linux远程服务器

通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。实际上这些步骤都可以通过Maven的一个插件wagon-maven-plugin来自动完成。配置Linux服务器用户名和密码为了让wagon-maven-plugin插件能SSH连上Linux服务器,首先需要在Maven的配置文件settings.xml中配

2015-10-26 10:12:13 6432 3

原创 开源Java自动化部署平台JDeploy

JDeploy是Java + Shell实现的基于Linux系统的自动化、可视化的项目部署平台,能部署Java服务、Java Web项目,可以简化项目部署操作,无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。传统部署方式:从SVN/GIT服务器检出代码->在IDE中打包->将包传到服务器->SSH连上服务器->敲指令启动/停止JDeploy部署:创建项目->一键部署/启动/停止 * 检出代码

2015-10-20 11:07:04 15900 1

原创 Java开发Web Service客户端技巧:wsimport、jaxws-maven-plugin、整合Spring

搭建一个简单的Web Service服务器要想跑Web Service客户端,前提是要有个Web Service服务器。如果你已经有Web Service服务器,那么可以跳过这一步。如果没有,可以使用JAX-WS搭建一个简单的Web Service服务器。@WebServicepublic class HelloWorld { public String sayHello(String na

2015-10-18 12:22:51 4085

原创 Spring Security Web应用入门环境搭建

在使用Spring Security配置Web应用之前,首先要准备一个基于Maven的Spring框架创建的Web应用(Spring MVC不是必须的),本文的内容都是基于这个前提下的。pom.xml添加依赖:除了Spring框架本身的一些依赖包,还需要在pom.xml中添加Spring Security的依赖包: org.springframework.security spri

2015-09-06 11:08:35 4878 3

原创 Maven生成可以直接运行的jar包的多种方式

Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。要想jar包能直接通过java -jar xxx.jar运行,需要满足:1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;2、要能

2015-08-07 18:56:21 188563 27

原创 Servlet 3 + Spring MVC零配置:去除所有xml

在一些基于Spring/Spring MVC的Java Web项目中,总是会有一些xml配置文件,如web.xml、applicationContext.xml等,本文的目标即消灭这些xml配置文件,用代码和注解来代替。由于本文是基于Servlet 3,所以首先需要准备支持Servlet 3的容器,例如Tomcat 7.0及以上版本、Jetty 8及以上版本。1、去除web.xml下面是一个典型的

2015-07-08 14:38:41 18011 10

JDeploy自动化部署平台

JDeploy是Java + Shell实现的基于Linux系统的自动化、可视化的项目部署平台,能部署Java服务、Java Web项目,可以简化项目部署操作,无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。

2015-10-20

protobuf-2.5.0 jar包及代码生成工具

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。

2014-07-03

protobuf-2.5.0

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。 包含:protobuf-2.5.0.zip和protoc-2.5.0-win32.zip。

2014-07-03

六大UML类图关系

详细的接收java六大类UML类图的画法,请大家多多指教

2013-04-24

邮件系统javamail

基于javamail实现的邮件发送接收的系统javamail

2013-04-24

企业管理软件缩写

企业管理软件缩写,ERP,CRM,OA等缩写的解释。

2011-12-06

51单片机数字时钟—源程序+仿真电路(带闹钟)

51单片机数字钟课程设计(带闹钟,还有数字串在数码管上滚动显示的案例),C语言源程序+PROTEUS仿真电路图。

2011-04-25

JAVA+ACCESS学生成绩信息管理系统

JAVA+ACCESS学生成绩学籍信息管理系统

2011-01-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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