自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 LocalDateTime的序列化和反序列化

最近定位出一个LocalDateTime序列化相关的问题,简单记录一下。本文重点介绍Jackson对LocalDateTime的序列化和反序列化,并结合Spring应用场景进行介绍。

2024-07-30 21:41:18 550

原创 前端系列-9 Vue3生命周期和computed和watch

本文介绍Vue3的生命周期和钩子函数,鉴于篇幅允许以及防止前端文章过于分散,因此将watch和computed部分之前的学习笔记也整理到本文中。这三部分是三个知识点。watch可以与pinia的$subscribe状态监听进行比较学习。

2024-07-29 21:06:22 1191

原创 Nginx系列-12 Nginx使用Lua脚本进行JWT校验

本文介绍Nginx中Lua模块使用方式,并结合案例进行介绍。案例介绍通过lua脚本提取HTTP请求头中的token字段,经过JWT校验并提取id和name信息,设置到http请求头中发向后段服务器。默认情况下,Nginx自身不携带lua模块,即不支持通过lua脚本进行功能扩展。需要在编译Nginx时手动引入lua模块,或者直接使用openresty,本文结合后者进行介绍。

2024-07-28 16:48:46 963

原创 Nginx系列-11 HTTP消息处理流程

了解Nginx处理HTTP请求的11个阶段,有助于理解和配置nginx、自定义模块、基于lua模块自定义功能。按如下配置,执行"curl http://localhost:8001/query/test.html",如果读者对结果不是很确定,建议阅读本文。

2024-07-28 10:04:46 832

原创 Nginx系列-10 realIp模块使用

当请求被代理后,真实客户端相对服务器被隐藏,即服务端无法判断HTTP消息来源。可通过将客户端的IP添加入HTTP消息解决上述问题,可在消息头中添加字段。

2024-07-26 23:04:12 1076

原创 Nginx系列-9 Nginx配置HTTPS

消息在公网上传输需要进行加密,以保证信息的安全性。加密有对称加密和非对称加密两种;对称加密使用同一个秘钥进行加密和解密;非对称加密使用一对秘钥进行加解密。对称加密相对于非对称加密速度快、效率高。在HTTPS握手过程,服务端会将证书(公钥和CA信息)发送给客户端;客户端使用CA信息验证证书的合法性,然后随机生成一个秘钥,并使用证书中携带的公钥对该生成的秘钥加密,然后发送给服务端;服务端使用私钥进行解密,得到秘钥;之后,双方使用这个对称加密的秘钥进行信息的加解密。因此,需要服务端需要准备证书和私钥。

2024-07-25 20:53:59 837

原创 前端系列-8 集中式状态管理工具pinia

pina提供了defineStore方法创建store,store作为集中式状态管理的实体,可被任意组件读取/写入数据。定义的store一般放在src/stores目录下。// 定义并暴露一个store// 配置信息})defineStore方法接收两个参数,store的唯一标识符和store的配置对象。其中,store配置对象中可以包含 state函数、actions对象、getters对象。

2024-07-25 20:52:54 480

原创 Nginx系列-8 常见指令收集

一般,可以将allow/deny配置在http块、server块、location块中。请求会按照优先级顺序自上而下进行匹配,匹配一个就中断。server {#第1条#第2条#第3条deny all;#第4条#第5条allow all;#第6条# ...当192.168.0.1访问时,匹配第1条,允许访问,即192.168.0.1可穿过access阶段;当192.168.0.2访问时,匹配第2条,被拦截,返回403;

2024-07-24 21:19:00 840

原创 前端系列-7 Vue3响应式数据

响应式数据的核心是当数据模型发生变化时,与之相关(使用该数据模型)的视图或组件可以自动更新,以反映最新的数据状态。实现原理是数据劫持、依赖收集和分发更新,数据劫持是一种AOP策略。在vue2中通过Object.defineProperty方法为对象的每个属性设置setter和getter方法,当访问或者修改对象的属性时,进入setter/getter方法,从而实现拦截。getter方法被调用时,可以进行依赖收集,确认属性被哪些组件依赖;

2024-07-24 18:58:22 662 2

原创 前端系列-6 使用Vue3搭建前端工程与setup语法糖介绍

本文介绍如何使用vue3脚手快速搭建一个前端项目,并对生成的项目结构进行简单介绍,然后介绍setup语法糖。前端入门的同学可基于本文内容快速搭建属于自己的项目。vue官网资料显示, vue3开发的项目相对vue2, 具有打包后体积变小,极速启动服务、渲染速度快、内存减少、拥抱ts编程等优点。

2024-07-23 22:43:22 1305

原创 Nginx系列-2 Nginx配置文件介绍

本文用于介绍Nginx配置文件的内容,先从整体结构上进行介绍,再分功能对常见配置指令进行说明,最后对location和server块的配置进行介绍。由于Nginx配置文件内容较多,因此将较为复杂的配置指令单独抽出专题进行介绍,如rewrite、upstream、proxy_pass、root和alias等指令,包括以下文章:Nginx系列-3 servername优先级和location优先级和常用正则表达式Nginx系列-4 proxy_pass使用和路径拼接问题。

2024-07-23 21:55:22 995

原创 Nginx系列-7 upstream与负载均衡

upstream允许将一组服务器定义为一个服务器组,之后可基于这个组进行请求的分发,从而实现负载均衡、故障转移等功能。每个服务器可以使用ip:端口形式或者域名:端口形式;端口省略时,http使用80端口,https使用443端口。后续可直接使用服务器名,将其作为服务器使用

2024-07-21 08:40:35 2487 1

原创 Nginx系列-6 rewrite使用介绍

rewrite指令可以定义在server块和location块中,用于URL重写。说明:rewrite重写url,一般不重写域名和端口,即正则表达式和修改后的路径只针对url部分;如果重写了域名和端口,就被认为是重定向,返回302重定向到重写路径。regex为正则表达式部分,用于匹配需要重写的url;replacement为替换内容,将匹配正则表达式的url替换为replacement;本条规则匹配完成后,继续向下匹配新的location规则;本条规则匹配完成即终止,不再匹配后面的任何规则;

2024-07-21 08:26:02 2105

原创 Nginx系列-5 root和alias和index和try_files

root和alias用于指定文件系统的路径。root一般定义在server块中,为每个server指定文件系统路径;alias只能定义在location块中,为具体的url指定文件系统。二者的差别还体现在:[1] root只能指定目录,而alias可以指定目录也可以指定文件;[2] root和alias的路径拼接方式不同。本章节在介绍root和alias的使用过程中,会围绕差异点进行细致描述。如果对这两点比较熟悉,请直接跳过本章内容。

2024-07-21 08:25:01 2875

原创 Nginx系列-4 proxy_pass使用和路径拼接问题

proxy_pass指令用于请求的转发,请客户端请求转发至第三方服务器

2024-07-20 22:57:37 2679

原创 Nginx系列-3 servername优先级和location优先级和常用正则表达式

servername配置在server块中。当客户端向Nginx服务器发送请求时,Nginx会根据请求的Host头字段与server_name进行匹配,以确定将请求转发到哪个server块进行处理。

2024-07-20 19:10:45 2598 1

原创 前端系列-5 SCSS使用介绍

Sass作为一种强化CSS的辅助工具,提供了变量、嵌套、混合、继承、导入等功能,是的CSS代码更具可维护性。文件有两种格式:一种以.scss为文件后缀,语法与css相似,使用分号换行,使用大括号包裹样式;一种以.sass为文件后缀使用缩进代替大括号,使用换行代替分号。

2024-07-14 15:11:10 2160

原创 Nginx系列-1 Nginx安装与使用

本文介绍nginx安装过程和简单使用,以及如何将Nginx委托给systemd管理。

2024-06-30 12:27:22 2786 1

原创 日志轮转—cron和logrotate

本文介绍如何基于linux系统的cron和logrotate实现日志轮转。cron是一个定时任务管理器,根据配置定时触发任务;logrotate是一个日志轮转工具,根据配置处理日志,logrotate依赖于cron的定时触发。cron是linux系统自带的执行定时任务的工具。cron有3个概念需要区分:cron代表这个软件,crond代表实际运行的进程,crontab用于修改配置文件的客户端工具。cron的核心是配置文件,crond每分钟会读取并比较配置文件时间戳,以确认是否有修改。

2024-06-22 20:47:48 2708 1

原创 Redis系列-5 Redis分布式锁

本文介绍Redis分布式锁的内容,包括Redis相关命令和Lua脚本的介绍,以及操作分布式锁的流程与消屏蔽底层Redis对锁的实现方式,仅用Lock和UnLock表示获取锁和释放锁,分布式锁的竞争流程可表示如下图所示:[1] 客户端ClientA向Redis发送获取锁的消息,锁key为myLock(自定义);[2] Redis响应成功,表示占锁成功;[3] 客户端ClientB向Redis发送获取锁的消息,key为myLock;[4] 服务器判断此时myLock锁已被ClientA占有,Redis响应失败;

2024-06-09 20:57:16 1939

原创 Redis系列-4 Redis集群介绍

Redis提供了持久化能力,保证了重启不会丢失数据;但Redis重启至完全恢复期间,缓存不可用。另外,对于高并发场景下,单点Redis服务器的性能不能满足吞吐量要求,需要进行横向扩展。此时,可通过搭建Redis集群解决如上两个问题。按照并发量和具体业务的要求,可以部署三种架构的集群:主从模式、哨兵模式、Cluster模式,以下分章节分别进行介绍。

2024-06-09 16:23:02 2315 2

原创 Wireshark自定义Lua插件

常见的抓包工具有tcpdump和wireshark,二者可基于网卡进行抓包:tcpdump用于Linux环境抓包,而wireshark用于windows环境。抓包后需借助包分析工具对数据进行解析,将不可读的二进制数转换为可读的数据结构。wireshark不仅可以作为抓包工具,还可以作为包解析工具。Wireshark针对常见协议都提供了对应的解析插件,如: TCP、UDP、HTTP、SIP等;同时提供了自定义插件机制,用户可以基于此解析自定义消息。至于插件,wireshark支持C语言插件和Lua插件,L

2024-06-08 17:36:05 3572

原创 Lua使用方式介绍

Lua是C语言开发的脚本语言,设计的目的是为了嵌入到程序中,因此被设计得轻量小巧。Nginx配置中可以直接嵌入Lua 代码或引入Lua 文件,Redis支持运行Lua语句和脚本,Wireshark中使用Lua脚本自定义协议。本文用于收集常用的语法和API,用作记事本而不会过多深入,内容后续会不断更新。

2024-06-02 14:40:10 2231

原创 Redis系列-3 Redis缓存问题

数据库(如Mysql)的持久化特点带来了较低的性能,高并发的场景下,连接池很快被耗尽而出现宕机或DOS,无法继续对外提供服务。相对于数据库的硬盘IO,缓存中间件基于内存进行读写,从而具备较大的吞吐量和高并发抵抗能力。在服务器与数据库之间添加一层缓存,一方面可以缓解数据库压力,适应高并发场景;另一方面可以提高服务器的响应速度(内存读写速度远高于磁盘IO),具体流程如下所示:引入缓存后,服务器会先从缓存服务器查询,若数据不存在,才会从数据库查询,并将数据库查询结果写入缓存服务器。

2024-05-12 22:30:00 2027

原创 前端系列-4 promise与async/await与fetch/axios使用方式

本文介绍promise使用方式,以及以Promise为基础的async/await用法和fetch/axios使用方式,主要以案例的方式进行。javascript是单线程执行的,异步编程的本质是事件机制和函数回调。当执行阻塞任务或者进行IO操作时,编程时很容易嵌套多层回调,严重影响可读性和维护性,陷入地狱回调

2024-05-12 15:09:28 1938

原创 Redis系列-2 Redis持久化机制

服务器重启后会丢失内存中的全部数据,内存数据库如果没有持久化机制,难以保证数据的可靠性,如Memcached。Redis提供了RDB(基于全量)和AOF(基于增量)两种持久化机制,一方面可以保证数据的可靠性,当服务器意外宕机重启后,Redis从持久化文件中读取数据,可以快速恢复到宕机前的状态;另外,基于持久化文件可以实现数据备份、数据扩展和搭建Redis集群。

2024-05-03 20:55:21 1904

原创 Redis系列-1 Redis介绍

基于C语言开发的、基于内存的、跨平台的非关系型数据库(Nosql)。Redis基于键值对存储结果,键只能为字符串,值的类型有:字符串String、散列Hash、列表List、集合Set、有序集合Sorted Set。因其基于内存而脱离了常规数据库的IO操作,从而具备高性能的读写(10W/s的读和8W/s写)。核心处理使用单线程进行,避免了并发问题,以及减少了线程切换带来的性能开销。redis作为内存数据库,可用于存放缓存数据。在高并发场景中存放热点数据,可以提高数据访问速度,也可以缓解数据库压力;

2024-05-01 16:48:26 1957

原创 前端系列-3 前端打包工具和插件介绍(npm+babel+webpack)

JS不断发展,浏览器的适配速度没有跟上,引入了一个问题:用高级(ES6+)的JS语法开发的代码,无法在支持低版本(ES5)JS语法的浏览器上运行。babel作为转译工具,可以实现将ES6转译为ES5,为该问题提供了一个解决方案。label常被集成到webpack中进行打包;随着vue3的出现, vite+esbuild的占有率相比webpack+babel更高。

2024-04-27 17:28:37 3234

原创 前端系列-2 模块化CommonJs+AMD+CMD+ES6

js中, 一个文件就是一个模块,模块化可以提高代码利用率而减少重复代码,将相同的逻辑维护在一个模块中,分而治之,提高代码的可维护性;另外,模块化的出现可以在工程中引入第三方模块,极大提高开发效率。在模块化出现前,只能通过\标签在html中导入,并根据依赖控制导入顺序。CommonJS出现后,模块化技术不断发展,目前主流的js模块化规范有CommonJS, AMD/CMD以及ES6等模块系统,按照模块化的发展可排序为: CommonJS -> AMD/CMD -> ES6.Co

2024-04-21 18:08:59 2347

原创 多线程系列-2 线程中断机制

理解线程中断的本质,可以从"如果没有线程中断机制,会有什么后果"的角度考虑: 因可能引发数据不同步以及资源无法回收问题,通过stop暴力停止线程的方法已被废弃;线程被CPU调度后会独立发展和自治, 无法解决如线程长期阻塞后无法恢复等问题。因此,中断机制是为了引入从线程外部进行干预的能力。"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 "

2024-04-21 11:52:37 1863 1

原创 IO系列-2 Protobuf使用说明

protobuf序列化后得到的是二进制数据,相对于纯文本的json和xml等体积更小,传输速度更快; 序列化和反序列化速度也相对较快;protobuf有配套的工具,可以根据proto文件与指定的语言类型自动生成代码;除此之外,protobuf还具有向前和向后的版本兼容性;因此,protobuf可用于系统间高效的数据传输。

2024-04-15 21:45:51 1993 1

原创 Python使用方式介绍

目前主流开发使用python3. 二者语法上略有区别:输入输出、数据处理、异常和默认编码等,如:python3中字符串为Unicode字符串,使用UTF-8编码,而python2默认使用ASCII编码。python2和python3对应的包管理工具分别是pip和pip3. 另外,Python3引入了一些高级解释器特性,如协程、类型提示、异步编程等。软件升级过程中,设计时不考虑向下相容(减少累赘),因此python3不完全兼容python2. 可通过Python3自带的工具`2to3`对python文件进行

2024-04-15 06:53:35 2217

原创 云原生容器化-5 Docker常见操作命令

本文介绍docker常见的命令

2024-02-15 12:18:01 2218

原创 云原生容器化-4 Docker仓库

Docker Registry v2 API是Docker引擎与Docker Registry进行交互时的接口规范。Docker引擎进行镜像的下拉、删除、推送和修改时需要调用Docker Registry提供的接口。Docker对容器和镜像进行了分层设计,API也以分层为基础。Docker镜像数据包括:数据(blob)和元数据(manifest)两个部分,前者是实际的二进制数据,后者是镜像的描述数据,V2 API为这两部分分别提供了接口。本文介绍推送和下拉镜像相关的API,其他API请参考:。

2024-02-13 12:23:37 3786

原创 云原生容器化-3 Dockerfile

用户可以使用两种方式构建Docker镜像: 手动方式和Dockerfile自动方式。**[1] 手动方式**运行基础镜像为容器后,根据业务需要进行定制化操作,然后手动通过docker commit命令将容器保存为镜像。**[2] Dockerfile**将依赖的基础镜像和定制化操作写在脚本中,由Docker引擎读取并执行脚本中的指令,然后生成镜像,这个脚本叫做Dockerfile.推荐使用第二种,理由如下: Dockerfile通过脚本的方式定义依赖和构建步骤,从而确保了每次构建的一致性和可维护性

2024-02-11 22:54:26 3579

原创 Linux系列-1 Linux启动流程——init与systemd进程

init进程因串行化地启动程序,存在效率问题,且需要自定义脚本; systemd通过并行启动以及通过引入service配置文件,规避了上面两个问题。ini使用service命令,systemd使用systemctl工具来管理,并且在操作上做了兼容处理(将service指令重定向到systemctl)

2023-12-03 13:06:25 3812

原创 SpringMVC系列-7 @CrossOrigin注解与跨域问题

理解同源策略是理解跨域的前提。同源策略定义如下: 在同一来源的页面和脚本之间进行数据交互时,浏览器会默认允许操作,而不会造成跨站脚本攻击;不同源之间进行限制。不同源之间形成跨域,包括:协议、域名、端口。http和https,localhost和127.0.0.1也会形成跨域(即使经过域名解析后相同)。由于浏览器引擎实现了同源策略,即对跨域访问进行了限制,因此存在跨域问题。

2023-11-25 22:20:06 3486 1

原创 SpringBoot系列-2 自动装配

Spring提供了IOC机制,基于此我们可以通过XML或者注解配置,将三方件注册到IOC中。问题是每个三方件都需要经过手动导入依赖、配置属性、注册IOC,比较繁琐。基于"约定优于配置"原则的自动装配机制为该问题提供了一个解决方案。

2023-11-12 16:22:03 1416

原创 SpringBoot系列-1启动流程

本文作为SpringBoot系列的开篇,介绍SpringBoot的启动流程,包括Spring容器和Tomcat启动过程。SpringBoot作为流行的微服务框架,其是基于约定和自动装配机制对Spring的封装和增强。

2023-11-05 16:23:59 1391

原创 SpringMVC系列-6 异常处理器

本文作为的第六篇,介绍SpringMVC的异常处理器。内容包括异常处理器的使用方式、实现原理和内置异常处理器的装配过程。

2023-10-29 11:34:17 1275

空空如也

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

TA关注的人

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