golang使用Viper读取Nacos配置

参考:https://cloud.tencent.com/developer/article/1820756

阅读更多

golang项目日志库:Zap

一、前言

在每个项目中,日志框架是必不可少的,它可以为我们打印关键日志,方便我们后续排查问题。一个好的日志框架可以提供以下功能:

  • 日志可输出到控制台和文件
  • 可根据文件大小或日期来切割日志文件,支持配置日志保留时间等
  • 有日志调用的文件及行号、打印时间等
  • 有日志输出级别:DEBUG、INFO、ERROR等

在 Go 项目中,有很多日志库,比较流行的有 golang 自带的 log 库、sirupsen 开源的 logrus 库、还有 uber 开源的 zap 库。在这里我们选择使用 zap 库,都说这个日志库的性能高,第二就是对 zap 也是颇有眼缘。

阅读更多

golang关键字说明

1、defer 延迟函数

使用 defer 的最常见场景是在函数调用结束后完成一些收尾工作,例如在 defer 中回滚数据库的事务:

1
2
3
4
5
6
7
8
9
10
func createPost(db *gorm.DB) error {
tx := db.Begin()
defer tx.Rollback()

if err := tx.Create(&Post{Author: "Draveness"}).Error; err != nil {
return err
}

return tx.Commit().Error
}

在使用数据库事务时,我们可以使用上面的代码在创建事务后就立刻调用 Rollback 保证事务一定会回滚。哪怕事务真的执行成功了,那么调用 tx.Commit() 之后再执行 tx.Rollback() 也不会影响已经提交的事务。

defer 关键字会在函数返回之前运行。

阅读更多

golang项目配置管理神器:Viper

参考资料:

1、创建 global 目录,里面存储全局变量:

1
2
3
4
5
6
7
8
9
package global

import (
"github.com/spf13/viper"
)

var (
Config *viper.Viper
)

阅读更多

golang数据转换

1、interface{} 转 struct 结构体

1)第一种:interface 强转 struct
1
2
3
4
5
6
7
8
9
10
newUser:=user{
Id: 1,
Name: "杉杉",
}

var newInterface1 interface{}

//第一种使用interface
newInterface1=newUser
fmt.Printf("使用interface: %v",newInterface1.(user))
2)第二种:json.Marshal 和 Unmarshal

阅读更多

golang有序遍历map

一、问题

不知道小伙伴有没有发现,Go 语言的 map 是无序遍历的,一开始我不知道,啪,测试给我指回来一个 bug,就是多次请求,发现多次请求返回的数据顺序不一致。经过排查,我才知道 Go 语言的 map 原来是无序的。

二、解决思路

1、方法一

借助一个 slice 来保存 map 的 key ,通过遍历排序后的 slice 来达到根据 keys 遍历 map 的效果

阅读更多

多线程消费Kafka

一、概述

最近研究了一下多线程消费 Kafka ,其实大体可以分为两种方式,本文只介绍一种,相对而言比较通俗易懂。

创建线程池,程序启动多个线程,每个线程创建对应的消费者实例,负责完整的消息获取、处理、offset 提交。

优点 缺点
实现方便 会占用更多的内存和TCP连接数。
速度快,无线程间交互开销 线程数受制于主题分区数。
易于维护分区内的消费顺序 当线程处理自己消息时容易超时,从而引发 Rebalance 。

阅读更多

golang开发exporter流程梳理

一、最简单的 exporter

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":8080", nil))
}

执行go build编译运行,然后访问http://127.0.0.1:8080/metrics就可以看到采集到的指标数据。

这段代码仅仅通过http模块指定了一个路径/metrics,并将client_golang库中的promhttp.Handler()作为处理函数传递进去后,就可以获取指标数据了。这个最简单的 Exporter 内部其实是使用了一个默认的收集器NewGoCollector采集当前Go运行时的相关信息,比如go堆栈使用、goroutine数据等等。

阅读更多

容器部署springboot项目,使用configmap做配置中心

k8s:v1.13.5

一、背景

将 spring boot 项目部署在 k8s 上,需要打镜像,为了实现配置文件可配置,就需要将配置文件与镜像解耦。

之前我们都是使用的 k8s 部署的 spring cloud configserver 组件来当作 spring boot 项目的配置中心。 在项目中引入 spring-cloud-starter-config 依赖,配置上 configserver 的内部域名即可。

但有一个痛点就是: configserver 不稳定,有时候会造成其他 pod 应用重启,所以想使用别的方案,那就是 k8s 中的 configMap 。

阅读更多

zk znode introduce

一、

阅读更多