0%

文件上传

对于javaweb的文件上传大家应该都有一定了解,也知道文件上传时用的请求格式是什么?那么spring是如何进行解析文件上传请求的呢?

Spring中有一个MultipartResolver接口来专门解析multipart请求中的内容,其有两个实现类

  • StandardServletMultipartResolver:依赖于Servlet3.0对multipart的支持,如果没有使用Servlet3.0的容器,只能使用CommonsMultipartResolver

  • CommonsMultipartResolver:使用 Commons FileUpload解析multipart请求

    1
    2
    3
    4
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    </dependency>
阅读全文 »

Docker简介

Docker是一个轻量级容器技术,是直接运行在操作系统之上的,而不是运行在虚拟机中,通过namespace实现了虚拟机技术的资源隔离,通过cgroup实现资源限制,通过写时复制实现了高效的文件操作

Docker支持将软件编译成一个镜像,在这个镜像里做好对软件的各种配置,然后进行发布,使用者可以运行这个镜像,运行中的镜像就被称之为容器

运维人员可以直接使用这个镜像,将其发布到任何装有Docker的机器上,可以有效地解决微服务架构下服务粒度细、服务数量多所导致的开发环境搭建、部署以及运维成本高的问题

阅读全文 »

CDN系统

CDN的好处

  • 缓解源服务器访问压力
  • 解决跨地区、跨运营商网络、速度慢等互联互通难题
  • 解决网站热点、重点事件突发流量的问题
  • 合理利用互联网资源,解决中小企业租用虚拟服务器慢问题(虚拟机、云主机共用、加速访问)
  • 解决加速问题(静态图片、静态文本、静态视频)
  • 全面预防单点故障
  • 改善用户的访问质量和体验
  • 提供全面、准确和详细的数据统计
  • 有效地防止黑客攻击源站
阅读全文 »

使用命令行执行

首先看一下jmeter命令中可用的参数

1
2
3
4
5
6
7
-h 帮助 -> 打印出有用的信息并退出
-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
-t 测试文件 -> 要运行的 JMeter 测试脚本文件
-l 日志文件 -> 记录结果的文件
-r 远程执行 -> 启动远程服务
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号

既然是使用命令行,那么就不需要GUI,则使用-n

1
./jmeter -n -t /home/jmeter/test-example/HTTP请求.jmx -l /home/jmeter/test-example/result/result.csv

CAS操作

之前说在java.util.concurrent.atomic包下提供的原子操作类底层使用的是CAS,那么什么是CAS呢,CAS的全称为Compare And Swap,比较并替换,CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B

在进行变量更新时,需要对比预期值A和内存地址V中的实际值,如果两者相同,才会将V对应的的值改为B

AtomicInteger为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// unsafe提供了硬件级别的原子操作
private static final Unsafe unsafe = Unsafe.getUnsafe();
// 存储value在AtomicInteger中的偏移量
private static final long valueOffset;
// 存储AtomicInteger的int值,该属性需要借助volatile关键字保证其在线程间是可见的
private volatile int value;

static {
try {
// valueOffset表示的是AtomicInteger对象value成员变量在内存中的偏移量,可以当做是value变量的内存地址
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}

public final boolean compareAndSet(int expect, int update) {
// this为当前对象,valueOffset参数代表了V对象中的变量的偏移量,expect参数代表了A变量预期值,update参数代表了B新的值
// 如果对象this中内存偏移量为valueOffset的变量值为expect,则使用新的值update替换旧的值expect
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
阅读全文 »