创建型模式-工厂方法
创建型模式-工厂方法什么是工厂方法工厂方法是一种创建型设计模式, 其在父类中提供一个创建对象的 方法,允许子类决定实例化对象 的类型
Example产品接口package maintype IGun interface { setName(name string) setPower(power int) getName() string getPower() int}
具体产品Apackage maintype Gun struct { name string power int}func (g *Gun) setName(name string) { g.name = name}func (g *Gun) getName() string { return g.name}func (g *Gun) setPower(power int) { g.power = power}func (g *Gun) getPower() i ...
创建型设计模式-抽象工厂
创建型设计模式-原型模式什么是原型模式原型是一种创建型设计模式,使 你能够复制已有对象,而又无需 使代码依赖它们所属的类
原型(Prototype)接口将对克隆方法进行声明。在绝大多数 情况下,其中只会有一个名为 clone 克隆 的方法
具体原型(Concrete Prototype)类将实现克隆方法。除了将 原始对象的数据复制到克隆体中之外,该方法有时还需处理 克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖 等等
客户端(Client)可以复制实现了原型接口的任何对象
原型注册表(Prototype Registry)提供了一种访问常用原型 的简单方法,其中存储了一系列可供随时复制的预生成对象。 最简单的注册表原型是一个 名称 → 原型 的哈希表。 但如 果需要使用名称以外的条件进行搜索,你可以创建更加完善 的注册表版本
Example原型接口package maintype Inode interface { print(string) clone() Inode}
具体原型Apackage mainimport &qu ...
创建型设计模式-抽象工厂
创建型设计模式-抽象工厂什么是抽象工厂它能创建一系列相关的对象,而无需指定其具体类
抽象产品:为构成系列产品的一组不同但 相关的产品声明接口
具体产品(Concrete Product)是抽象产品的多种不同类型实 现。所有变体(维多利亚/现代)都必须实现相应的抽象产品 (椅子/沙发
抽象工厂(Abstract Factory)接口声明了一组创建各种抽象 产品的方法
具体工厂(Concrete Factory)实现抽象工厂的构建方法。每 个具体工厂都对应特定产品变体,且仅创建此种产品变体。
尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就 不会与工厂创建的特定产品变体耦合。客户端(Client)只 需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/ 产品变体交互
Example抽象工厂接口package mainimport "fmt"type ISportsFactory interface { makeShoe() IShoe makeS ...
创建型设计模式-生成器模式
创建型设计模式-生成器模式什么是生成器模式使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象
生成器(Builder)接口声明在所有类型生成器中通用的产品 构造步骤
具体生成器(Concrete Builders)提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
产品(Products)是最终生成的对象。由不同生成器构造的 产品无需属于同一类层次结构或接口。
主管(Director)类定义调用构造步骤的顺序,这样你就可以 创建和复用特定的产品配置。
客户端(Client)必须将某个生成器对象与主管类关联。一 般情况下,你只需通过主管类构造函数的参数进行一次性关 联即可。此后主管类就能使用生成器对象完成后续所有的构 造任务。但在客户端将生成器对象传递给主管类制造方法时 还有另一种方式。在这种情况下,你在使用主管类生产产品 时每次都可以使用不同的生成器
Example生成器接口package maintype IBuilder interface { setWindowType() setDoorT ...
Gorm-JSON格式问题
Gorm-JSON格式问题概述在使用Gorm的时候,常常会使用JSON格式,但是JSON在Gorm的ORM中表达有着许多解析问题
问题描述
[]也是作为JSON格式的一种,里面可以切套object对象,但是实际上我们可以看作一个数组,这种时候
当我们使用
步骤建立表格type User struct { gorm.Model Name string Age int GameUser []GameUser `json:"game_user" gorm:"type:json"`}type GameUser struct { ID int Name string PassWord string}func main() { dsn := "root:123456@tcp(10.0.0.197:3303)/joohwan_dev?parseTime=true" mysqlDb, err := g ...
设计模式-五大原则
设计模式-五大原则职责单一原则尽量让每个类只负责软件中的一个功能,并将该功能完全封 装(你也可称之为隐藏)在该类中。
开闭原则对于扩展,类应该是“开放”的;对于修改,类则应 是“封闭”的。
里氏替换原则当你扩展一个类时, 记住你应该要能在不修改客户端 代码的情况下将子类的对象作为父类对象进行传递。
接口隔离原则客户端不应被强迫依赖于其不使用的方法。
依赖倒置原则高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。抽象接口不应依赖于具体实现。具体 实现应该依赖于抽象接口。
Gin中间件
Gorm:钩子HookHook 是在创建、查询、更新、删除等操作之前、之后调用的函数。
支持以下的Hook方法
type 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(*gorm.DB) error}type AfterSaveInterface interface { Aft ...
Go-标准库日志Slog
Go的标准库日志Slog背景在Go1.21中,在Go的标准库函数中引入了Slog
据说使用的内存比Zap还要小
基础用法slog.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
输出参数的日志 name := "sss" slog.Info("msg", slog.String("name", name)) slog.Error("ERROR: value is empty", slog.Any("name", name)) 日志输出:20 ...
K8s-自动伸缩
K8s-自动伸缩Pod的横向伸缩(水平拓展HPA)Pod的横向伸缩是通过控制器管理Pod的副本数实现的,由Horizontal控制器负责,通过HPA资源管理,调整Pod的数量
自动伸缩过程
获取被伸缩的对象的Pod度量
计算需要达到的Pod数量
更新replicas字段
基于CPU使用率进行自动伸缩CPU需要进行CPU高峰使用,进行HPA
SHELL
# CPU使用率到30的时候 进行伸缩 kubectl autoscale deploymengt kubia --cpu-percent=30 --min=l --max=5
YAML
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: php-apachespec: # 指定的目标资源 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 1 maxReplicas: 10 # 要求每个Po ...
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 边项配置其他与安全性相关的特性
配置安全上下文 ...