avatar
文章
179
标签
47
分类
46

首页
文章
  • 归档
  • 标签
  • 分类
  • ToDo
  • 友情链接
留言板
关于
Echin の 博客
搜索
首页
文章
  • 归档
  • 标签
  • 分类
  • ToDo
  • 友情链接
留言板
关于

Echin の 博客

分布式锁
发表于2024-10-24|更新于2024-10-24|分布式锁|分布式锁
场景#现在有一个场景: 我们需要在pinnacle中跑定时任务来关闭未关闭的房间以及进行plan状态的轮转 如果只有一个机器下,我使用下面这个代码来执行操作,看起来是没什么问题的 12345678wg.Add(1)for _ , plan range plans { go func(){ closePlan() wg.Done() }()}wg.Wait() 但是如果我们有多个 replicas 那么,假设有 replicas:5,那么有可能每个副本机器会同时来执行关闭closePlan的操作,这样子带来的结果就是数据库中表数据的不一致性以及其他方面的不一致性,严重灾难! 因此我们需要使用分布式锁来保证一个定时任务在一段时间内只能由一个机器来执行这个定时任务 也就是在多实例情况下实现单实例操作 说人话:上厕所,一个坑位只能上一个人,这个人上的时候其他人都得等着 思考过程#ok ,那么我们来一步步推导分布式锁的书写逻辑 我们如何保证在一段时间内只能由一个机器来执行?# 我们可以上锁,这里使用了最简单的 ...
重新学习regex
发表于2024-10-10|更新于2024-10-15|Go|Go
测试网站 . 表示除了换行符之外的任意一个字符 [] 表示匹配集合中的任意一个字符 [1-2] 表示表示匹配集合中一到二的数,左闭右闭 [0-1a-zA-Z] 表示匹配 0-1 ,a-z , A-Z 集合中的数 [^]表示取反,^只有在[]内部才表示取反 [^a-z] 表示匹配除了小写字母的数据 [^a-z1-9A-Z] 表示出了小写字母,大写字母,1-9之外的数据 预定义字符类: \d 表示数字 \D 表示非数字 \w 表示字母,数字,下划线 \W 表示非(字母数字下划线) \s 表示空白字符和Tab \S 表示非(空白字符和Tab) 位置和边界匹配 ^ 表示匹配每一行的开头(在<>外面) /^a/ 表示匹配单行a开头的string $ 表示匹配每一行的结尾 /a$/ 表示匹配单行a结尾的string \ 转义 \. 就表示一个点 \bin 只匹配在单词开头的字符in in\b只匹配在单词结尾的字符in \Bin\B 匹配非边界的字符in 量词 at+ 表示t重复了一次或多次 at* 表示t重复了零次或多次 at? ...
链表
发表于2024-10-08|更新于2024-10-10|算法|算法
环形链表#如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 不允许修改 链表。 12345678910111213141516171819func detectCycle(head *ListNode) *ListNode { slow, fast := head, head for fast != nil { slow = slow.Next if fast.Next == nil { return nil } fast = fast.Next.Next if fast == slow { p := head for p != slow ...
开闭原则
发表于2024-10-05|更新于2024-10-06|设计模式|设计模式
开闭原则# 类的改动是通过增加代码进行的,而不是修改源代码 这个非常简单 就是通过增加结构体,增加代码量来提高代码逻辑性 假设现在 很多人每个人有不同的职业: 1234567891011121314151617181920type People struct{}func (p *People) Teacher() { fmt.Println("this people is a teacher")}func (p *People) Student() { fmt.Println("this people is a student")}func (p *People) Driver() { fmt.Println("this people is a driver")}func main() { p := &People{} p.Teacher() p.Student() p.Driver()} 现在我 ...
单一职责原则
发表于2024-10-05|更新于2024-10-05|设计原则|设计原则
单一职责原则# 类的职责单一,对外只提供一种功能,引起类的变化的原因应该只有一个 这个原则很好理解,也就是 逻辑上的单一性保证逻辑清晰 下面有一个案例,我们有两个穿衣服方式 工作穿衣服 逛街穿衣服 12345678910111213141516171819202122232425262728293031package mainimport "fmt"// 穿衣服的方式type Clothes struct{}// 工作穿衣服func (c *Clothes) Work() { fmt.Println("工作的装扮")}func (c *Clothes) OnShop() { fmt.Println("购物的装扮")}func main() { c := &Clothes{} fmt.Println("工作中......") c.Work() fmt.Println(&q ...
依赖倒转原则
发表于2024-10-05|更新于2024-10-05|设计模式|设计模式
依赖倒转原则#Dependence Inversion Principle, DlP 高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节;细节应该依赖抽象 == 依赖抽象而不是依赖于具体的实现 底层模块 可以理解为 实现层,也就是轮子 高层模块 可以理解为 业务逻辑层,也就是车子,车子需要轮子建造起来 依赖倒转 也就是会在业务逻辑层和实现层之间抽离出一个抽象层、 业务逻辑层向下依赖于抽象层,实现层线上依赖于抽象层,也就实现了依赖倒转的模样 学习资料: bilibili 刘丹冰 + 100个Go语言错误 现在我们有个业务场景: 实际操作:#现在有司机: 张三李四;汽车: 宝马,奔驰, 然后 - 张三开奔驰 - 李四开宝马 原代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344package mainimport "fmt"type Benz struct{}func (b *B ...
Go语言典型错误
发表于2024-10-05|更新于2024-10-05|Go|Go
引言#100个Go语言典型错误 mistakes# init# init 会在包初始化时引入,因此可以通过导入副作用的方式初始化init 1_ "github.echin.xxxxx" 不适合使用 init 的三种情况 init 会限制错误管理,因为他只能使用 panic 全局变量管理管理,因为init的初始化是基于包名字母顺序来实现的,且这个全局变量依赖随时可以改变,一般通过封装变量实现 测试复杂度的增加,这个真恶心,详见助手业务的一堆init init 一般用于 静态数据 的初始化
使用webHook实现CD
发表于2024-10-02|更新于2024-10-02|k3s|k3s
#webhook is a lightweight configurable tool written in Go, that allows you to easily create HTTP endpoints (hooks) on your server, which you can use to execute configured commands. You can also pass data from the HTTP request (such as headers, payload or query variables) to your commands. webhook also allows you to specify rules which have to be satisfied in order for the hook to be triggered. 大概意思就是 webHook 会在服务器启动一个端口使用webHook服务,然后你可以配置以及设定rule 思路#使用WebHook实现CD的思路: 我们推送代码到github Action,github ...
Oauth
发表于2024-09-28|更新于2024-09-29|oauth|oauth
今天Any给我讲了一下助手的Oauth的逻辑,突然对Oauth茅塞顿开 先白嫖一张图片过来 现在我们模拟一个场景,就是我们使用助手作为授权服务器来访问上课啦这个第三方应用 上课啦 先会将 redirectId state(随机生成) clientId(事先在助手服务器上有绑定) 发给助手服务器 助手 收到 这些参数后就会随机生成一个 code 然后重定向到 hduhelp.com/active 页面 在 hduhelp.com/active 页面我们主要用于激活这个授权码,就是会跳出一个登录页面,让用户登录,生成一个token,然后将token-code-state 绑定在一起存到数据库中 然后因为 Oauth2.0 的具体格式原因,助手会 query.add(state) \ query.add(code) \ clientId \ c.redirect(redirectId) 到上课啦的重定向页面,上课啦会校验 state 分析途中有没有被修改 然后 上课啦 会把 code + state + clientId + redirectUrl 重新发给助手 ...
k8s部署
发表于2024-09-28|更新于2024-09-28|k8s|k8s
引言#一直想要学会k8s,但是事实上来说学习这个技术并不是靠bilibili的教学就能够学会的,更何况很多时候都会忘记,暑假时候我看完了B站的课,但有种理论知识会了实际不会的无力感,同时更有种知识一点点逝去的害怕,于是在强哥的支持下(白嫖服务器,白嫖域名😍😍),完成了k8s的部署 同时我这一套配置可是any亲传,后继有人呐…… 项目原仓库 步骤# 使用 Dockerfile 打包镜像并 push 到 dockerHub 上 部署 mysql\pgsql\redis 这些我的应用所需要的依赖 拉取刚刚提交的镜像并启动一个 pod 暴露我的端口并让外界所访问 实操#首先需要下载 Lens 和 Termius 以及一个文件夹,后续的一切操作都在这两个部分操作 最终的目录应该是这样的:# 这个是本地文件夹下的目录,然后会在 Lens 操作生成Pod,很好用的(等会再说) 我的Dockerfile:#123456789101112131415161718192021222324252627FROM golang:1.22 AS builderCOPY . /buildWORKDIR / ...
123…18
avatar
Echin-h
keep learning
文章
179
标签
47
分类
46
Follow Me
公告
love is accumulated, not love, too.
最新文章
北京租房2025-07-21
Linux命令补充2025-02-27
非唯一索引加锁规则实操2025-02-19
sls日志接入2025-01-18
操作系统概论2024-12-08
分类
  • CD/CI1
  • CI/CD1
  • Gin10
  • Go26
  • Gorm9
  • JAVA2
  • Linux4
  • MQ1
标签
flamgo CI/CD 简历 代码随想录 ngrok casbin 分布式锁 配置文件 Go 八股文 CD/CI JAVA语法 oauth Gin git vim rpc none NX青训营 flamego 设计模式 Linux docker JWT pinnacle 我爱记单词 sls 计算机网络 博客 Mysql MQ 前端 北京北京 随笔 Gorm 设计原则 k8s 算法 Session 图解HTTP
归档
  • 七月 20251
  • 二月 20252
  • 一月 20251
  • 十二月 20243
  • 十一月 20243
  • 十月 20248
  • 九月 20249
  • 八月 20246
网站资讯
文章数目 :
179
已运行时间 :
本站访客数 :
本站总访问量 :
最后更新时间 :
©2023 - 2025 By Echin-h
框架 Hexo|主题 Butterfly
today is a beautiful day
搜索