MapStruct 对象转换
前言随着微服务和分布式应用程序迅速占领开发领域,数据完整性和安全性比以往任何时候都更加重要。在这些松散耦合的系统之间,安全的通信渠道和有限的数据传输是最重要的。大多数时候,终端用户或服务不需要访问模型中的全部数据,而只需要访问某些特定的部分。
数据传输对象(Data Transfer Objects, DTO)经常被用于这些应用中。DTO 只是持有另一个对象中被请求的信息的对象。通常情况下,这些信息是有限的一部分。例如,在持久化层定义的实体和发往客户端的 DTO 之间经常会出现相互之间的转换。由于 DTO 是原始对象的反映,因此这些类之间的映射器在转换过程中扮演着关键角色。
这就是 MapStruct 解决的问题:手动创建 bean 映射器非常耗时。 但是该库可以自动生成 Bean 映射器类。
简介 MapStructMapStruct 是一个开源的基于 Java 的代码生成器,用于创建实现 Java Bean 之间转换的扩展映射器。使用 MapStruct,我们只需要创建接口,而该库会通过注解在编译过程中自动创建具体的映射实现,大大减少了通常需要手工编写的样板代码的数量。
MapSt ...
分析解析项目上内存泄漏、频繁GC、cpu飙升问题
问题背景我们的 Java 服务都是封装在 Docker 容器里运行的,今天早上到公司发现有个服务内存跑满,CPU 100%~500% 之间跳动,第一时间想到的是 dump 快照到本地进行分析。
这是本人首次在容器内分析线上问题,遇到几个坑,特此记录下来!
分析过程通过容器监控工具发现 A 容器内存和 CPU 占用都不正常:
Portainer | Docker 图形化管理工具
安装 Arthas本来选择使用 jvm 自带的分析工具进行内存分析,但是我们所有的 Java 服务镜像都是基于 anapsix/alpine-java:8_server-jre_unlimited 构建的,此镜像默认是没有 jvm 分析工具,故选择阿里的 Arthas 线上监控诊断产品进行分析:
12345BASH# 下载 arthas-boot 启动包curl -O https://arthas.aliyun.com/arthas-boot.jar# 直接启动(使用和目标进程一致的用户启动,否则可能 attach 失败)java -jar arthas-boot.jar
坑 1:提示无法找到可用的 ...
Markdown 基本语法
前言Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。
Markdown 能被使用来撰写电子书、博客等,当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息。例如:GitHub、简书、Gitee 等。
本站的所有文章也是通过 Markdown 语法来写的。Markdown 语法虽然操作简单,但还是需要记一些语法,下面让我们来学习这些语法:
标题使用 # 号可表示 1-6 级标题,一级标题对应一个#号,二级标题对应两个#号,以此类推。
1234567CLEAN# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题
显示效果如下:
一级标题二级标题三级标题四级标题五级标题六级标题
字体Markdown 可以使用以下几种字体:
12345MARKDOWN*斜体文本***粗体文本*****粗斜体文本***~~这是加删除线的文字~~
显示效果如下:斜体文本粗体文本*粗斜体文本*这是加删除线的文字
下划线下划线可以通过 HTML 的<u>标签来实现:
12XML<u& ...
Nginx 从入门到实战
Nginx 的安装本文 Linux 环境基于 centos7
版本区别常用版本分为四大阵营
Nginx 开源版 http://nginx.org/
Nginx plus 商业版 https://www.nginx.com
openresty http://openresty.org/cn/
Tengine http://tengine.taobao.org/
编译安装这里下载的是 nginx-1.21.6.tar.gz 解压后编译安装
12345678BASH# 解压tar zxvf nginx-1.21.6.tar.gz -C ./cd nginx-1.21.6# 执行配置脚本(不执行默认会安装在该目录)./configure --prefix=/usr/local/nginx# 安装make && make install
如果出现警告或报错一般是缺少依赖的问题
123456789BASH# 安装gccyum install -y gcc# 安装perl库yum install -y pcre pcre-devel# 安装zlib库yum install -y ...
Nginx实现灰度上线功能
前言软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。
新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。
所以,在公司里上线新版本代码一般都是通过灰度系统。
灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码。
而且灰度系统支持设置流量的比例,比如可以把走新版本代码的流量设置为 5%,没啥问题再放到 10%,50%,最后放到 100% 全量。
这样可以把出现问题的影响降到最低。
不然一上来就全量,万一出了线上问题,那就是大事故。
而且灰度系统不止这一个用途,比如产品不确定某些改动是不是有效的,就要做 AB 实验,也就是要把流量分成两份,一份走 A 版本代码,一份走 B 版本代码。
那这样的灰度系统是怎么实现的呢?
其实很多都是用 nginx 实现的。
nginx 是一个反向代理的服务,用户请求发给它,由它转发给具体的应用服务器。
这一层也叫做网关层。
由它负责转发请求给应用服务器,那自然就可以在这里控制流量的分配,哪些流量走版本 A,哪些流量走版本 B。
下面我们实现一下:
12345678910111213141516171819202 ...
Java 操作 Excel 之 POI 与 EasyExcel
前言在工作中,使用 excel 表格处理数据是很常见的操作,作为一个 Java 开发工程师,学会使用 Java 来操作 excel 表格是必备的技能之一。
本文就通过市面上常用的两种方式来实现 Java 对 excel 表格的操作:
Apache POI
Alibaba EasyExcel
一、Apache POI简介Apache POI 官网: https://poi.apache.org/
POI 是目前比较流行的 Java 处理 excel 框架,但是其缺点是 数据量大容易造成 OOM 异常
基本结构
HSSF - 提供读写[Microsoft Excel](https://baike.baidu.com/item/Microsoft Excel)格式档案的功能(03 版本 excel)
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能(07 版本 excel)
HWPF - 提供读写[Microsoft Word](https://baike.baidu.com/item/Microsoft Word)格式档案的功能
HSLF - 提供读写[M ...
Tomcat 配置 HTTPS 协议访问
前言Tomcat 默认支持 HTTP 协议访问,项目需求要修改 Tomcat 支持 HTTPS 协议访问。
操作步骤使用 Java 自带的 keytool 生成证书打开控制台输入:
1234BASHkeytool -genkey -v -alias testKey -keyalg RSA -validity 3650 -keystore D:\apache-tomcat-7.0.26\keys\test.keystore -ext SAN=ip:127.0.0.1keytool -export -alias testKey -file wxsccp.cer -keystore test.jks
参数说明:
12345APACHEalias: 别名 这里起名keyskeyalg: 证书算法,RSAvalidity:证书有效时间,10年keystore:证书生成的目标路径和文件名,替换成你自己的路径即可,我定义的是D:\apache-tomcat-7.0.26\keys\test.keystore,其中keys文件夹必须存在
之后回车,然后需要输入一些信息,其中秘钥库口令和秘钥口令最好 ...
Redis 缓存穿透、缓存击穿、缓存雪崩问题
前言在项目中引入一个缓存系统,不得不考虑的问题就是:缓存穿透、缓存击穿和缓存雪崩问题。
缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。
如发起为 id 为-1的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
接口层增加校验,如用户鉴权校验、id 基础校验(id<=0 直接拦截)
在数据库和缓存中都取不到的数据,可以将在缓存中存入一个空对象(key-null),设置一个短的有效时间。这样可以防止一个用户反复暴力攻击一个 id 请求
缓存击穿缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案:
设置热点数据永不过期
接 ...
Linux 系统基础
入门概述
我们为什么要学习 Linux?
linux 诞生了这么多年,以前还喊着如何能取代 windows 系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。
用习惯了 windows 操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生活中,并不意味着 linux 就没有用武之地了。在服务器端,在开发领域 linux 倒是越来越受欢迎,很多程序员都觉得不懂点 linux 都觉得不好意思,linux 在开源社区的地位依然岿然不动。
尤其是作为一个后端程序员,是必须要掌握 Linux 的,因为这都成为了你找工作的基础门槛了,所以不得不学习!
Linux 简介
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux 是一套免费使 ...
Dom4j 如何新增 standalone?
前言工作中调用一个第三方接口,需要上传 xml 文件。Java 操作 xml 文件的 api 很多,有 Dom、SAX 、JDom、Dom4j。我一般常用的是 Dom4j,但是对接此接口上传的 xml 文件需要添加 standalone="no" 属性。查阅相关资料,发现 Dom4j -1.6.1 版本并没有提供相应的方法设置。
解决方案重写 XMLWriter 类中的 writeDeclaration 方法,具体代码如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455JAVAimport java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.dom4j.io.OutputFormat;import o ...