package model import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func InitLogger(level string) *zap.SugaredLogger { encoder := getEncoder() // 同时输出到文件和控制台 core := zapcore.NewTee( zapcore.NewCore(encoder, stdWriter(), getLogLevel(level)), zapcore.NewCore(encoder, fileWriter(), getLogLevel(level)), ) return zap.New(core, zap.AddCaller()).Sugar() } func getLogLevel(level string) zapcore.LevelEnabler { switch level { case "DEBUG": return zapcore.DebugLevel case "INFO": return zapcore.InfoLevel case "WARN": return zapcore.WarnLevel case "ERROR": return zapcore.ErrorLevel default: return zapcore.InfoLevel } } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } func stdWriter() zapcore.WriteSyncer { return zapcore.AddSync(os.Stdout) } func fileWriter() zapcore.WriteSyncer { file, _
RabbitMQ中的内存节点与磁盘节点
每个RabbitMQ 节点只有两种类型,要么是内存节点,要么是磁盘节点 内存节点 内存节点将所有的队列、交换器、绑定、用户、权限和vhost的元数据定义都仅存储在内存中. 显而易见,内存节点拥有更出色的性能 磁
RabbitMQ集群中的交换器
交换器不像队列那样有真实的进程, 它只是一张名称与队列进程PID的关系表 当你将消息发布到交换器时,实际上是由你所连接到的信道将消息上的路由键同交换器的绑定列表进行比较,然后路由消息。正是信道(chann
集群中的队列
从直觉上来看,一说到集群,我们就联想到高可用,一个节点宕机了,不会影响整体服务,客户端会从其他节点拿数据。比如 ES, Redis, mongoDB 等的集群都是符合直觉的架构。 但是,事情到了rabbitMQ 这里,却完全不一样了。 在将
RabbitMQ集群部署
本文采用docker-compose 的方式部署 rabbitMQ集群 docker-compose.yml version: "3" services: rabbitmq: restart: always container_name: rabbitMQ image: rabbitmq:3.7.7-management # 注意 hostname(本地域名), rabbitMQ集群之间的通信就是靠此寻址的。物理机部署时也可以使用固定IP
RabbitMQ应答队列
生产者在某个队列上等待消费者返回的消息, 这个队列被称为应答队列,RabbitMQ 天生支持应答队列的机制。 什么时候需要应答队列 当一条消息被消费者处理后,需要告知生产者一些信息时,消费者就需要在应答队列上
powershell配置
安装powershell 下载地址 安装scoop 打开powershell 执行 修改策略 set-executionpolicy remotesigned -s cu 安装scoop iex (new-object net.webclient).downloadstring('https://get.scoop.sh') 自动补全 PSReadLine 在 V5 或以上版本中自带 命令 $profile 可见看见配置文件的路径,如果没有此文件,新建即可 打配置
awk分组统计
Shell学习笔记:awk实现group by分组统计功能 日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量。 1.样例数据 test.txt YD5Gxxx|6618151|68
golnag插件式开发的一种案例
OCP:开闭原则 软件的5大设计原则 “SOLID” 原则,其中之一就是 OCP(开闭原则) 该设计原则是由Bertrand Meyer在20世纪80年代大力推广的,其核心要素是:如果软件系统想要更容易被改变,那
右键注册自定义程序
想把自己写的一个控制台程序添加到右键,可以通过修改注册表的方式实现,但是修改起来比较麻烦,推荐使用右键管理器进行修改 右侧的 ”文件“ ”文件夹“ ”目录“ 等,代表在该项右键时,右键菜单显示的内容 点击 + 新建:
架构整洁之道书摘八——软件架构
软件架构这项工作的实质就是规划如何将系统切分成组件,并安排好组件之间的排列关系,以及组件之间互相通信的方式。 (拆分、组合、通信) 目标 设计良好的架构可以让系统便于理解、易于修改、方便维护,并且能轻松部署
架构整洁之道书摘七——设计原则
SOLID 原则 SRP:单一职责原则。 该设计原则是基于康威定律(Conway’s Law)[1]的一个推论——一个软件系统的最佳结构高度依赖于开发这个系统的组织的内部结构。这样,每个软件模块都有且只有
架构整洁之道书摘六——函数式编程
函数式编程所依赖的原理,在很多方面其实是早于编程本身出现的。因为函数式编程这种范式强烈依赖于Alonzo Church在20世纪30年代发明的λ演算。 什么是函数式编程 举个例子:计算0-25范围内整数的平
架构整洁之道书摘五——面向对象
譬如封装(encapsulation)、继承(inheritance)、多态(polymorphism)。其隐含意思就是说面向对象编程是这三项的有机组合,或者任何一种支持面向对象的编程语言必须支持这三
架构整洁之道书摘四——结构化编程
科学方法论不需要证明某条结论是正确的,只需要想办法证明它是错误的。如果某个结论经过一定的努力无法证伪,我们则认为它在当下是足够正确的。 我们的程序也是如此,我们不能证明我们的代码是绝对正确的,而是做各种