SpringBoot AOP 记录系统操作日志和异常日志到数据库
最近需要记录 用户的操作日志 ,功能完成了,现在记录下:
做一些提前准备
POM1234567891011121314151617181920212223<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency><dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.4</version></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>f ...
MySql数据库主从同步的三种模式讲解
mysql主从同步分三种模式:异步复制、半同步复制、全同步复制,今天记录下三种同步模式的概念、优势、劣势。
概念 🏰
master–主数据库
slave–从数据库
binlog–二进制日志文件
relaylog–中继日志
ack–确认应答(确认消息、确认机制)
中继日志存在于 slave(从数据库) 中,它是从 master(主数据库) 的 二进制日志 复制过来的,并不是自己的数据库变化产生的,有点接力的感觉,称为中继日志,即relay log。
异步复制 🎸看下图:
异步复制是 mysql 默认的同步方式,在 master 为 slave 开通账号密码、ip授权之后,slave 可以从 master 进行数据同步,主要依赖的是 master 的 binlog 日志。
slave 会启动两个线程,IO Thread 和 SQL Thread:
IO Thread 负责从 master 拉取 binlog 日志,并写入 relay 中继日志
SQL Thread 负责将 relay 中继日志中的变更进行重放,更新数据来达到跟 master 保持数据一致的目的
这个过程中, ...
Kubernetes学习总结(一)
Kubernetes(K8S)简介一、Kubernetes (K8S) 是什么先进入它的官网看看:Kubernetes
从官网我们可以看到:
Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统。
官方的一句话,就已经解释的很清楚了,这里就不过多的解释什么是容器化应用。Kubernetes 因为 k 和 s 之间有八个字符的关系,也叫k8s。下面会讲解为什么要使用它。
二、为什么要学习k8s2.1 不同的应用部署方案我们应用部署方案大概可以分为三种:
传统部署方式:
应用直接在物理机上部署,机器资源分配不好控制,出现Bug时,可能机器的大部分资源被某个应用占用,导致其他应用无法正常运行,无法做到应用隔离。
虚拟机部署:
在单个物理机上运行多个虚拟机,每个虚拟机都是完整独立的系统,性能损耗大。
容器部署:
所有容器共享主机的系统,轻量级的虚拟机,性能损耗小,资源隔离,CPU和内存可按需分配
2.2 什么时候需要 Kubernetes当你的应用只是跑在一台机器,直接一个 docker + docker-compose 就够了,方便轻松;
当你的应用需要跑在 3,4 ...
SpringBoot整合ip2region实现使用IP监控用户访问城市
一、背景最近项目来了个新需求,要记录用户每次登录项目时所在的省份/城市信息。
网上有了解过,对于这个功能是如何实现的,一般有两种方法:GPS 定位的信息和用户 IP 地址。对于这次需求我采用了用户 IP 地址来完成功能的实现,因为不是每个客户端都会打开 GPS,而且有时并不太需要太精确的位置(到城市这个级别即可)。
二、Ip2region2.1 介绍ip2region 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。
⭐️Gitee地址:ip2region
🎁GitHub地址:ip2region
2.2 快速上手
第一步,将整个项目down下来,找到data目录,进入
这里有三份ip地址库,我们将ip2region.xdb复制出来,等下我们的java项目中需要使用到。
第二步,创建maven项目,引入依赖
pom.xml依赖如下(我创建的是springboot脚手架项目,都一样):
12345678910111213141516171819202122<dependencies> ...
HandlerMethodArgumentResolver(参数解析器)的作用+使用小案例
一、背景今天在做项目时遇到了一个有关参数解析 HandlerMethodArgumentResolver 的使用疑惑。因此去 csdn 学习了一下,现在记录一下。
二、参数解析器想要自定义参数解析器,就要实现HandlerMethodArgumentResolver接口,而它是springMvc下的一个接口,引入spring-web的starter就可见了。
接口内容:
12345678910111213141516171819202122232425package org.springframework.web.method.support;import org.springframework.core.MethodParameter;import org.springframework.lang.Nullable;import org.springframework.web.bind.WebDataBinder;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springfram ...
使用winsw将springboot jar以windows服务的方式运行
以前有记录过使用 .bat文件方式来完成windows环境下后台运行jar包
步骤相对比较麻烦,后期维护也不方便。这里我新了解到了一些工具 winsw、nssm,它们都可以更为方便在windows环境下去运行jar。
这里主要讲解 winsw 使用方式,nssm 工具使用方式也很容易,可以自行百度。
一、背景因为网络限制,目前开发的一个SpringBoot项目不能部署到Linux设备上,必须要部署到Windows上。
在Linux上,后台启动SpringBoot项目只需要一条命令:nohup sh run.sh &,run.sh脚本包含了启动SpringBoot项目的命令。
在windows上,后台启动SpringBoot项目貌似就比较尴尬,没有那么好用的命令来后台启动项目。有着以下的缺点:
需要打开命令行窗口输入命令行才可运行,很不方便(或需要编写.bat文件)
需要停止程序时只能在任务管理器中结束,并且多个这样程序运行时无法从进程名中进行区分(或需要编写.bat文件)
服务启重启后,程序无法实现自启动
打成war包放到Tomcat等web容器中就浪费了SpringBoo ...
存储过程的概念
一、存储过程的概念
存储过程(procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行;
存储过程中可以包含逻辑控制语句和数据操纵语句(增删改查),它可以接受参数、输出参数、返回单个或多个结果集以及返回值;
由于存储过程在创建时就在数据库服务器上进行了编译并存储在数据库,所以存储过程运行要比单个的SQL语句块要快;
同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
二、存储过程的优、缺点2.1 优点
通过把多条SQL语句封装在简单易用的单元中,简化复杂的操作存储过程创建后,可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句;
提高性能。使用存储过程比使用单独的SQL语句要快,如果某一操作包含大量的SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多;
安全,调用者只需要知道如何调用指定的存储过程即可,而不用关心存储过程的内容,防止SQL注入;
存储过程减轻网络流量,对于针对同一个数据库对象的操作,这一操作所涉及到的T-SQL语句 ...
项目中连接SQLServer出现"The server selected protocol version TLS10 is not accepted by client preferences [TLS12]"的问题
一、遇到时的场景我在开发环境时,连接SQLServer数据库并没有出现问题。但到了生产环境,要将项目打包发布到服务器运行时,发现运行不成功,打开日志文件查看,便出现了:
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS12]”
意思是数据库服务端的协议版本是TLS10,而客户端协议版本是TLS12
二、解决通过百度解决了该问题(万能)
问题大概就在于我开发环境时所使用的JDK和服务器所上使用了JDK版本不一致,但也有可能是JDBC版本、数据库的版本的问题。
需要在你的设备上找到jdk的安装目录【\Java\jdk1.8.0_291\jre\lib\security】下的java.security改改安全协议的配置即可。删掉这两个:TLSv1、TLSv1.1。
特别要注意的是,如果你是选择了jre的运行环境来运行,那就是这个目录【\jre1.8.0_291\lib】 ...
Nacos学习总结
一、概述
Nacos 官网地址:https://nacos.io
我们先进入它的官网看看,官网说的很清楚了Nacos的2个核心能力
服务发现
配置管理
所以Nacos可以作为:
服务注册中心
Nacos 支持基于 DNS 和基于 RPC 的服务发现
服务提供者使用原生SDK、OpenApi注册 Service 后,服务消费者可以使用DNS TODO或HTTP&API查找和发现服务
Nacos提供对服务的健康监测,阻止向不健康的服务或者实例发送请求
配置中心
动态配置服务可以让使用者以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易
其他:
Nacos支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
—般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择A ...
lambda 表达式中使用的变量如何一定要有final修饰?
lambda 表达式中使用的变量如何一定要有final修饰?一、场景描述最近在使用和学习Java的多线程池,而在使用单线程线程池SingleThreadExecutor是出现了问题。
编译报错:Variable used in lambda expression should be final or effectively final
这句话的意思是,lambda 表达式中使用的变量应该是 final 或者有效的 final
二、解决方案123456789public static void main(String[] args) { // 创建一个单线程版的线程池 ExecutorService es = Executors.newSingleThreadExecutor(); // 使用 for(int i=0;i<10;i++){ int finalI = i; es.execute(() -> System.out.println(Thread.currentThread().getName() ...