当前位置: 首页 > news >正文

K8S + Jenkins 做CICD

前言

这里会做整体CICD的思路和流程的介绍,会给出核心的Jenkins pipeline脚本,最后会演示一下 实验/实操 结果
由于整体内容较多,所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用
要看保姆式教学的可以划走了,没有K8S基础的也可以划走了

正文

1. 整体实现思路

  1. 在K8S集群中部署Jenkins服务(我这里实验用的是 Jenkins 2.486版本),给Jenkins分配对应的NFS、PV、PVC、SA、NS、SVC等资源,挂载Jenkins配置文件到服务器
  2. 在Jenkins中安装 kubernetes、blue ocean 插件
  3. 配置Jenkins和K8S集群正常通信
  4. 配置 pod template - 这里的 pod template 实际上就是对 Jenkins agent(以前叫 Jenkins slave) 的配置,用于完成git代码拉取、mvn打包、docker镜像上传等操作
  5. 新建流水线任务,加入自己的pipeline脚本

CICD流程:

  1. 开发提交代码到代码仓库 gitlab/github/gitee - 我这里用的github
  2. 开启任务 -> jenkins 检测到代码更新,调用 k8s api 在 k8s 中创建 jenkins slave pod
  3. Jenkins slave pod 拉取代码,通过 maven 把拉取的代码进行构建成 war 包或者 jar 包,上传代码到 Sonarqube,进行静态代码扫描
  4. 基于 jar 包构建 docker image,把镜像上传到镜像仓库 harbor 或 dockerhub - 我这里用的 dockerhub
  5. 基于镜像部署应用到开发环境
  6. 开发人员自测通过,在blue ocean 流水线中操作,发布到测试环境
  7. 测试团队测试通过,发布到生产环境

2. 插件简介

2.1 Kubernetes插件简介

Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Slave Pod 代理来执行任务。
该 Slave Pod 中可以包含多种镜像,例如需要 Maven 编译可以使用 Maven 镜像执行任务。使用 NPM编译则可以使用 NPM镜像。操作 Kubernetes 可以使用 Kubectl 插件镜像。
所有 Job 中所需要的环境及其依赖都交由镜像提供,而不需要手动搭配这些环境。在 Slave Pod 执行完 Job 任务后,该Slave Pod将会自动删除。所以 Kubernetes Plugin 简单用法就是,在 Kubernetes 中启动 Jenkins Slave 代理,让代理执行 Jenkins Job,执行完后释放删除 Slave 释放资源。

Kubernetes插件使用 - Kubernetes Plugin的配置主要有两部分组成:

  • kubernetes的连接参数:主要用于配置如果连接kubernetes
  • kubernetes的pod模板:调用kubernetes创建jenkins slave使用的pod模板

在这里插入图片描述

2.2 Blue Ocean 插件简介

Blue Ocean 是 Jenkins 的一款现代化 UI 插件,旨在为持续集成/持续交付 (CI/CD) 提供更加直观、用户友好的界面和体验。

  • 全新的可视化流水线体验
    • Blue Ocean 提供了流水线运行过程的直观可视化,用户可以清晰地查看流水线的各个阶段(stage)、步骤(step)及其状态(成功、失败、运行中)。
    • 支持图形化展示流水线的分支、并行任务及错误点,便于快速诊断和调试。
  • 简化的流水线创建和编辑
    • 内置交互式流水线编辑器,支持通过拖放操作创建 Jenkinsfile,降低了学习曲线。
    • 用户无需编写复杂的脚本即可快速配置和生成流水线代码。
  • 强大的分支支持
    • 专为 Git 和其他分布式版本控制系统的多分支流水线设计。
    • 自动检测代码仓库中的分支和 Pull Request,独立运行每个分支的流水线任务。
  • 高效的协作能力
    • 在失败的任务或构建上添加评论,方便团队成员进行问题协作和修复。
    • 支持通过直观的界面查看构建日志、失败原因以及历史记录。
  • 插件生态集成
    • 与 Jenkins 的现有插件(如 Git、GitHub、Bitbucket、Docker 等)无缝集成。
    • 支持各种通知机制(如邮件、Slack、Webhook)来增强 CI/CD 流程。
  • 跨平台友好
    • 适配桌面端和移动端,用户可以随时随地查看流水线状态。
      在这里插入图片描述

3. pipeline脚本示例

env.BRANCH_NAME = 'master'
node('devops') {stage('Clone') {echo "1.下载代码"withCredentials([usernamePassword(credentialsId: 'github', usernameVariable: 'gitHubUser', passwordVariable: 'gitHubToken')]) {git url: "https://${gitHubUser}:${gitHubToken}@github.com/cqweiheng/myspringboot.git"}script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}}stage('Test') {echo "2.代码扫描"}stage('Build') {echo "3.构建docker镜像"	// 执行 Maven 构建,生成 jar 文件sh 'mvn clean package -Dmaven.test.skip=true'// 打包成镜像sh "docker build -t cqweiheng/test:myspringboot-${build_tag} ."}stage('Push') {echo "4.推送镜像"withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"// 这里可以改用 harbor//sh "docker login 192.168.86.100 -u ${harborUser} -p ${harborPassword}"sh "docker push cqweiheng/test:myspringboot-${build_tag}"}}stage('Deploy to dev') {echo "5.发布到 dev 环境"sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"sh "cat k8s-dev.yaml"sh "kubectl apply -f k8s-dev.yaml"sh "sleep 10"sh "kubectl get pods -n dev"}	stage('Deploy to test') {	def userSelected = input(id: 'userSelected',message: '确认发布到【测试】环境?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "确认\n取消",name: '请选择']])echo "用户选择:${userSelected}"if (userSelected == "确认") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-test.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-test.yaml"sh "cat k8s-test.yaml"sh "kubectl apply -f k8s-test.yaml"sh "sleep 10"sh "kubectl get pods -n test"} else {//exitecho "用户选择不发布到测试环境,本次部署流程终止。"currentBuild.result = 'ABORTED'error("用户选择取消发布到测试环境。")}}stage('Deploy to pro') {	def userSelected = input(id: 'userSelected',message: '确认发布到【生产】环境?',parameters: [[$class: 'ChoiceParameterDefinition',choices: "确认\n取消",name: '请选择']]// 仅允许指定用户操作 - 通过授权,仅测试团队可以操作//,submitter: 'test-user,test-group')echo "用户选择:${userSelected}"if (userSelected == "确认") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"sh "cat k8s-prod.yaml"sh "kubectl apply -f k8s-prod.yaml --record"sh "sleep 10"sh "kubectl get pods -n prod"}}
}

4. 演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在 deploy to test 这里就停住了,等待授权
开发人员在 dev 环境自测完毕后,确认发布到测试环境,由测试团队进行验证
在这里插入图片描述

发布到生产这里可以通过添加 submitter 来控制用户权限,比如仅测试团队可以提交
在这里插入图片描述
在这里插入图片描述
到这里整个流程就结束了
从下图中可以看到Jenkins slave这个 pod 生命周期结束
在命名空间 dev, test, prod 中分别生成了新的 pod
在这里插入图片描述

访问一下,自己写的一个springboot 应用 -> OK的
在这里插入图片描述

5. 闲聊

  1. 这里 svc 用的 NodePort,实际生产中如果做四层负载的话,应该会用 LoadBalance
  2. 做版本回滚的话,可以新起一个pipeline,调用shell脚本,选择版本号后进行回滚操作
    参考:
    #查看历史版本
    kubectl rollout history deployment/<deployment_name>
    #回退到指定版本
    kubectl rollout undo deployment/<deployment_name> --to-revision=<revision_number>
    
  3. 这里是用的单个集群,将开发、测试和生产环境部署在 同一个 K8S 集群中,并通过 Namespace 来区分不同环境。这种方式简单高效,但需要合理的规划和配置,确保资源隔离和环境安全性。
    比如按 namespace 做资源配额,按 单个pod 做资源限制
    #按 namespace 做资源限制
    apiVersion: v1
    kind: ResourceQuota
    metadata:name: resource-quotanamespace: dev
    spec:hard:pods: "20"                  # 最大允许 20 个 Podrequests.cpu: "4"           # 总 CPU 请求限制 4 核requests.memory: "8Gi"      # 总内存请求限制 8GBlimits.cpu: "8"             # 总 CPU 限制 8 核limits.memory: "16Gi"       # 总内存限制 16GB#按 单个pod 做资源限制 - 防止单个 Pod 占用过多资源
    apiVersion: v1
    kind: LimitRange
    metadata:name: limitsnamespace: dev
    spec:limits:- default:cpu: "500m"memory: "512Mi"defaultRequest:cpu: "200m"memory: "256Mi"type: Container
    
  4. Jenkins 的 Pipeline 可以通过不同的 kubeconfig 文件操作不同的集群。再直白点就是,可以通过 kubeconfig 文件 做服务器隔离、集群隔离的CICD 发布到dev、test、prod环境 - 当然这个我还没实际操作过
    顺带搜了一下,大约是这样做的,下面的内容仅供参考
    #1.为每个集群(dev 和 test)生成独立的 kubeconfig 文件
    kubectl config view --raw > kubeconfig-dev.yaml
    kubectl config view --raw > kubeconfig-test.yaml
    #2.将这些 kubeconfig 文件上传到 Jenkins 的凭据管理系统,确保安全性
    #在 Jenkins 中添加 kubeconfig 凭据
    #	打开 Jenkins Dashboard。
    #	进入 "Manage Jenkins" > "Credentials"。
    #	添加凭据:
    #		Kind:Secret file
    #		File:上传 kubeconfig-dev.yaml 和 kubeconfig-test.yaml。
    #		ID:分别命名为 kubeconfig-dev 和 kubeconfig-test。#3.在 Jenkins Pipeline 中使用 kubeconfig 文件
    #利用 withCredentials 加载对应的 kubeconfig 文件,动态切换集群。
    pipeline {
    agent any
    stages {stage('Deploy to Dev') {steps {script {echo "Deploying to Dev Cluster..."withCredentials([file(credentialsId: 'kubeconfig-dev', variable: 'KUBECONFIG')]) {// 使用 kubeconfig-dev 操作 dev 集群sh 'kubectl apply -f k8s-dev.yaml'sh 'kubectl get pods -n dev'}}}}stage('Deploy to Test') {steps {script {input "Confirm deployment to Test environment?"echo "Deploying to Test Cluster..."withCredentials([file(credentialsId: 'kubeconfig-test', variable: 'KUBECONFIG')]) {// 使用 kubeconfig-test 操作 test 集群sh 'kubectl apply -f k8s-test.yaml'sh 'kubectl get pods -n test'}}}}
    }
    

}
```
这种就是各集群的资源、权限完全独立,不会相互影响。即使某一环境出现问题,其他环境仍可正常工作。

适合场景
- 多集群部署:开发、测试、生产环境分布在不同的 Kubernetes 集群中。
- 跨区域服务器管理:如不同集群位于不同的云平台(阿里云、腾讯云、AWS 等)。
- 严格隔离需求:需要通过不同的 kubeconfig 文件实现权限和资源隔离。

6. 踩过的坑

6.1 FailedCreatePodSandbox - error getting clusterInfomation: connection is unauthorized

在这里插入图片描述
这个错误纠结了好久,最开始解题思路有误
看日志一直以为是授权出了问题
做了如下尝试,又检查了calico插件,发现全都是正常的
第二天Google搜了一下:
https://devopscube.com/clusterinformation-connection-unauthorized/
重启calico后OK,气不气?

#授权
kubectl create clusterrolebinding calico-access-jenkins-admin \--clusterrole=calico-kube-controllers \--serviceaccount=devops:jenkins-admin#绑定token - vim jenkins-admin-token.yaml
apiVersion: v1
kind: Secret
metadata:name: jenkins-admin-tokennamespace: devopsannotations:kubernetes.io/service-account.name: jenkins-admin
type: kubernetes.io/service-account-token
#kubectl apply -f jenkins-admin-token.yaml#验证是否生效
kubectl -n devops describe secret $(kubectl -n devops get secret | grep jenkins-admin | awk '{print $1}')
curl -k -H "Authorization: Bearer <your-token>" https://<kube-apiserver>:6443/apis/crd.projectcalico.org/v1/clusterinformations#能正常访问说明权限没有问题
kubectl --token=<your-token> get clusterinformation -o yaml

6.2 jenkins svc 没有暴露50000 端口

这个好像没什么可说的,加上就好了
在这里插入图片描述

6.3 Jenkins slave 构建镜像时提示 docker: not found

在这里插入图片描述
这个东西也搞了一阵子,后来自己基于
FROM jenkins/agent:latest
添加了 docker.io、maven-3.9.5、kubectl v1.31.2
然后打包成自己的Jenkins slave镜像使用,整个流程才正常跑通
这个镜像我推送到了 dockerhub 上,有需要的同学可以直接拿来用(不过由于版本问题,估计大概率也只有我自己用,哈哈)
镜像:cqweiheng/test:jenkins-agent-with-docker-v4

相关文章:

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…...

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…...

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...

鸿蒙开发Hvigor插件动态生成代码

Hvigor允许开发者实现自己的插件&#xff0c;开发者可以定义自己的构建逻辑&#xff0c;并与他人共享。Hvigor主要提供了两种方式来实现插件&#xff1a;基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本…...

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…...

Java String 字符串常用操作

一、Java String 字符串常用操作 1、替换 Java字符模板替换 public static final String temp"private {0} {1};";public static void main(String[] args) {System.out.println(MessageFormat.format(temp,"String","str"));} replaceAll替换…...

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象&#xff0c;在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器&#xff08;Trigger&#xff09;是由用户定义的…...

C语言——break、continue、goto

目录 一、break 二、continue 1、在while循环中 2、在for循环中 三、go to 一、break 作用是终止循环&#xff0c;在循环内遇到break直接就跳出循环。 注&#xff1a; 一个break语句只能跳出一层循环。 代码演示&#xff1a; #include<stdio.h>void test01() {for (…...

oracle数据恢复总结篇

前言:数据恢复的关键 定删除时间点&#xff1a;首先&#xff0c;需要知道是什么时间进行的删除操作。 如果不能确定具体时间点&#xff0c;可以选择尽量准确的删除数据前的时间。 oracle数据库如果使用drop指令误删除了数据应该如何恢复呢&#xff1f; 如果没有进行其他操作&…...

运维面试题.云计算面试题之四.K8S

常见的k8s运维面试题 1、简述ETCD及其特点? etcd是一个用于配置共享和服务发现的键值存储系统,能够为整个分布式集群存储关键数据,协助集群正常运转 服务端将配置信息存储在etcd中,客户端从etcd中得到配置信息,etcd监听配置信息的变化,发现配置变化通知到客户端 特点 - 安…...

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…...

C++11:多线程编程

目录 线程库基本用法创建线程给线程传递参数线程分离 常见数据未定义错误传递指针或引用指向局部变量的问题传递指针或引用指向已释放的内存的问题类成员函数作为入口函数&#xff0c;类对象被提前释放智能指针来解决该问题入口函数为类的私有成员函数 互斥量死锁 lock_guard与…...

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…...

OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具

OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具&#xff0c;由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹&#xff0c;并找出占用大量空间的文件&#xff0c;从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括&#xff1a; 简…...

【什么是Redis?】

Redis&#xff1a;高性能内存数据库的深度探索 在当今这个数据驱动的世界里&#xff0c;数据库的选择直接关系到应用程序的性能、可扩展性和可靠性。在众多数据库解决方案中&#xff0c;Redis以其卓越的性能、丰富的数据结构和灵活的使用场景脱颖而出&#xff0c;成为众多开发…...

React第十六章(useLayoutEffect)

useLayoutEffect useLayoutEffect 是 React 中的一个 Hook&#xff0c;用于在浏览器重新绘制屏幕之前触发。与 useEffect 类似。 用法 useLayoutEffect(() > {// 副作用代码return () > {// 清理代码}}, [dependencies]);参数 setup&#xff1a;Effect处理函数,可以返回…...

shell 基础知识2 ---条件测试

目录 一、条件测试的基本语法 二、文件测试表达式 三、字符串测试表达式 四、整数测试表达式 五、逻辑操作符 六、实验 为了能够正确处理 Shell 程序运行过程中遇到的各种情况&#xff0c; Linux Shell 提供了一组测试运算符。 通过这些运算符&#xff0c;Shell 程序能够…...

【线程】Java线程操作

【线程】Java线程操作 一、启动线程1.1 run()和start()的区别 二、终止线程三、等待线程四、线程的状态 一、启动线程 Java中通过start()方法来启动一个线程&#xff0c;其次我们要着重理解start()和run()的区别。 1.1 run()和start()的区别 我们通过一份代码来进行观察&…...

Linux内核

Linux内核是Linux操作系统的核心部分&#xff0c;它管理着硬件资源并提供基本的服务给用户程序。以下是Linux内核的几个关键方面&#xff1a; 1. 架构&#xff1a; 单内核设计&#xff1a;Linux采用的是单内核设计&#xff0c;这意味着所有操作系统服务都在一个地址空间内运行…...

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…...

python代码制作数据集的测试和数据质量检测思路

前言 本文指的数据集为通用数据集&#xff0c;并不单是给机器学习领域使用。包含科研和工业领域需要自己制作数据集的。 首先&#xff0c;在制作大型数据集时&#xff0c;代码错误和数据问题可能会非常复杂。 前期逻辑总是简单的&#xff0c;库库一顿写&#xff0c;等排查的时…...

笔记记录 k8s-install

master节点安装: yum upgrade -y 更新系统 yum update -y 升级内核 ifconfig ens33 关闭swap swapoff -a (临时) vim /etc/fstab (永久) #/dev/mapper/cl-swap swap swap defaults 0 0 vim /etc/sysctl.conf vm.swappin…...

丹摩征文活动|基于丹摩算力的可图(Kolors)的部署与使用

Kolors是一个以生成图像为目标的人工智能系统&#xff0c;可能采用了类似于OpenAI的DALLE、MidJourney等文本生成图像的技术。通过自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;相结合&#xff0c;Kolors能够根据用户提供的文本描述生成符合…...

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了&#xff0c;而且Vue项目就应该正经走项目流程啊喂&#xff01; npm i amap/amap-jsapi-loader --save 官方说这样执行完&#xff0c;就这结束啦&#xff01;它结束了&#xff0c;我还没有&#xff0c;不然不可能记录这篇文…...

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…...

Android中的依赖注入(DI)框架Hilt

Hilt 是 Android 提供的一种依赖注入&#xff08;DI&#xff09;框架&#xff0c;它基于 Dagger&#xff0c;目的是简化依赖注入的使用&#xff0c;提供更易用的接口和与 Android 生命周期组件的紧密集成。下面是 Hilt 的详细介绍。 为什么选择 Hilt? 依赖注入的优势&#xf…...

5.STM32之通信接口《精讲》之USART通信---实验串口接收程序

根据上节&#xff0c;我们一已经完成了串口发送程序的代码&#xff0c;并且深入的解析探索了串口的原理&#xff0c;接下来&#xff0c;Whappy小编将带领大家进入串口接收程序的探索与实验&#xff0c;并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…...

【Redis_Day6】Hash类型

【Redis_Day6】Hash类型 Hash类型操作hash的命令hset&#xff1a;设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;hsetnx&#xff1a;想hash中添加字段并设置值hget&#xff1a;获取hash中指定字段的值hexists&#xff1a;判断hash中是否…...

[开源] SafeLine 好用的Web 应用防火墙(WAF)

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击 一、简介 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注…...

40分钟学 Go 语言高并发:Select多路复用

Select多路复用 学习目标 知识点掌握程度应用场景select实现原理深入理解底层机制channel通信和多路选择超时处理掌握超时控制方法避免阻塞和资源浪费优先级控制理解优先级实现处理多个channel的顺序性能考虑了解性能优化点高并发场景优化 1. Select实现原理 让我们通过一个…...