设计模式-五大原则
设计模式-五大原则职责单一原则尽量让每个类只负责软件中的一个功能,并将该功能完全封 装(你也可称之为隐藏)在该类中。 开闭原则对于扩展,类应该是“开放”的;对于修改,类则应 是“封闭”的。 里氏替换原则当你扩展一个类时, 记住你应该要能在不修改客户端 代码的情况下将子类的对象作为父类对象进行传递。 接口隔离原则客户端不应被强迫依赖于其不使用的方法。 依赖倒置原则高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。抽象接口不应依赖于具体实现。具体 实现应该依赖于抽象接口。
Gin中间件
Gorm:钩子HookHook 是在创建、查询、更新、删除等操作之前、之后调用的函数。 支持以下的Hook方法 1234567891011121314151617181920212223242526272829303132333435type BeforeCreateInterface interface { BeforeCreate(*gorm.DB) error}type AfterCreateInterface interface { AfterCreate(*gorm.DB) error}type BeforeUpdateInterface interface { BeforeUpdate(*gorm.DB) error}type AfterUpdateInterface interface { AfterUpdate(*gorm.DB) error}type BeforeSaveInterface interface { BeforeSave(*gor...
Go-标准库日志Slog
Go的标准库日志Slog背景在Go1.21中,在Go的标准库函数中引入了Slog 据说使用的内存比Zap还要小 基础用法12345678slog.Info("This is info log")slog.Warn("This is warning log")slog.Error("This is error log")日志输出:2024/07/23 15:26:01 INFO This is info log2024/07/23 15:26:01 WARN This is warning log2024/07/23 15:26:01 ERROR This is error log 输出参数的日志12345678 name := "sss" slog.Info("msg", slog.String("name", name)) slog.Error("ERROR: value is empty", slog.Any("name&qu...
K8s-自动伸缩
K8s-自动伸缩Pod的横向伸缩(水平拓展HPA)Pod的横向伸缩是通过控制器管理Pod的副本数实现的,由Horizontal控制器负责,通过HPA资源管理,调整Pod的数量 自动伸缩过程 获取被伸缩的对象的Pod度量 计算需要达到的Pod数量 更新replicas字段 基于CPU使用率进行自动伸缩CPU需要进行CPU高峰使用,进行HPA SHELL 12# CPU使用率到30的时候 进行伸缩 kubectl autoscale deploymengt kubia --cpu-percent=30 --min=l --max=5 YAML 1234567891011121314151617181920apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: php-apachespec: # 指定的目标资源 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minRe...
K8s-集群内网络安全
K8s-集群内网络安全在Pod中使用宿主节点的Linux命名空间Pod中的容器一般都在分开的Linux命名空间中,他们通过不同IPC和PID命名空间,彼此隔离 Pod使用宿主机网络命名空间Pod需要使用主机网络,使用宿主机的网络适配器,而不是虚拟网络设备。 通过设置hostNetwork=true实现 绑定宿主机端口号而不是使用宿主机网络命名空间Pod映射到到主机上的端口,但是不设置共享主机的网络命名空间 设置Pod的spec.containers.ports的hostPort实现 hostPort的Pod流量转发过程: 到达宿主机的端口连接直接转发到Pod 的对应的端口 与NodePort不同,NodePort会给所有的节点绑定上端口,即使Node没有对应Pod Pod hostPort案例: 使用宿主机的PID和IPC命名空间当使用spec中hostPID=true 和 hostIPC=true之后,pod容器就可以看到所有宿主机上的进程 配置节点的安全上下文通过 security Context 边项配置其他与安全性相关的特性 配置安全...
K8s-认证机制:ServiceAccounts
K8s-认证机制:ServiceAccountsK8s的认证方式 客户端证书 传入HTTP头中的token 基础的HTTP认证 其他 用户和组用户就是通过单个的SA的认证 组别用户和SA可以属于一个或者多个组。 内置的用户组: system unauthenticated 组用于所有认证插件都不会认证客户端身份的 请求 system authent cated 组会自动分配给一个成功通过认证的用户 system:serviceaccounts 组包含所有在系统中的 Serv iceAccount system serviceaccounts <口 amespace >组包含了所有在特定命名空 间中的 Serv ceAccount 什么是SA一个SA的用户名格式如下: system: serviceaccount:<namespace >: Pod中sa的位置: /var/run/secrets/kube netes io/serv ceaccount/token 每一个Namespace都有一个...
跨公网解决K8s组网
跨公网解决K8s组网需要开放安全组工作节点开放组 开放端口号 开放端口类型 备注 8472 UDP Flannel vxlan 模式下的Overlay 网络通信 10250 TCP kubelet log exec 等端口 控制面开放组 开放端口号 开放端口类型 备注 8472 UDP Flannel vxlan 模式下的Overlay 网络通信 10250 TCP kubelet log exec 等端口 6443 TCP apiserver端口 2380 TCP etcd端口 安装部署Master创建虚拟网卡12345# 公网ippublic_ip=xxxsudo ip link add dummy-pub type dummysudo ip addr add $public_ip/32 dev dummy-pub 公网IP启动apiserver参考:https://piwriw.github.io/2024/01/08/cloud/k8s/K8s%E5%85%AC%E7%BD%91%E9%83%A8%E7%BD%B2/ 通过输...
计算机网络-虚拟专用网和网络地址转换
计算机网络-虚拟专用网和网络地址转换虚拟专用网(VPC) 因为这看起来像是点对点的通信,所以也称之为IP隧道技术。 网络地址转换(NAT)在NAT路由器上将其内部专用地址,转化为IP 基本的NAT方法 这种模式下,弊端是需要主机轮番使用转换器上的 全球地址 网络地址与端口号转换这种模式,全程为网络地址与端口号转换(Network Address and Port Translation/NAPT)
计算机网络-IP多播
计算机网络-IP多播多播(Muliticast),也称为组播,是实现了“一对多”通信技术。 IP多播地址和多播组IP多播地址依赖于IP多播地址,D类地址,一般称呼为多播地址。 前面固定为:1110 范围是:224.0.0.0-239.255.255.255 局域网的硬件多播局域网支持硬件多播: 实现:IPV4地址映射为硬件多播地址 但是多播MAC是25bit相同,而IPV4只有23bit,所以可能出现相同的 因特网上IP多播IP多播在因特网上实现, 就需要经过多个路由器的转发。多播路由器必须按照IP多播地址转发到多播组的局域网下。 所以出现了IGMP来实现IP的路由多播 网际组管理协议IGMPIGMP有三种报文类型: 成员报告报文 成员查询报文 离开组报文 工作原理1.加入多播组 IGMP成员报告报文中包含加入多播组的地址 IP多播数据报的目的地址也是加入IP多播组的地址 在这个过程中,多播路由器通过维护多播组列表,记录该路由器已知道的直连的各个网络中多播组成员的多播组地址,多播路由器只关心自己网络的多播地址 2.监视多播组的成员变化多播路由器默认125s发送查询IG...
数据结构-队列
数据结构-队列队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开 基于链表的队列1234567891011121314151617181920212223242526272829303132333435363738package queueimport "container/list"type linkedQueue struct { data *list.List}func NewLinkedQueue() *linkedQueue { return &linkedQueue{ data: list.New(), }}func (q linkedQueue) push(value int) { q.data.PushBack(value)}func (q linkedQueue) pop(value int) any { if q.isEmpty() { re...




