K8s部署Ragflow后,知识库解析问题排查记录
***环境***:K8s 命名空间 ragflow,镜像 infiniflow/ragflow:v0.27.0
***入口***:http://10.0.90.121:26052(NodePort → 容器内 Nginx 1.31.3)
***时间***:2026-08-24 ~ 2026-08-25
***结果***:API 502 与文档解析卡住均已恢复
—
## 1. 问题现象
连续出现两件表面不同、根因相同的故障。
### 1.1 接口 502
删除主 Pod 后新 Pod 很快变为 1/1 Running,但:
curl http://10.0.90.121:26052/api/v1/system/version
HTTP/1.1 502 Bad Gateway
Server: nginx/1.31.3
MySQL / Redis / MinIO / Infinity 均为 Running,容易误判为「服务已正常」。
1.2 知识库解析卡住创建知识库、解析文档时,进度长期停在:
0 tasks are ahead ...
RAGFlow 502 Bad Gateway 排查总结
环境:K8s 命名空间 ragflow,镜像 infiniflow/ragflow:v0.27.0入口:http://10.0.90.121:26052(NodePort → 容器内 Nginx)时间:2026-08-24
1. 现象删除主 Pod 后新 Pod 很快变为 1/1 Running,但外部接口不可用:
1234567kubectl delete pod ragflow-56d494b667-znbkr -n ragflowkubectl get pods -n ragflow -w# ragflow-56d494b667-8nl8l 1/1 Runningcurl -v http://10.0.90.121:26052/api/v1/system/version# HTTP/1.1 502 Bad Gateway# Server: nginx/1.31.3
依赖组件(MySQL / Redis / MinIO / Infinity)均为 Running,容易误判为「服务已正常」。
2. 定位过程2.1 初步排查:调整 N ...
Ragflow-K8s部署流程
K8s(Kubernetes )是一个分布式的容器的管理平台,提供:
负载均衡:将流量合理的分配到不同节点的容器上,从而使部署稳定。
存储管理:自动挂载你选择的存储系统,例如本地存储、公共云提供商等
自动部署和回滚:每次部署会分配一个版本号,创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动分配资源(装箱计算):配置容器需要的 CPU 和内存 (RAM),K8s可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复:Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
密钥存储和管理:允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
ragflow官方有提供单机部署的镜像,这里推荐使用Ragflow官方仓库中的helm进行部署
修改配置文件(values.yaml)1234567891011121314151617181920212223242526272 ...
ssh连接deepin虚拟机
开启ssh服务1234567891011121314安装SSH服务$ sudo apt install openssh-server 确认是否启动$ ps -e | grep ssh如果看到sshd那说明ssh-server已经启动了配置端口$ sudo vim /etc/ssh/sshd_config#Port 22 处即为修改端口的地方,将Port 22和0.0.0.0解除注释然后重启SSH服务:sudo /etc/init.d/ssh stopsudo /etc/init.d/ssh startsudo /etc/init.d/ssh restart
其他命令123456789101112131415161718192021222324其他命令命令 解释 备注sodo ssh -V 查看openssh-server版本 sudo /etc/init.d/ssh status 查看openssh-server状态 service sshd status 查看openssh-server状态 service sshd start 启动openssh-server服务 service ...
knn回归
knn同样可应用于回归问题:
找出一个样本的k个邻居,把邻居的属性的平均值赋给该样本。
缺点:
对具有很多特征(几百甚至上千)的数据集效果不好
对于特征中包含很多零的稀疏矩阵效果尤其不好
注意:
k值越大,对噪声越不敏感,但可能造成欠拟合;k值越小,容易造成过拟合
生成训练数据生成0-5范围内的随机值,这里生成40个值12n_dots=40X=5*np.random.rand(n_dots,1)
余弦函数生成测试数据,使用ravel处理成一维数组1Y=np.cos(X).ravel()
加入噪声1Y+=0.2*np.random.rand(n_dots)-0.1
训练模型1234from sklearn.neighbors import KNeighborsRegressork=5knn=KNeighborsRegressor(n_neighbors=k)knn.fit(X,Y)
生成预测数据均匀分布在0-5之间的包含500个数字的一维数组,对一维数组增加一个新的维度,变成二维数组,:在前面指的是为每个元素添加,:在后面指的是为所有元素添加
1T=np.linspace(0 ...
stream数据收集
输出流中的元素创建测试数据1List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
顺序输出
使用foreach输出,将里面函数应用每个元素
1stream.forEach(System.out::println);
传统迭代器输出
12345Iterator<Integer> iterator=stream.iterator();while (iterator.hasNext()) { String name = String.valueOf(iterator.next()); System.out.println(name);}
并行流的情况
1list.parallelStream().forEachOrdered(System.out::println);
并行输出任意顺序遍历所有元素
1list.parallelStream().forEach(System.out::println);
收集流中的数据生成指定类型的集合1Integ ...
optinal的创建、转化流
前面我们一直使用给到的Optional对象进行操作,今天实现自行创建和转化流
创建optional流生成一个optional,如果传入的值为空,则返回空optional对象1Optional<String>optionalelse=Optional.ofNullable("b");
生成一个optional,如果传入的值为空,生成一个optional,如果传入的值为空,则抛出空指针异常1Optional<String>optional=Optional.of("a");
生成一个空的optional1Optional<String>empty=Optional.empty();
生成一个由多个optional组成的optional流flatmap会将流组合起来,如果流为空,忽略,不为空则组合
1Optional<String>result= Optional.of("a").flatMap(s->Optional.of("b"));
option ...
optional<T>的消费、获取、管道化
optional对象为一个包装类对象,它被当做一种更安全的方式引用类型T
创建一个Optional实例,它包装了一个非null的值123String a="h/e/l/lo";List<String> b=new ArrayList<String>();Optional<String> stringOptional= Arrays.stream(a.split("/")).findFirst();
获取optional的值获取值,指定默认值1String result=stringOptional.orElse("default");
获取值,计算默认值(它返回一个字符串,表示获取 Java 版本。)如果Optional实例有值则对其执行调用给定的操作,如果Optional实例为空,则不执行任何操作1String result_1=stringOptional.orElseGet(()->System.getProperty("java.version"));
...
stream的结束
stream的约简stream只有在约简后才能结束,且返回Optional对象
创建示例stream流1String[] a=new String[]{"a","B","c"};
统计数量1Long count = Arrays.stream(a).count();
取最大值(忽略大小写或考虑大小写)返回Optional对象12Optional<String>maxIgnoreCase=Arrays.stream(a).max(String::compareToIgnoreCase);Optional<String>max = Arrays.stream(a).max(String::compareTo);
取最小值1Optional<String>min=Arrays.stream(a).min(String::compareToIgnoreCase);
查找第一个满足特定条件的元素1Optional<String>first=Arrays.stre ...
索引失效的十个场景
1. 准备工作所谓空口无凭,如果我直接把索引失效的这些场景丢出来,可能没有任何说服力。
所以,我决定建表和造数据,给大家一步步演示效果,尽量做到有理有据。
我相信,如果大家耐心的看完这篇文章,一定会有很多收获的。
1.1 创建user表创建一张user表,表中包含:id、code、age、name和height字段。
1234567891011解释CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `code` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL, `age` int DEFAULT '0', `name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL, `height` int DEFAULT '0', `address` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_c ...
knn分类案例
knnk近邻算法,依据少数服从多数。根据已经被正确分类的邻居预测
选择k个邻居中,较大数量的一类
123456789101112131415161718192021222324252627282930313233343536373839404142from sklearn.datasets._samples_generator import make_blobsimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.neighbors import KNeighborsClassifier#中心点centers=[[-2,2],[2,2],[0,4]]#n_samples:生成样本的数量#centers:生成中心位置和所需生成样本的个数]#random_state:随机数种子,未指定情况下,随机生成,每次生成结果不同#cluster_std:每个簇的方差,指明生成点的分散程度#X为生成的样本特征,Y为样本簇类别,两者长度相同#训练集X,Y=make_blobs(n_samples=100,centers=centers ...
stream流的创建和转化
测试数据123456List<String> a=new ArrayList<>( Arrays.asList("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")); String[] arr=new String[] {"a",&quo ...
Personalized Federated Recommendation via Joint Representation Learning, User Clustering, and Model Adaptation
文章针对其他联邦学习框架存在的问题,包括:
中央服务器需要和所有节点进行通信,对于计算性能较差的节点性能负担大,整个框架的通信成本高
各个节点共用一个全局模型,未考虑节点的个性化需求(非独立同分布的用户任务数据)
提出了对应的解决方案(PerFedRec framework):
框架由两部分组成,user-side 端到端本地推荐网络和server-side聚合器组成。
user-side 端到端本地推荐网络分为三部分,负责原始数据编码的Raw Embedding Model、Local GNN Model(图卷积网络,文章实验中使用了Light GCN)、Personalized Prediction Module(生成预测模型)
在Raw Embedding Model中,文章基于用户属性信息、item 信息,使用attention机制,将用户与item的协作信息结合(文章未详细说明结合信息,猜测根据接单频次,对不同类型任务进行了降权重等操作),训练过程中,用户embeddings本地存储,item embeddings全局共享。
在Local GNN Model中,文章将用户em ...
vue表格动态匹配列表数据
业务场景:
数据隶属于区域之下,区域分为二级,分别为一级区域和二级区域,二级区域隶属于一级区域。存放该数据的数据库表,每条记录和其关联的一级区域、二级区域的id做关联。
现要将数据在前端页面统一管理,并将区域id显示为区域名称;
初始表格渲染数据的写法为:
后端接口查询数据库记录,根据数据记录关联的各个id查询对应区域数据库表的数据,在接口中将区域名称等信息返回给前端,前端直接渲染区域名称字段,代码如下:
12345678910111213141516171819202122<el-table :data="overviewTableData" style="width: 100% ;" size="small" :header-cell-style="{ background: '#F8F8F9', color: '#606266' }" height="83vh" ...
空间众包中联邦任务分配的个性化位置偏好学习
文章内容文章主要有两部分,首先基于用户历史的任务轨迹和对应的时间节点,进行位置偏好建模和模型训练,得到用户空间偏好,期间通过联邦学习保证隐私;其次基于上一步预测的用户偏好,把当前任务集合推荐给在线的工人,同时实现推荐任务数量的最大化。
在任务分配期间,文章对与预测到的偏好位置任务目的地距离近的任务分配更大的权重,并基于权重对任务作优先级排序,将任务匹配问题转换为最大权值匹配问题,并构造无向二部图,通过location-aware KM算法实现任务匹配。
在训练本地模型时,文章随机采样了部分的本地数据,使得训练结果不能准确地表示用户的位置偏好;文章使用中央服务器完成各个本地模型的整合,同时中央服务器负责将训练好的模型分发到各个平台。负责整合、训练、通信的中央服务器有出现单点故障、受攻击的风险,会导致系统的可用性降低,存在安全隐患。同时,文章并没有明确训练本地模型的主体、时间,是自动周期性训练还是需要用户主动参与训练,如果是用户主动训练,是否加入相应的激励机制。
每日设计模式-桥接模式
设计实现桥接模式,通过将一个相关的大类,拆分出抽象和实现两个层次,两个层次相互独立,抽象为通用的接口,各个实现类可根据自己的实际情况,采用不同的技术细节实现通用接口功能。
比如:在设计一套GUI组件时,需要对不同的操作系统作适配
传统方式:针对不同的系统,各自设计一套组件;针对红色按钮、蓝色按钮、白色按钮,各自写一套代码去实现。
桥接模式:针对GUI所要包含的组件,拆分抽象和实现两个层次;设计一套通用接口,不同的操作系统只需要实现接口要求的功能,不同操作系统上的使用者使用相同的代码,即可得到想要的组件。
具体实现控制电视机、收音机,需要不同的控制器,且同一种设备的控制器仍然不同,比如a厂家的控制比较高级,功能多,能控制电视机闪烁;b厂家的控制器比较基础,只能控制开关。
Device-抽象
1234567891011121314151617package com.lcf.demo.pattern.bridge.devices;public interface Device { void open(); void down(); boolean isOpen ...
FedCrowd,区块链联合和隐私保护众包平台 | 基于区块链物联网设备联邦学习系统
文章提出了一个基于以太坊的,能够将孤立的众包平台任务资源联合起来,并实现准确的任务推荐,且保证共享和推荐过程隐私安全的可信平台。
当前存在的问题:
各个众包平台相互独立,无法将计算资源集中,任务推荐的范围具有局限性,任务请求者无法获取到充分且准确的任务资源。
众包平台采用集中式的部署方式,容易受到单点故障和恶意攻击的影响
其中,借助区块链去中心化的特性解决第二种问题;关于第一种问题,文章设计了一种任务资源共享流程,并提出了针对该流程的任务匹配协议,采用将代理重加密和双线性配对混合的方式,实现在不共享密钥的情况下,对加密后的任务索引进行匹配。
该文章设计的任务资源共享流程如下:
概括来说,是将上传者的任务原文,加密后仍然存放在原有的众包系统中,文章称之为代理人。同时将标识任务类别的标签等信息,由代理人服务器进行重加密,将密文转换为同一个格式的加密任务索引,嵌入到智能合约。工人在查询任务时,将加密关键字发送到代理人服务器,代理人服务器在进行重加密后,利用智能合约中嵌入的索引进行双线性匹配,匹配成功后,将匹配结果记录到区块链中,最后工人可根据查询推荐结果,向对应的代理请求任务。
文章在平 ...
机器学习案例-鸢尾花分类
案例简介使用Sklearn-learn机器学习模块提供的鸢尾花数据集
案例代码1234567891011121314151617181920212223import numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_iris#将数据分为训练集和测试集,训练鞋用于训练模型,测试集用户评估模型的性能,使用train_test_split(),将random——state设置随机值,可保证每次分的训练集和测试集数据比例一致iris_dataset=load_iris()X_train,X_test,Y_train,Y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)print("X_train:{}".format(X_train[:10]))print( ...
每日设计模式-适配器
设计实现适配器模式 往往用在新代码和老代码相互合作上。
首先以圆孔适配圆钉,圆孔不适配方钉为例,建立圆钉适配器,参数为方钉,从而使得圆孔也能适配方钉;圆钉和圆孔相当于老代码,方钉相当于新代码,适配器可以使得,新代码方钉和老代码圆孔相互合作。
代码实现RoundPeg
包含有参无参构造函数,获取圆钉直径的方法。
123456789101112131415public class RoundPeg { private int radis; public int getRadis() { return radis; } public RoundPeg(int radis) { this.radis = radis; } public RoundPeg() { }}
RoundHole
包含有参和无参构造函数,获取圆孔直径的方法,以及检查钉子适配圆孔的方法
123456789101112131415161718192021public clas ...
每日设计模式-原型模式
java中应用java中继承cloneable接口,可以实现clone;
设计实现继承同一个父类,父类拥有公共的参数,父类定义抽象方法 clone()子类实现自己的有参、无参构造方法,有参构造方法,有参构造方法传入克隆的目标对象,一方面使用super构造父类,一方面对自己特有的参数赋值,最终clone(),返回new 构造方法(this)
父类-shape
12345678910111213141516171819202122232425package com.lcf.demo.pattern.prototype;public abstract class Shape { public int x; public int y; public String color; public Shape(){ } public Shape(Shape target){ if(target!=null){ this.x=target.x; this.y=t ...
记录一次云服务器部署环境搭建
记录一次云服务器部署环境搭建需求将sprinboot项目、vue项目部署到云服务器
技术栈:springBoot sprinbSecurity mybatis-plus vue gradle docker nginx git node jdk
操作系统:Ubuntu 22.04
ssh工具:Tabby
安装必要软件Node和npm从 Ubuntu 软件源安装 Node.js 和 npm在写作的时候,包含在 Ubuntu 20.04 软件源中的 Node.js 版本是12.22.9,这是一个长期版本。
安装非常直接。运行下面的命令更新软件包索引,并且安装 Node.js 和 npm:
12sudo apt updatesudo apt install nodejs npm
上面的命令将会安装一系列包,包括编译和安装从 npm 来的本地扩展。
一旦完成,运行下面的命令,验证安装过程:
12root@hecs-296785:~# node -vv12.22.9
jdk1):官方下载对应的.gz包,这里以jdk-8u181-linux-x64.tar.gz为例
2):创建一个目录用于存 ...
解决docker与服务器时间不一致问题
问题描述部署在docker上的web程序,获取当前时间时,与服务器时间相差四个多小时
解决方法
在dockfile中加
12345# 添加时区环境变量,亚洲,上海ENV TimeZone=Asia/Shanghai# 使用软连接,并且将时区配置覆盖/etc/timezoneRUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
修改后的dockerfile文件
123456789FROM openjdk:8MAINTAINER lcf# 添加时区环境变量,亚洲,上海ENV TimeZone=Asia/Shanghai# 使用软连接,并且将时区配置覆盖/etc/timezoneRUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezoneADD boss-server.jar boss-server.j ...
springboot+gradle+docker+nginx项目部署到ubuntu云服务器.md
安装gradle
下载,解压到指定目录
1234wget https://downloads.gradle-dn.com/distributions/gradle-7.4-bin.zip unzip -d /opt/gradle gradle-7.4-bin.zip #查看是否解压成功 ls /opt/gradle/gradle-7.6
配置环境变量
123sudo vim /etc/profile.d/gradle.shsudo chmod +x /etc/profile.d/gradle.shsource /etc/profile.d/gradle.sh
gradle.sh文件内容
12export GRADLE_HOME=/opt/gradle/gradle-7.4export PATH=${GRADLE_HOME}/bin:${PATH}
验证安装
1gradle -v
构建jar包
配置文件-build.gradle 文件
12345678910111213141516171819202122232425262728293031 ...
使用Vanta.js实现动态背景
介绍anta.js可以为网站设置炫酷的动态背景 比如在网站登陆的首页,可以与普通JS、React、Angular、Vue等一起使用
官网 Vanta.js - Animated 3D Backgrounds For Your Website
安装three.js 依赖和Vanta JS 依赖12npm i threenpm i vanta
整体代码123456789101112131415161718192021222324252627282930<div ref="vantaRef" id="vantaRef" style="width:100%;height:100vh"></div>import * as THREE from 'three'import NET from 'vanta/src/vanta.net'mounted() { this.vantaEffect = NET({ el: this.$refs.va ...
将智能合约部署到通道
启动测试网络1cd fabric-samples/test-network
1./network.sh down
1234创建一个默认通道mychannel、两个通道成员Org1 和 Org2,将属于每个组织的peer加入通道./network.sh up createChannel 如果网络和通道创建成功,您可以在日志中看到以下消息========= Channel successfully joined ===========
第一步:打包链码(以go语言编写的智能合约为例)123456789101112131415161718cd fabric-samples/asset-transfer-basic/chaincode-java-userjava-安装依赖bash gradlew installDist使用peerCLI 构建链代码包,以下命令将这些二进制文件添加到您的 CLI 路径export PATH=${PWD}/../bin:$PATH设置FABRIC_CFG_PATH指向存储库中的core.yaml文件fabric-samplesexport ...
网页图片下载-同源或非同源
同源图片下载
html中可以这样写
1<a href="./img/logo.png" download="logo.png"></a>
javascript中可以这样写
12345678910function imgDownload(url,name){ //创建一个a标签 const a_b = document.createElement('a'); //设置href指向 a_b.href = url; //设置图片下载名字 a_b.download = name; //点击a标签 a_b.click()}
非同源图片下载方案通过axios请求来实现图片下载
12345678910111213141516171819function downloadByAxios(url,name){ axios({ //设置图片路径 url:url, //设置请求方法为get请求 method:'get', //设置相应类型为blob ...
vue添加背景水印效果
项目中新建一个 watermark.js 文件123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778let watermark = {};let setWatermark = (text, sourceBody) => { let id = Math.random() * 10000 + "-" + Math.random() * 10000 + "/" + Math.random() * 10000; if (document.getElementById(id) !== null) { document.body.removeChild(document.getElementById(id)); } let ...
如何打印html中的图片
打印html中的图片浏览器 window 对象提供了 print 方法,就可以对整个页面进行打印。只需要点击按钮执行以下方法即可。
12js复制代码window.print()
调用此方法,会打印出整个 html 里的内容,即 document 对象下所有的页面节点。而我们需要的是只打印页面的某个元素部分,即只打印图片。
浏览器在 具体的dom 节点上并没有部署 print 方法,不过我们可以转变个思路,我们可以将需要打印的元素提取出来,同时构造一个新的window对象,将提取出来的元素插入到这个window对象下,再调用打印即可。
html1234567<div id="box"> <el-image style="width: 300px; height: 300px;" :src="imageUrl" :fit="fit"> </el-image> ...
负载均衡
实现请求负载均衡配置多个目标服务器,当一台服务器出现故障时,nginx 能将请求自动转向另一台服务器
123456789101112131415161718192021222324252627282930313233http { sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。 upstream mysvr { server 127.0.0.1:7878 weight=2; server 192.168.10.121:3333 backup weight=1; #根据权重进行轮询负载均衡 } error_page 404 https://www.baidu.com; #错误页 server { keepalive_requests 120; #单连接请求上限次数。 ...
windows下静态资源代理
静态资源访问配置windows下
1234567891011121314151617181920212223242526272829303132333435363738394041server { keepalive_requests 120; #单连接请求上限次数。 listen 9090; #监听端口 server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 #root path; #根目录 #index vv.txt; #设置默认页 proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0.0.1; #拒绝的ip allow 172.18.5.54; #允许的ip # ...
反向代理
nginx的proxy_pass配置路径,加与不加“/”差异巨大1.1 绝对路径123location /proxy { proxy_pass http://192.168.137.181:8080/;}
当访问 http://127.0.0.1/proxy/test/test.txt时,nginx匹配到/proxy路径,把请求转发给192.168.137.181:8080服务,实际请求路径为 http://10.0.0.1:8080/test/test.txt,nginx会去掉匹配的“/proxy”。
1.2 相对路径123location /proxy { proxy_pass http://10.0.0.1:8080;}
当访问 http://127.0.0.1/proxy/test/test.txt时,nginx匹配到/proxy路径,把请求转发给192.168.137.181:8080服务,实际请求代理服务器的路径为 http://192.168.137.181:8080/prox ...
BCryptPasswordEncoder使用
BCryptPasswordEncoder使用 在 Spring Security 中有一个加密的类 BCryptPasswordEncoder ,它的使用非常的简单而且也比较有趣。让我们来看看它的使用。
首先创建一个 SpringBoot 的项目,在创建项目的时候添加 Spring Security 的依赖。然后我们添加一个测试类,写如下的代码:
12345678910111213final private String password = "123456";@Testpublic void TestCrypt(){ BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encode1 = bCryptPasswordEncoder.encode(password); System.out.println("encode1:" + encode1); String encode2 = bCr ...
JwT的工作流程
什么是JWT?JWT是Json Web Token的缩写。它是基于 RFC 7519 标准定义的一种可以安全传输的 小巧 和 自包含 的JSON对象。由于数据是使用数字签名的,所以是可信任的和安全的。JWT可以使用HMAC算法对secret进行加密或者使用RSA的公钥私钥对来进行签名。
JWT的工作流程下面是一个JWT的工作流程图。模拟一下实际的流程是这样的(假设受保护的API在/protected中)
用户导航到登录页,输入用户名、密码,进行登录
服务器验证登录鉴权,如果改用户合法,根据用户的信息和服务器的规则生成JWT Token
服务器将该token以json形式返回(不一定要json形式,这里说的是一种常见的做法)
用户得到token,存在localStorage、cookie或其它数据存储形式中。
以后用户请求/protected中的API时,在请求的header中加入Authorization: Bearer xxxx(token)。此处注意token之前有一个7字符长度的 Bearer
服务器端对此token进行检验,如果合法就解析其中内容,根据其拥 ...
hexo+typra+picgo+gitee搭建博客写作环境
博客使用hexo,部署在github page,Typora支持markdown非常棒,但是图片之类的无法直接上传到云端,因为它的图片是本地的,这几天看到网上有介绍Typora设置免费的图床(gitee),而且图片粘贴上去,直接自动上传到图床生成链接,这样将md文件发给别人,再也不用担心图片无法正常显示的问题了。设置好之后,写一篇教程,记录一下。
安装下载PicGo山东大学镜像站 https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/,选择最新版本下载
新建gitee仓库-生成令牌新仓库要初始化readme!!!
在PicGo设置图床参数repo:用户名/网址仓库名,并设置为默认图库
设置typra12345hexo new post "xxx"hexo chexo ghexo shexo d
动态监听搜索实现
需求是怎样的因为数据条数过多,用户要求新增搜索功能
实际如何做面板头部头部空间有限,再加之考虑美观性,决定通过动态监听搜索框内所输入的数据,展示匹配结果。因为监听变量位于对象内,故采用深度监听。
两种监听方式普通监听12345678910111213141516<template> <div></div></template><script> export default { data(){ variable:null, }, watch:{ // 此处监听variable变量,当期有变化时执行 variable(item1,item2){ // item1为新值,item2为旧值 } } }</script>
深度监听(变量在对象内)一个变量12345678910111213141516171819<template> <div></div></templat ...
sql条件查询
sql条件查询-使用like,实现模糊查询,子查询1234SELECT MAX( ctime ) AS max_ctime FROM ( SELECT ctime FROM alarm_monitor WHERE alarm_status = 'true' AND is_under like '%0' ) as a
使用自定义值,默认查询所有12set @pos=""select * from user where (name=@pos or @pos="")
关于mysql大小写敏感问题
1.决定大小写是否敏感的参数在 MySQL 中,数据库与 data 目录中的目录相对应。数据库中的每个表都对应于数据库目录中的至少一个文件(可能是多个文件,具体取决于存储引擎)。因此,操作系统的大小写是否敏感决定了数据库大小写是否敏感,而 Windows 系统是对大小写不敏感的,Linux 系统对大小写敏感。
默认情况下,库表名在 Windows 系统下是不区分大小写的,而在 Linux 系统下是区分大小写的。列名,索引名,存储过程、函数及事件名称在任何操作系统下都不区分大小写,列别名也不区分大小写。
除此之外,MySQL 还提供了 lower_case_table_names 系统变量,该参数会影响表和数据库名称在磁盘上的存储方式以及在 MySQL 中的使用方式,在 Linux 系统,该参数默认为 0 ,在 Windows 系统,默认值为 1 ,在 macOS 系统,默认值为 2 。下面再来看下各个值的具体含义:
Value
Meaning
0
库表名以创建语句中指定的字母大小写存储在磁盘上,名称比较区分大小写。
1
库表名以小写形式存储在磁盘上,名称比较不区分大小写 ...
每日总结-8.10
出现的问题
使用springboot自动注入,没有引用接口,而是直接引用的类,导致在类名修改的时候,要寻找到引用类名的地方,在修改类名
不同数据库表的pojo类复用,导致后期在数据库表的数据相差较大时,还需再次定义对应的pojo类,此时大量的逻辑都是针对之前的pojo类操作,导致代码改动较大
在编写dao层时,对于方法的通用性考虑不足,不符合开闭原则,例如在传参时,固定传参某个对象
1List<PatrolArea> queryFirstAreaByAreaId(PatrolDevice patrolDevice)
造成如果此时有另一对象同样含有areaid,那么需要再写一个方法去适应这种变化,
改进方案
将传参类型变为基础类型
1List<PatrolArea> queryFirstAreaByAreaId(String id)
或者将传参改为接口,只要实现接口,都可以作为参数被传入,如果实现类中没有查询条件,也就是areaid,那么查询就会出错,此时需要在接口中实现赋值方法
12345class PatrolArea implements inte ...
接口改造多线程
采用共享变量+Callable的方式需求:将同步代码改成多线程
原始同步代码如下:
1234567891011121314151617181920 JSONObject resultJson=new JSONObject();//查询该用户是否存在该任务 patrolDevice.setHead_people_id_number(userService.getUserDetailAndCheckIdNumber(token)); List<PatrolDevice> results=patrolDeviceDao.queryDeviceByObjectNoPagination(patrolDevice); if(results.isEmpty() || results.size()>1){ throw new MissingArgumentException("本设备不属于当前登录人员的巡检任务"); } PatrolDevice resultD ...
分布式锁
线程锁给方法、代码块加锁,某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等
进程锁控制同一个系统中多个线程访问同一个共享资源,因为程序的独立性,各个进程无法控制其他进程对资源的访问,可以利用操作系统的信号量机制
分布式锁多个进程不在同一个系统中,使用分布式锁控制多个进程对同一资源的访问
特性
互斥性:任意时刻,只能有一个客户端可以获取锁
安全性:: 锁只能被持有该锁的客户端删除,不能由其它客户端删除
死锁: 获取锁的客户端因为某些原因(如down机等)而未能释放锁,其它客户端再也无法获取到该锁。
容错:当部分节点(redis节点等)down机时,客户端仍然能够获取锁和释放锁
实现分布式锁的三种方式
基于缓存(Redis等)实现分布式锁;
基于数据库实现分布式锁;
基于Zookeeper实现分布式锁;
基于Redis的分布式锁利用SETNX和SETEX使用key-value的方式,以数据的某个属性作为键,给改代码块或者对象加锁。在进程初次 ...
