整理

618 阅读3分钟

【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类型