全新Nuxt+SpringCloud博客已部署预览,目前第一阶段开发已进入收尾
博客快速预览地址https://ouo.pub
经过了一番折腾总算是把项目部署到云服务器上了。服务器内存直接干掉5个G,3G的物理内存+2G的虚拟内存。
由于项目很多东西都是部署在磁盘转换的虚拟内存上,导致性能不太行,加载速度不是很乐观,只能等后续优化了= =+。
首页预览
服务器内存不够?如何将储存空间转换为虚拟内存
前言在之前的文章中提到过,我们可以通过释放缓存的方式来腾出内存。但是当你的程序占用内存就是过高时,还是会出现内存不足,这时就需要通过其它途径来扩展内存了,将磁盘转为临时内存就是其中一种方式。
需要注意的是,Linux使用磁盘做内存并不是直接把磁盘改成内存,而是使用磁盘开辟出一个交换区( Swap)作为虚拟内存使用。
由于Swap是读写磁盘。而众所周知,磁盘的读写速度是远不及直接读取内存来的快的,所以这便是使用Swap的缺陷。
创建交换空间(Swap)使用下面命令创建交换空间(Swap):
1# dd if=/dev/zero of=[path] bs=[bytes] count=[blocks]
if=/dev/zero:输入文件,/dev/zero表示空文件,即以null字符写入文件中路径。
of=path:输出文件,即指定(需要设为交换空间的)路径。
bs=bytes:同时设置读入/输出的块大小为bytes个字节(可以理解为读写速度)。
count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。
示例:创建一个4G的Swap
1# dd if=& ...
云服务器内存严重缩水?4G内存为何只有3G可用?
前言最近总算是把博客项目基本写完了,但是部署到服务器上时,服务器直接爆了。。。
但是令人不解的是,服务器4G内存,只用了3G,怎么就用不了了,服务器直接卡死了。
为何为出现如此严重的缩水?先使用free命令查看下内存情况:
1$ free
free命令默认以KB为单位,可选参数为:-b、-k、-m、-g
参数说明:
总内存(Total):显示系统的总内存大小。已使用内存(Used):显示当前已被分配和使用的内存大小。剩余内存(Free):显示当前剩余可用的内存大小。共享内存(Shared):显示被多个进程共享的内存大小。缓存(Buffers):显示用于缓存文件系统数据的内存大小。缓冲区(Cached):显示用于缓冲磁盘写操作的内存大小。
可以看到总共有3669M可用内存(相当于实际还是缩水了300M。。。),已使用1938M,但是空闲空间只剩141M,缓存占用高达1589M。
为什么缓存占用如此之高呢?
在服务内存够用的情况下,Linux内核为了加快对文件的读写效率会将文件放入之 buffer/cache 中 以保证读写效率,但其实,尽管当你的应用程序对文件的读写运行结束后 ...
全新Nuxt+SpringCloud博客正在开发中,目前进度(一)
技术栈前端采用Nuxt3(Vue3),后端使用SpringCloudAlibaba2023全家桶+JDK21,最新技术栈开发。
预览目前博客端基本框架已开发完成,剩余一些功能的完善,以及后台管理端目前还在开发中。
使用Mapstruct轻松实现实体类转换
前言MapStruct是一个Java编译器插件的注解处理器,可以快速便捷的实现实体类的转换。比如VO和DTO之间的互转。
官网
引入依赖最新版本号可以去官网获取
12345678910<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version></dependency><dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version></depe ...
后端传递Long类型数值,前端接收精度丢失(失真)问题
前言最近在写评论插件时,id使用雪花算法生成(Long),结果传递到前端时发现id最后几位精度丢失全变成了0。
后面经过几番排查后发现前端能够接收的数字最多只能是16位,所以会造成精度丢失。
可以看到后端传递的数据是没有任何问题的,但是接收时精度就丢失了。
在考虑到不改变业务结构的情况下,有两种解决方案。
方案一:自定义消息转换器通过自定义消息转换器,将传递给前端的Long类型数据转换为String类型数据。
这个方法会将所有传到前端的Long类型转为String。
12345678910111213141516171819202122232425262728293031import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;import org.springframework.context. ...
浏览器注入外部JS文件
方法一:直接在控制台注入众所周知,浏览器控制台可以直接执行js命令,所以我们可以在控制台通过命令将外部js文件注入到当前界面中。
(那么可能就有小伙伴要问了,既然能在控制台直接执行,为什么还需要多此一举,在控制台引入呢?因为这里主要讲了是引入外部文件,如果被引入的js文件很大,有几千行,总不能全部复制到控制台执行吧。)
原理很简单,就是通过命令创建一个JavaScript标签,然后填入地址,插入到HTML中。直接看代码吧:
1234const createScript = document.createElement("script")createScript.setAttribute("src", "远程js路径")const doc = document.documentElement;doc.insertBefore(createScript, doc.firstChild)
将上面的命令在控制台执行,就能实现注入了。
为了方便测试,我们编写一个简单的js文件测试效果:
demo.js
需要注意的是,这个js文件不能 ...
Docker——容器化部署(进阶篇)
Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本(Dockerfile就相当于用(多条)指令来说明要执行什么操作来构建镜像的文件)。
Dockerfile通过指令构建镜像,过程就相当于Docker内部容器多次提交形成镜像
大致流程:
常用保留字指令每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
示例:tomcat10/jdk8的dockerfile
指令执行时期:
Build
Run
Both
FROM
CMD
WORKDIR
MAINTAINER
ENV
USER
COPY
EXPOSE
ADD
VOLUME
RUN
ENTRYPOINT
ONBUILD
FROM基础镜像,作为Dockerfile的首条指令。表明当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板。
MAINTAINER镜像维护者的姓名和邮箱地址。
RUN容器构建时需要运行的命令。主要用于执行Linux的shell命令,一般是安装过程的命令。主要有两种格式:
shell格 ...
Docker——容器化部署(基础篇)
前言Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
优点:Docker是一个快速交付应用、运行应用的技术:
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统[1]。
运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
启动、移除都可以通过一行命令完成,方便快捷。
[1]: 因为Docker是将依赖、运行环境一起打包的,而 Docker容器在任何操作系统上都是一致的,所以就有效避免了测试部署环境和开发环境不一致可能出现的各种问题(开发能跑,测试部署跑不起来的问题得到了有效解决),这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker结构:
服务端:接收命令或远程请求,操作镜像或容器
客户端:发送命令或者请求到Docker服务端
Docker和虚拟机docker是一个系统进程;虚拟机是在操作系统中的操作系统d ...