序列化
序列化和反序列化序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。 而反序列化则相反,就是把持久化的字节文件数据恢复为对象的过程。 序列化场景: 需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时; 网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通信时; Serializable接口对于JVM来说,要进行持久化的类必须要有一个标记,只有持有这个标记JVM才允许类创建的对象可以通过其IO系统转换为字节数据,从而实现持久化,而这个标记就是Serializable接口。而在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以我们在实现Serializable接口的时候,一般还会要去尽量显示地定义serialVersionUID,如: 1private static final long serialVersionUID = 1L; 在反序列化的 ...
nginx的使用
nginx进阶: · 正向代理和反向代理 正向代理指的是代理客户端, 代替用户向服务器发送请求, 从而隐藏用户的信息。 反向代理指的是代理服务器, 通过反向代理,服务器可以分流请求, 而且实际执行请求的服务器处于内网时, 通过反向代理服务器,也能将请求从公网转到内网。 同时隐藏了内网服务器的信息。 keepAlive busybox Docker desktop — 搭一个 nginx 验证
了解Quartz
基本概述Quartz是一款轻量级且特性丰富的任务调度库,它是基于Java实现的调度框架,本文会针对日常任务调度的使用场景来演示Quartz的使用姿势。 源码角度分析都说Quartz是任务调度框架,从源码就可以看出其本质也就是工作线程轮询并执行继续的调度任务。 Quartz将任务定义为Job,Job是工作任务调度的接口,该接口定义了execute方法,所以当我们需要提交任务给Quartz时,就需要继承Job接口并在execute方法里告知要执行的任务: 123456789@Slf4jpublic class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) { String dateTime = LocalDateTime.now() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); ...
xxl-job的策略解析
阻塞处理策略单机串行(默认)调度进入单机执行器后,调度请求进入FIFO队列中并以串行方式运行 丢弃后续调度(推荐)调度请求进入单机执行器,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败 覆盖之前调度(不推荐)调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度 路由策略调用核心要想了解路由策略在何时执行的,我们不妨从入口触发器的代码开始研究。我们找到XxlJobTrigger的trigger方法。我们在代码中看到这么一段关于路由的逻辑,我们不妨步入查看一下processTrigger做了些什么。 源码如下,由于代码比较长,笔者将代码核心部分贴出来,如下所示,它的整体步骤为: 根据传入的job获取路由策略参数。 如果是分片广播则for循环调用外部传入的index获取执行器地址并调用执行器。 反之根据参数获取路由策略调用获取对应地址并调用即可。 1234567891011121314151617181920212223242526272829303132333435363738private static void ...
xxl-job原理与实践
xxl-job 的概念诞生背景我们在日常项目开发中,可能会用到分布式调度,在这期间我们可能会遇到这些问题: 同一个服务中可能存在多个互斥的任务,需要统一调度和协调。 定时任务运行期间,为了确保任务能够稳定运行,我们希望能够做到高可用、监控运维、故障告警。 需要统一管理和追踪个个服务节点定时任务的情况,以及任务属性信息,比如:任务所属服务、所属责任人等信息。 所以我们这里就需要用到xxl-job这个轻量级框架。 架构设计 调度模块(调度中心):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。 执行模块(执行器):负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。 这里放一张官网的系统架构图: 在真正了解 xxl-job ...
异步动态导出功能设计
需求背景想实现一个导出功能,可以很简单,也可以很复杂。简单做法,无脑用 EasyExcel + 注解,实现起来简便快捷。 easyexcel能大大减少占用内存的主要原因是:在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。 但是如果想要指定导出字段呢?如果要一次性导出上百万条数据呢? 那可能会面临下面的问题: 如果同步导数据,接口很容易超时。 如果把所有数据一次性装载到内存,很容易引起OOM。 数据量太大sql语句必定很慢。 相同商品编号的数据要放到一起。 如果走异步,如何通知用户导出结果? 如果excel文件太大,目标用户打不开怎么办? 异步处理要把导出这一功能异步,意味着需要有一张异步任务表来存储这些导出任务。 导入导出任务表如下: 12345678910111213141516171819CREATE TABLE `excel_import_process` ( `id` bigint(20) NOT NULL COMMENT '主键id', `import_name` varchar(255) DEFAUL ...
Spring Security的使用
基本概念基本上,在所有的开发的系统中,都必须做认证(authentication)和授权(authorization),以保证系统的安全性。 认证是确认声明者的本身身份,其作为授权的上游衔接而存在 鉴权是对声明者所声明的真实性进行确认的过程,其作为授权的下游衔接而存在 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于 Spring 的应用程序。 认证链路1 用户名和密码被过滤器获取到,封装成Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。 2 AuthenticationManager 身份管理器负责验证这个Authentication 3 认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例。 4 SecurityContextHolder安全上下文容器将第3步填充了信息的Authentication,通过Security ...
加签和验签
密码学概念明文、密文、密钥、加密、解密 明文:指没有经过加密的信息/数据。 密文:明文被加密算法加密之后,会变成密文,以确保数据安全。 密钥:是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。 加密:将明文变成密文的过程。 解密:将密文还原为明文的过程。 对称加密、非对称加密 对称加密:加密和解密使用相同密钥的加密算法。 非对称加密:非对称加密算法需要两个密钥(公开密钥和私有密钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。 什么是公钥私钥? 公钥与私钥是成对存在的密钥,如果用公钥对数据进行加密,只有用对应的私钥才能解密。 其实,公钥就是公开的秘钥,私钥就是要你私自保存好的秘钥。 非对称加密算法需要有一对公私钥~ 加签验签概念「加签」:用Hash函数把原始报文生成报文摘要,然后用私钥对这个摘要进行加密,就得到这个报文对应的数字签名。通常来说呢,请求方会把「数字签名和报文原文」一并发送给接收方。 「验签」:接收方拿到原始报文和数字签名后,用「同一个Hash函数」从报文中生成摘要A。另外,用 ...
Maven入门到实战
Maven 的安装与配置下载地址:https://maven.apache.org/download.cgi 添加环境变量使用 win + r 打开运行框,输入control system,回车进入设置界面后,创建一个环境变量MAVEN_HOME(maven的安装地址)。 创建好后,找到系统变量中的path,将MAVEN_HOME这个变量配置进去:%MAVEN_HOME%\bin 打开cmd命令行输入mvn -v,打印出版本号表示安装成功。 修改 settings.xml修改 conf 下的 settings.xml,将 localRepository 替换成本地的 maven 仓库地址。 至此,maven 就能正常使用了! 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 ...
SSO单点登录
什么是SSOSSO( Single Sign On),即单点登录。是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。 简单来说,在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录;用户只需注销一次,各个系统即可感知该用户已经注销。 单系统登录众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。 HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session是依据Cookie来识别是否是同一个用户。 虽然单系统的登录解 ...
SSE
简介Server-Sent Events 服务器推送事件,简称 SSE,是一种服务端实时主动向浏览器推送消息的技术。 SSE运行在HTTP协议之上,它允许服务器以事件流(Event Stream)的形式将数据发送给客户端。客户端通过建立持久化的HTTP连接,并监听这个事件流,从而可以实时接收到服务器推送的数据。 SSE用途ChatGPT 是一个基于深度学习的大型语言模型,处理自然语言需要大量的计算资源和时间,响应速度肯定比普通的读数据库要慢的多,普通 http 接口等待时间过长,显然并不合适。对于这种单项对话场景,ChagtGPT 将先计算出的数据“推送”给用户,边计算边返回,避免用户因为等待时间过长关闭页面。而这,可以采用 SSE 技术。 SSE 可以在 Web 应用程序中实现诸如股票在线数据、日志推送、聊天室实时人数等即时数据推送功能。股票📈k线的实时变化,彩票趋势走向,以及工业数据实时监控(受限于页面的数据获取范围面)和日志推送和CI/CD工作流进度的推送等相关单向推送需求的场景。 需要注意的是,SSE 并不是适用于所有的实时推送场景。在需要高并发、高吞吐量和低延迟的 ...
logback的配置和使用
logback 简介 logback 官网:https://logback.qos.ch/ logback 由三个模块组成: logback-core logback-classic logback-access logback-core 是其它模块的基础设施,其它模块基于它构建,logback-core 提供了一些关键的通用机制。 logback-classic 的地位和作用等同于 Log4J,它也被认为是 Log4J 的一个改进版,并且它实现了简单日志门面 SLF4J; logback-access 主要作为一个与 Servlet 容器交互的模块,比如说tomcat或者 jetty,提供一些与 HTTP 访问相关的功能。 配置文件接下来会介绍关于 logback 配置文件的配置项。 Configuration整个 logback.xml 配置文件的结构如下: 1234567891011121314151617<configuration scan="true" scanPeriod="60 seconds" debug=" ...
avatar
Palette
这是一个终身学习的时代
Follow Me
公告

欢迎来到「Palette」个人技术博客!🎉

本平台专注于:

  • > JAVA后端技术笔记
  • > 场景设计解决方案
  • > AI应用实践

🌟 一起钻研技术,共同进步!