【jaeger】 用到的开源项目
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"go.uber.org/zap" //用来配置日志
用的时候是这样子
import"git.iflytek.com/xiot-business/library/logger"
logger.InitLogger(path, level, false)
err = jaeger.InitWithZap(SERVICE, jaegerHost, logger.GetLogger())
defer jaeger.Closer.Close()
InitLogger函数是这样实现的,就是用了zap包里的一个结构体config,设置一些参数,然后用函数build()返回值赋给全局变量Logger
import"go.uber.org/zap"
var Logger *zap.Logger
func InitLogger(path string, level string, isDebug bool) {
log.Printf("initLogger path %s, level %s, isDebug %t\n", path, level, isDebug)
logBasePath, err := filepath.Abs(filepath.Dir(path))
if _, err := os.Stat(logBasePath); err != nil {
err = os.MkdirAll(logBasePath, 0711)
}
var js string
if isDebug {
js = fmt.Sprintf(`{
"level": "%s",
"encoding": "json",
"outputPaths": ["stdout"],
"errorOutputPaths": ["stdout"]
}`, level)
} else {
js = fmt.Sprintf(`{
"level": "%s",
"encoding": "json",
"outputPaths": ["%s"],
"errorOutputPaths": ["%s"]
}`, level, path, path)
}
var cfg zap.Config
if err := json.Unmarshal([]byte(js), &cfg); err != nil {
log.Panicln(err)
}
cfg.EncoderConfig = zap.NewProductionEncoderConfig()
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
cfg.DisableStacktrace = true
cfg.DisableCaller = true
Logger, err = cfg.Build()
if err != nil {
log.Println("init logger error: ", err)
}
}
initzap也简单,实现如下给全局变量tracer赋值,上面得到的logger用作tracer的日志打印
package jaeger
import (
"io"
"time"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go/config"
jaegerzap "github.com/uber/jaeger-client-go/log/zap"
"go.uber.org/zap"
)
var Tracer opentracing.Tracer
var Closer io.Closer
// 初始化JaegerZap
func InitWithZap(Service, AgentHostPort string, Logger *zap.Logger) (err error) {
cfg := config.Configuration{
ServiceName: Service,
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
Reporter: &config.ReporterConfig{
QueueSize: 1024,
LogSpans: false,
LocalAgentHostPort: AgentHostPort,
BufferFlushInterval: 1 * time.Second,
},
}
Tracer, Closer, err = cfg.NewTracer(config.Logger(jaegerzap.NewLogger(Logger)))
opentracing.SetGlobalTracer(Tracer)
return
}
两种打印日志方法,一个是父节点,一个是继承上面的span
span := tracer.StartSpan("receive_message_from_AIUI")
span,_ := tracer.StartSpanFromContext(ctx,"Support DataPlatform")
【oauth2.0授权码模式】

- 第三方应用请求用户授权。
- 用户同意授权,并返回一个凭证(code)
- 第三方应用通过第二步的凭证(code)向授权服务器请求授权
- 授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。
- 第三方应用通过第四步的凭证(Access Token)向资源服务器请求相关资源。
- 资源服务器验证凭证(Access Token)通过后,将第三方应用请求的资源返回
【CI/CD】 基本流程如下: 项目根目录下有几个重要文件 .drone.yml Dockerfile deploy.sh
当项目写好以后git push到github上,由于github上创建了ci/cd流程,会将整个项目打包复制到一个服务器上,服务器会在项目下找到.drone.yml文件,根据此次提交触发的条件,比如是dev分支上push的,执行文件中相应的操作,在这个文件中首先构建新的镜像提交到harbor上,这里用到了项目下的Dockerfile文件,镜像创建好以后,下面运行deploy.sh文件,文件主要从harbor拉去新的镜像并运行
后来不用docker运行服务了,用k8s,.drone.yml文件先构建新镜像流程不变,然后是将一些k8s的yml文件放在正确位置,然后kubectl命令运行,里面包括拉去镜像文件等等,这里就用不到deploy.sh文件了
【prometheus】 prometheus主要有源文件部署和prometheus-operator部署,源文件部署很简单就是下载源文件然后后台运行
Prometheus部署
项目目录:/root/prometheus/prometheus-2.7.1.linux-amd64
配置文件:prometheus.yml
启动命令:nohup ./prometheus --config.file=prometheus.yml --web.enable-lifecycle > start.log 2>&1 &
重载配置命令:curl -X POST http://localhost:9090/-/reload
访问地址:172.31.236.172:9090
AlertManager部署
项目目录:/root/prometheus/alertmanager-0.16.1.linux-amd64
配置文件:alertmanager.yml
启动命令:nohup ./alertmanager --config.file=alertmanager.yml > start.log 2>&1 &
Grafana部署
项目目录:/root/prometheus/grafana
启动命令:docker run -d --name=grafana -p 3000:3000 --restart always -v /root/prometheus/grafana/grafana.ini:/etc/grafana/grafana.ini grafana/grafana
账号密码:admin/aiot-grafana
访问地址:172.31.236.172:3000
NodeExporter部署
部署服务器:172.31.236.172,172.31.236.109
项目目录:/root/node_exporter-0.17.0.linux-amd64
启动命令:nohup ./node_exporter > start.log 2>&1 &
prometheus-operator部署方式需要是在k8s中将prometheus作为一个资源部署,需要用到很多yml文件,Prometheus-operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator这个controller有RBAC(role based access control)权限下去负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。 讲的很好的文章
【grpc】
GRPC并没有创造新的序列化协议,而是使用已有的protobuf;基于protobuf来声明数据模型和RPC接口服务
Grpc 生成命令,要加grpc 用uhome.proto这个文件生成go文件
protoc --go_out=plugins=grpc:. uhome.proto
生成一个uhome.pb.go的文件
切片用repeated 字段 太复杂的用bytes类型