我的创作纪念日

机缘

最初成为创作者的初心

眼过千遍,不如手过一遍。也为了日后面试复习

1、希望把基础的运维技术、运维工作中使用的技术、运维过程中问题排查解决的过程做一个完整的记录
2、希望可以坚持写10年(尽量以技术内容为主的文章),定下一个10年之约目标
3、日常分享的运维常用技术中间件RPM包构建、iptables规则、shell脚本、MySQL数据库、CICD、Kubernetes、ES、Redis、Prometheus监控、Graylog日志系统、三级等保漏洞修复方案、Golang运维工具开发等技术性文章
4、不仅仅是简单的分享,其实写博客的过程就是加深对这门技术的印象。

在这里插入图片描述


收获

1、在这一年也学会了中间件RPM包构建的两种方式(rpmbuild、fpm)
2、加深了mysql主从恢复及MHA搭建维护
3、对graylog日志系统的搭建及维护有了深层次的了解,不再局限于市面常见的ELK、EFK技术
4、在容器方面,对镜像的打包构建、yaml配置调整、网络流向有了一定的理解,也逐渐培养出了容器问题排查思路
5、在开发语言方面,对golang有了入门基础,也将Mysql全量备份shell脚本转换为了golang语言实现,同时也对监控agent注册到consul中也通过golang开发语言实现
6、这一年也整理了三级等保时会遇到的一些问题,同时也整理了对应的修复方法。
7、拿下了CKA证书
8、同时这一年,粉丝量也有增加,文章的阅读量、展现量也有所增长,如下图所示

在这里插入图片描述
在这里插入图片描述


日常

1、现在创作文章基本在每月中旬会发布5-8篇技术文章,这些文章都来自于当月我的实际工作中遇到的问题及解决方法
2、加油更新出更好的文章


成就

golang实现对alertmanager原始数据进行转换,转换为企业微信消息的markdown格式

package common

import (
	"alertmanagerWebhook/config"
	"alertmanagerWebhook/core"
	"alertmanagerWebhook/global"
	"bytes"

	"os"
	"path/filepath"
	"reflect"
	"text/template"
	"time"

	"github.com/gomodule/redigo/redis"
)

func TransformToMarkdown(notification config.Notification) (message *config.Message, err error) {
	c, err := core.ConnRedis()
	if err != nil {
		global.Logger.Errorf("Failed to connect to Redis: %v\n", err)
		return
	}
	defer c.Close() // 确保在函数结束时关闭连接

	var (
		notificationFiring   config.Notification
		notificationResolved config.Notification

		cstZone = time.FixedZone("CST", 8*3600)

		bufferFiring   bytes.Buffer
		bufferResolved bytes.Buffer
	)
	dir, err := os.Getwd()
	if err != nil {
		global.Logger.Errorf("Error getting current directory: %v\n", err)
		return
	}
	// Use filepath.Join to create the correct file path
	templatePath := filepath.Join(dir, "/template/alert.tmpl")
	for _, alert := range notification.Alerts {
		if alert.Status == "firing" {
			notificationFiring.Version = notification.Version
			notificationFiring.GroupKey = notification.GroupKey
			notificationFiring.Status = "firing"
			notificationFiring.Receiver = notification.Receiver
			notificationFiring.GroupLabels = notification.GroupLabels
			notificationFiring.CommonLabels = notification.CommonLabels
			notificationFiring.ExternalURL = notification.ExternalURL
			notificationFiring.Alerts = append(notificationFiring.Alerts, alert)
		} else if alert.Status == "resolved" {
			notificationResolved.Version = notification.Version
			notificationResolved.GroupKey = notification.GroupKey
			notificationResolved.Status = "resolved"
			notificationResolved.Receiver = notification.Receiver
			notificationResolved.GroupLabels = notification.GroupLabels
			notificationResolved.CommonLabels = notification.CommonLabels
			notificationResolved.ExternalURL = notification.ExternalURL
			notificationResolved.Alerts = append(notificationResolved.Alerts, alert)
		}
	}

	// Templated Email Body for Firing Alerts
	if !reflect.DeepEqual(notificationFiring, config.Notification{}) {
		for _, alert := range notificationFiring.Alerts {
			alert.StartTime = alert.StartsAt.In(cstZone).Format("2006-01-02 15:04:05")
			fingerprint := alert.Fingerprint

			// Save states in Redis  -->hset fingerprintValue startTimeValue存储,key的名称就是fingerprintValue,字段就是startTime
			if _, err = c.Do("HSet", fingerprint, "startTime", alert.StartTime); err != nil {
				global.Logger.Errorln(err)
				return nil, err
			}
			//Redis Hincrby 命令用于为哈希表中的字段值加上指定增量值
			if _, err = c.Do("Hincrby", fingerprint, "count", 1); err != nil {
				global.Logger.Errorln(err)
				return nil, err
			}

			count, err := redis.Int(c.Do("HGet", fingerprint, "count"))
			if err != nil {
				global.Logger.Errorln("get alert count error: ", err)
			}
			alert.Count = count //通过redis记录告警次数

			// 检查 Description 是否存在或为空
			if alert.Annotations.Description == "" {
				// 如果为空,则重新赋值
				alert.Annotations.Description = alert.Annotations.Summary
			}
			//告警级别如果为空,则设置为warning
			if alert.Labels.Severity == "" {
				alert.Labels.Severity = "warning"
			}
			// Load template from file
			tmpl, err := template.ParseFiles(templatePath)
			if err != nil {
				global.Logger.Errorln("template parse error: ", err)
				return nil, err
			}
			// Execute the template and write to emailBodyFiring
			if err := tmpl.Execute(&bufferFiring, alert); err != nil {
				global.Logger.Errorln("template execute error: ", err)
				return nil, err
			}
			bufferFiring.WriteString("\n") // 添加换行符以分隔不同的告警
		}
	}

	// Templated Email Body for Resolved Alerts
	if !reflect.DeepEqual(notificationResolved, config.Notification{}) {
		for _, alert := range notificationResolved.Alerts {
			alert.StartTime = alert.StartsAt.In(cstZone).Format("2006-01-02 15:04:05")
			alert.EndTime = alert.EndsAt.In(cstZone).Format("2006-01-02 15:04:05")
			// 检查 Description 是否存在或为空
			if alert.Annotations.Description == "" {
				// 如果为空,则重新赋值
				alert.Annotations.Description = alert.Annotations.Summary
			}
			// Load template from file
			tmpl, err := template.ParseFiles(templatePath)
			if err != nil {
				global.Logger.Errorln("template parse error: ", err)
				return nil, err
			}
			// Execute the template and write to emailBodyResolved
			if err := tmpl.Execute(&bufferResolved, alert); err != nil {
				global.Logger.Errorln("template execute error: ", err)
				return nil, err
			}
			bufferResolved.WriteString("\n") // 添加换行符以分隔不同的告警

			//恢复后,从redis删除对应的key
			if _, err := c.Do("Del", alert.Fingerprint); err != nil {
				global.Logger.Errorln("delete key error: ", err)
			}
		}
	}

	// 转换为企业微信可以识别的格式
	var markdownFiring, markdownResolved *config.QyWeChatMarkdown
	var title string
	title = "# <font color=\"red\">触发告警</font>\n"
	if bufferFiring.String() != "" {
		markdownFiring = config.NewQyWeChatMarkdown(title + bufferFiring.String())
	} else {
		markdownFiring = config.NewQyWeChatMarkdown("")
	}
	title = "# <font color=\"green\">告警恢复</font>\n"
	if bufferResolved.String() != "" {
		markdownResolved = config.NewQyWeChatMarkdown(title + bufferResolved.String())
	} else {
		markdownResolved = config.NewQyWeChatMarkdown("")
	}


	// 将企业微信消息进行封装
	message = config.NewMessage(markdownFiring, markdownResolved)
	//log.Printf("messages: %v\n", message.QywechatMessage.MarkdownFiring.Markdown.Content)
	global.Logger.Infof("messagesWeChatFiring: %v\n", message.QywechatMessage.MarkdownFiring.Markdown.Content)
	global.Logger.Infof("messagesWeChatResovled: %v\n", message.QywechatMessage.MarkdownResolved.Markdown.Content)
	return message, nil
}

憧憬

职业规划

1、在提升运维技术的同时,希望能对golang语言有更深入层次的学习,有朝一日可以做到运维开发岗位
2、拿下CKS、红帽证书,提高就业机会
3、希望年后可以找到一家不错的公司

一步一个脚印,做一个真正的技术者,不要欺骗自己,做到问心无愧

标题SpringBoot基于Web的图书借阅管理信息系统设计与实现AI更换标题第1章引言介绍图书借阅管理信息系统的研究背景、意义、现状以及论文的研究方法和创新点。1.1研究背景与意义分析当前图书借阅管理的需求和SpringBoot技术的应用背景。1.2国内外研究现状概述国内外在图书借阅管理信息系统方面的研究进展。1.3研究方法与创新点介绍本文采用的研究方法和系统设计的创新之处。第2章相关理论技术阐述SpringBoot框架、Web技术和数据库相关理论。2.1SpringBoot框架概述介绍SpringBoot框架的基本概念、特点和核心组件。2.2Web技术基础概述Web技术的发展历程、基本原理和关键技术。2.3数据库技术应用讨论数据库在图书借阅管理信息系统中的作用和选型依据。第3章系统需求分析对图书借阅管理信息系统的功能需求、非功能需求进行详细分析。3.1功能需求分析列举系统应具备的各项功能,如用户登录、图书查询、借阅管理等。3.2非功能需求分析阐述系统应满足的性能、安全性、易用性等方面的要求。第4章系统设计详细介绍图书借阅管理信息系统的设计方案和实现过程。4.1系统架构设计给出系统的整体架构,包括前后端分离、数据库设计等关键部分。4.2功能模块设计具体阐述各个功能模块的设计思路和实现方法,如用户管理模块、图书管理模块等。4.3数据库设计详细介绍数据库的设计过程,包括表结构、字段类型、索引等关键信息。第5章系统实现与测试对图书借阅管理信息系统进行编码实现,并进行详细的测试验证。5.1系统实现介绍系统的具体实现过程,包括关键代码片段、技术难点解决方法等。5.2系统测试给出系统的测试方案、测试用例和测试结果,验证系统的正确性和稳定性。第6章结论与展望总结本文的研究成果,指出存在的问题和未来的研究方向。6.1研究结论概括性地总结本文的研究内容和取得的成果。6.2展望对图书借阅管理
摘 要 基于SpringBoot的电影院售票系统为用户提供了便捷的在线购票体验,覆盖了从注册登录到观影后的评价反馈等各个环节。用户能够通过系统快速浏览和搜索电影信息,包括正在热映及即将上映的作品,并利用选座功能选择心仪的座位进行预订。系统支持多种支付方式如微信、支付宝以及银行卡支付,同时提供积分兑换和优惠券领取等功能,增强了用户的购票体验。个人中心允许用户管理订单、收藏喜爱的影片以及查看和使用优惠券,极大地提升了使用的便利性和互动性。客服聊天功能则确保用户在遇到问题时可以即时获得帮助。 后台管理人员,系统同样提供了全面而细致的管理工具来维护日常运营。管理员可以通过后台首页直观地查看销售额统计图,了解票房情况并据此调整策略。电影信息管理模块支持新增、删除及修改电影资料,确保信息的准确与及时更新。用户管理功能使得管理员可以方便地处理用户账号,包括导入导出数据以供分析。订单管理模块简化了对不同状态订单的处理流程,提高了工作效率。优惠券管理和弹窗提醒管理功能有助于策划促销活动,吸引更多观众。通过这样的集成化平台,SpringBoot的电影院售票系统不仅优化了用户的购票体验,也加强了影院内部的管理能力,促进了业务的发展和服务质量的提升。 关键词:电影院售票系统;SpringBoot框架;Java技术
内容概要:本文介绍了2025年中国网络安全的十大创新方向,涵盖可信数据空间、AI赋能数据安全、ADR(应用检测与响应)、供应链安全、深度伪造检测、大模型安全评估、合规管理与安全运营深度融合、AI应用防火墙、安全运营智能体、安全威胁检测智能体等。每个创新方向不仅提供了推荐的落地方案和典型厂商,还详细阐述了其核心能力、应用场景、关键挑战及其用户价值。文中特别强调了AI技术在网络安全领域的广泛应用,如AI赋能数据安全、智能体驱动的安全运营等,旨在应对日益复杂的网络威胁,提升企业和政府机构的安全防护能力。 适合人群:从事网络安全、信息技术、数据管理等相关工作的专业人士,尤其是负责企业信息安全、技术架构设计、合规管理的中高层管理人员和技术人员。 使用场景及目标:①帮助企业理解和应对最新的网络安全威胁和技术趋势;②指导企业选择合适的网络安全产品和服务,提升整体安全防护水平;③协助企业构建和完善自身的网络安全管理体系,确保合规运营;④为技术研发人员提供参考,推动技术创新和发展。 其他说明:文章内容详尽,涉及多个技术领域和应用场景,建议读者根据自身需求重点关注相关章节,并结合实际情况进行深入研究和实践。文中提到的多个技术和解决方案已在实际应用中得到了验证,具有较高的参考价值。此外,随着技术的不断发展,文中提及的部分技术和方案可能会有所更新或改进,因此建议读者保持关注最新的行业动态和技术进展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值