go-zero入门

news2024/11/13 16:06:29

文章目录

  • 简介
  • 框架设计
  • 环境准备
    • go安装
    • Go Module设置
    • goctl安装
      • 安装(mac\&linux)
      • 安装(windows)
    • protoc & protoc-gen-go安装
  • goctl 各层代码生成一览
  • goctl 生成REST和RPC微服务
    • 生成数据模型层Model
    • 生成API服务
      • 目录结构
      • 开发者需要做的
        • 修改配置文件
        • 修改上下文依赖
        • 修改业务逻辑
      • 生成swagger
    • 生成rpc服务
      • 方式一:快速生成greet服务
      • 方式二:通过指定proto生成rpc服务
      • 开发者需要做的
        • 修改配置文件
        • 修改上下文依赖
      • 启动RPC服务
      • 启动REST服务
  • 集成Nacos注册中心
    • 安装依赖
    • 修改配置
  • 集成服务监控Prometheus
    • 在rest和rpc的yaml配置文件中添加Prometheus配置
    • 修改 Prometheus 配置
  • 集成链路追踪
    • 在rest和rpc服务的yaml文件中添加Telemetry 配置
  • 附录
    • api配置
      • 配置说明
        • Config
        • rest.RestConf
        • service.ServiceConf
        • logx.LogConf
        • prometheus.Config
        • SignatureConf
        • PrivateKeyConf
        • cache.CacheConf
        • redis.RedisConf
    • rpc配置
      • 配置说明
        • zrpc.RpcServerConf
        • discov.EtcdConf
        • redis.RedisKeyConf

简介

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

主要特点:

  • 强大的工具支持,尽可能少的代码编写
  • 极简的接口
  • 完全兼容 net/http
  • 支持中间件,方便扩展
  • 高性能
  • 面向故障编程,弹性设计
  • 内建服务发现、负载均衡
  • 内建限流、熔断、降载,且自动触发,自动恢复
  • API 参数自动校验
  • 超时级联控制
  • 自动缓存控制
  • 链路跟踪、统计报警等
  • 高并发支撑,稳定保障了疫情期间每天的流量洪峰

如下图,从多个层面保障了整体服务的高可用:

功能架构

整体架构

框架设计

框架设计

环境准备

go安装

下载go 安装包

安装完成,查看是否成功

go version

Go Module设置

Go Module是Golang管理依赖性的方式,像Java中的Maven,Android中的Gradle类似。

查看GO111MODULE开启情况

$ go env GO111MODULE
on

开启GO111MODULE,如果已开启(即执行go env GO111MODULE结果为on)请跳过。

$ go env -w GO111MODULE="on"

设置GOPROXY

$ go env -w GOPROXY=https://goproxy.cn

设置GOMODCACHE

查看GOMODCACHE

$ go env GOMODCACHE

如果目录不为空或者/dev/null,请跳过。

go env -w GOMODCACHE=$GOPATH/pkg/mod

goctl安装

安装(mac&linux)

# Go 1.15 及之前版本
GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest

# Go 1.16 及以后版本
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest

环境变量检测

go get 下载编译后的二进制文件位于 $GOPATH/bin 目录下,要确保$GOPATH/bin已经添加到环境变量。

执行vim /etc/paths,在最后一行添加如下内容

$GOPATH/bin

安装结果验证

goctl -v

安装(windows)

执行命令

go install github.com/zeromicro/go-zero/tools/goctl@latest

goctl使用详情参考goctl

protoc & protoc-gen-go安装

protoc是一款用C++编写的工具,其可以将proto文件翻译为指定语言的代码。在go-zero的微服务中,我们采用grpc进行服务间的通信,而grpc的编写就需要用到protoc和翻译成go语言rpc stub代码的插件protoc-gen-go。

goctl一键安装

$ goctl env check -i -f --verbose                                 
[goctl-env]: preparing to check env

[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is not found in PATH
[goctl-env]: preparing to install "protoc"
"protoc" installed from cache
[goctl-env]: "protoc" is already installed in "/Users/keson/go/bin/protoc"

[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go"
"protoc-gen-go" installed from cache
[goctl-env]: "protoc-gen-go" is already installed in "/Users/keson/go/bin/protoc-gen-go"

[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go-grpc"
"protoc-gen-go-grpc" installed from cache
[goctl-env]: "protoc-gen-go-grpc" is already installed in "/Users/keson/go/bin/protoc-gen-go-grpc"

[goctl-env]: congratulations! your goctl environment is ready!

goctl 各层代码生成一览

所有绿色背景的功能模块是自动生成的,按需激活,红色模块是需要自己写的,也就是增加下依赖,编写业务特有逻辑,各层示意图分别如下:

API Gateway

API Gateway

RPC

model

goctl 生成REST和RPC微服务

生成数据模型层Model

编写enterprise.sql文件

CREATE TABLE `enterprise_baseinfo` (
   `id` varchar(255) COLLATE utf8_croatian_ci NOT NULL COMMENT 'id',
   `region_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '区域编码',
   `region_name` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '区域名称',
   `province_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属省份code',
   `province_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属省份名称',
   `city_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属城市code',
   `city_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属城市名称',
   `county_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属区县code',
   `county_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属区县名称',
   `town_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属乡镇名称',
   `street_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '街(村)、门牌号',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=企业信息';

运行模板生成命令

goctl model mysql ddl -src ./model/enterprise.sql -dir ./model -c

生成API服务

首先创建 api 文件

$ vim api/enterprisesAPI.api

enterprisesAPI.api文件说明

syntax = "v1"
//swagger信息
info(
	title: "企业信息"
	desc: "企业信息"
	author: "xxx"
	email: "xx@qq.com"
	version: "v1.0"
)
//查询操作入参
type GetRequest {
	Id string `path:"id"`
}
//查询操作出参
type GetResponse {
	Message string `json:"message"`
}
//新增操作入参
type PostRequest {
	RegionCode   string `json:"region_code"`
	RegionName   string `json:"region_name"`
	ProvinceCode string `json:"province_code"`
	ProvinceName string `json:"province_name"`
	CityCode     string `json:"city_code"`
	CityName     string `json:"city_name"`
	CountyCode   string `json:"county_code"`
	CountyName   string `json:"county_name"`
	TownName     string `json:"town_name"`
	StreetName   string `json:"street_name"`
}
//新增操作出参
type PostResponse {
	Message string `json:"message"`
}
//更新操作入参
type PutRequest {
	Id           string `json:"id"`
	RegionCode   string `json:"region_code"`
	RegionName   string `json:"region_name"`
	ProvinceCode string `json:"province_code"`
	ProvinceName string `json:"province_name"`
	CityCode     string `json:"city_code"`
	CityName     string `json:"city_name"`
	CountyCode   string `json:"county_code"`
	CountyName   string `json:"county_name"`
	TownName     string `json:"town_name"`
	StreetName   string `json:"street_name"`
}
//更新操作出参
type PutResponse {
	Message string `json:"message"`
}
//删除操作入参
type DelRequest {
	Id string `path:"id"`
}
//删除操作出参
type DelResponse {
	Message string `json:"message"`
}
//配置enterprises接口
service enterprises-api {
	//swagger配置接口信息
	@doc(
		summary: "查询企业详情"
		description: "查询企业详情"
	)
	@handler GetHandler //接口绑定的handler
	get /enterprises/:id (GetRequest) returns (GetResponse)
	
	@doc(
		summary: "新增企业信息"
	)
	@handler PostHandler
	post /enterprises(PostRequest) returns (PostResponse)
	
	@doc(
		summary: "更新企业信息"
		description: "更新企业信息"
	)
	@handler PutHandler
	put /enterprises(PutRequest) returns (PutResponse)
	
	@doc(
		summary: "删除企业信息"
		description: "删除企业信息"
	)
	@handler DeleteHandler
	delete /enterprises/:id(DelRequest) returns (DelResponse)
}

运行模板生成命令

$ goctl api go -api enterprisesAPI.api -dir . -style gozero

目录结构

├── enterprisesAPI.api # api 文件
├── enterprises.go # 程序入口文件
├── etc
│   └── enterprises-api.yaml # api 网关层配置文件
├── go.mod
├── go.sum
└── internal
    ├── config
    │   └── config.go # 配置文件
    ├── handler # 视图函数层, handler 文件与下面的 logic 文件一一对应
    │   ├── xxxhandler.go
    │   ├── routes.go
    ├── logic # 需要手动填充代码的地方
    │   ├── xxxlogic.go
    ├── svc # 封装 rpc 对象的地方
    │   └── servicecontext.go
    └── types # 把 enterprisesAPI.api 中定义的结构体映射为真正的 golang 结构体
        └── types.go

开发者需要做的

  • 服务中的配置文件编写(etc/xx.yaml、internal/config/config.go)
  • 服务中业务逻辑编写(internal/logic/xxlogic.go)
  • 服务中资源上下文的编写(internal/svc/servicecontext.go)

修改配置文件

vim api/etc/enterprises-api.yaml

Name: enterprises-api
Port: 8888

ListenOn: 172.16.15.118:8888

EnterprisesRpc:
  Etcd:
    Hosts:
    - etcd:2379
    Key: enterprises-api

CacheRedis:
  - Host: ip:6379
    Type: node # node可以不写,可以设为cluster
    Pass: xxxx # 如果有密码

vim api/internal/config/config.go

package config

import (
	"github.com/zeromicro/go-zero/rest"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct {
	rest.RestConf
	zrpc.RpcServerConf
	EnterprisesRpc zrpc.RpcClientConf
}

修改上下文依赖

vim api/internal/svc/servicecontext.go

package svc

import (
	"enterprises/enterprises/enterprisesAPI/internal/config"
	"enterprises/enterprises/enterprisesRPC/enterprises"
	"github.com/zeromicro/go-zero/zrpc"
)

type ServiceContext struct {
	Config         config.Config
	EnterprisesRpc enterprises.Enterprises
}

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config:         c,
		EnterprisesRpc: enterprises.NewEnterprises(zrpc.MustNewClient(c.EnterprisesRpc)),
	}
}

修改业务逻辑

修改获取详情逻辑vim api/internal/logic/getlogic.go

package logic

import (
	"context"
	"enterprises/enterprises/enterprisesAPI/internal/svc"
	"enterprises/enterprises/enterprisesAPI/internal/types"
	"enterprises/enterprises/enterprisesRPC/enterprises"

	"github.com/zeromicro/go-zero/core/logx"
)

type GetLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLogic {
	return &GetLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *GetLogic) Get(req *types.GetRequest) (resp *types.GetResponse, err error) {
	// todo: add your logic here and delete this line
	enterprises, err := l.svcCtx.EnterprisesRpc.Detail(l.ctx, &enterprises.GetRequest{
		Id: 1,
	})
	if err != nil {
		return nil, err
	}
	return &types.GetResponse{
		Message: `"id":"` + enterprises.Id + `","EnterCode":"` + enterprises.EnterCode + `","EnterName":"` + enterprises.EnterName + `","Tyshxydm":"` + enterprises.Tyshxydm +
			`","EnterAddress":"` + enterprises.EnterAddress + `","RegionCode":"` + enterprises.RegionCode + `","RegionName":"` + enterprises.RegionName + `","ProvinceCode":"` + enterprises.ProvinceCode +
			`","ProvinceName":"` + enterprises.ProvinceName + `","CityCode":"` + enterprises.CityCode + `","CityName":"` + enterprises.CityName + `","CountyCode":"` + enterprises.CountyCode +
			`","CountyName":"` + enterprises.CountyName + `","TownName":"` + enterprises.TownName + `","StreetName":"` + enterprises.StreetName,
	}, nil
}

生成swagger

在.api文件中添加swagger注解,通过goctl swagger插件可以生成swagger接口文件

//swagger信息
info(
	title: "企业信息"
	desc: "企业信息"
	author: "xxx"
	email: "xx@qq.com"
	version: "v1.0"
)

...

//swagger配置接口信息
@doc(
	summary: "查询企业详情"
)
@handler GetHandler //接口绑定的handler
get /enterprises/:id (GetRequest) returns (GetResponse)

安装goctl-swagger插件

go install github.com/zeromicro/goctl-swagger@latest

执行swagger生成命令

goctl api plugin -plugin goctl-swagger="swagger -filename enterprisesAPI.json" -api enterprisesAPI.api -dir .

生成rpc服务

方式一:快速生成greet服务

$ goctl rpc new greet

方式二:通过指定proto生成rpc服务

$ goctl rpc template -o=enterprise.proto

生成rpc服务代码

$ goctl rpc protoc enterprise.proto --go_out=. --go-grpc_out=. --zrpc_out=.

开发者需要做的

  • 服务中的配置文件编写(etc/xx.yaml、internal/config/config.go)
  • 服务中资源上下文的编写(internal/svc/servicecontext.go)
  • 服务中业务逻辑编写(internal/logic/xxlogic.go)

修改配置文件

vim rpc/etc/enterprise.yaml

修改服务监听地址,端口号为 0.0.0.0:8083,Etcd 服务配置,Mysql 服务配置,CacheRedis 服务配置

Name: enterprises-rpc
ListenOn: 0.0.0.0:8083

Etcd:
  Hosts:
  - 127.0.0.1:2379
  Key: enterprises-rpc


Mysql:
  DataSource: ads:xxx@tcp(172.16.17.2:3306)/ads_environment?charset=utf8mb4&parseTime=true

CacheRedis:
  - Host: ip:6379
    Type: node # node可以不写,可以设为cluster
    Pass: xxxx # 如果有密码

添加 Mysql 服务配置,CacheRedis 服务配置的实例化

vim rpc/internal/config/config.go

package config

import (
	"github.com/zeromicro/go-zero/core/stores/cache"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct {
	zrpc.RpcServerConf

	//mysql配置
	Mysql struct {
		DataSource string
	}
	//redis配置
	CacheRedis cache.CacheConf
}

修改上下文依赖

注册服务上下文 model 的依赖vim rpc/internal/svc/servicecontext.go

package svc

import (
	"enterprises/enterprises/enterprisesRPC/internal/config"
	"enterprises/enterprises/model"
	"github.com/zeromicro/go-zero/core/stores/sqlx"
)

type ServiceContext struct {
	Config                     config.Config
	AdsEnterpriseBaseinfoModel model.AdsEnterpriseBaseinfoModel
}

func NewServiceContext(c config.Config) *ServiceContext {
	conn := sqlx.NewMysql(c.Mysql.DataSource)
	return &ServiceContext{
		Config:                     c,
		AdsEnterpriseBaseinfoModel: model.NewAdsEnterpriseBaseinfoModel(conn, c.CacheRedis),
	}
}

启动RPC服务

go run enterprise.go -f etc/enterprises.yaml

启动REST服务

go run enterprises.go -f etc/enterprisesAPI-api.yaml

集成Nacos注册中心

安装依赖

go get -u github.com/zeromicro/zero-contrib/zrpc/registry/nacos

修改配置

在etc/xx.yaml配置文件中添加服务IP及端口

ListenOn: 127.0.0.1:8081 //填写真实ip及端口

3.在xxx.go启动文件上添加nacos配置

package main

import (
	"flag"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/zrpc"
	"github.com/zeromicro/zero-contrib/zrpc/registry/nacos"
	//-------------------------------------------------
	// 引入包
	_ "github.com/zeromicro/zero-contrib/zrpc/registry/nacos"
	//-------------------------------------------------
	"go-zero-demo/mall/user/rpc/internal/config"
	"go-zero-demo/mall/user/rpc/internal/server"
	"go-zero-demo/mall/user/rpc/internal/svc"
	"go-zero-demo/mall/user/rpc/types/user"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

var configFile = flag.String("f", "etc/xxxx.yaml", "the config file")

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)
	ctx := svc.NewServiceContext(c)
	srv := server.NewUserServer(ctx)

	serverRpc := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
		user.RegisterUserServer(grpcServer, srv)

		if c.Mode == service.DevMode || c.Mode == service.TestMode {
		reflection.Register(grpcServer)
		}
	})
	//------------------------------------------------------------------------
	// 注册服务到nacos
	sc := []constant.ServerConfig{
		*constant.NewServerConfig("127.0.0.1", 8848),
	}

	cc := &constant.ClientConfig{
		NamespaceId:         "",
		TimeoutMs:           50000,
		NotLoadCacheAtStart: true,
		LogDir:              "/tmp/nacos/log",
		CacheDir:            "/tmp/nacos/cache",
		LogLevel:            "debug",
	}

	opts := nacos.NewNacosConfig("enterprises-api", c.ListenOn, sc, cc)
	_ = nacos.RegisterService(opts)
	//----------------------------------------------------------------------
	serverRpc.Start()
}

集成服务监控Prometheus

在rest和rpc的yaml配置文件中添加Prometheus配置

api/etc/enterprise.yaml

Prometheus:
  Host: 0.0.0.0
  Port: 9080   # 指标采集端口
  Path: /metrics

rpc/etc/enterprise.yaml

Prometheus:
  Host: 0.0.0.0
  Port: 9081   # 指标采集端口
  Path: /metrics

修改 Prometheus 配置

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.     
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.  
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  # 自己的项目配置
  - job_name: 'enterprise'
    static_configs:
      # 目标的采集地址
      - targets: ['golang:9080']
        labels:
          # 自定义标签
          app: 'enterprise-api'
          env: 'test'

      - targets: ['golang:9081']
        labels:
          app: 'enterprise-rpc'
          env: 'test'


集成链路追踪

Jaeger 是 Uber 开发并开源的一款分布式追踪系统,兼容 OpenTracing API,适用于以下场景:

  • 分布式跟踪信息传递
  • 分布式事务监控
  • 问题分析
  • 服务依赖性分析
  • 性能优化

Jaeger 的全链路追踪功能主要由三个角色完成:

  • client:负责全链路上各个调用点的计时、采样,并将 tracing 数据发往本地 agent。
  • agent:负责收集 client 发来的 tracing 数据,并以 thrift 协议转发给 collector。
  • collector:负责搜集所有 agent 上报的 tracing 数据,统一存储。

在rest和rpc服务的yaml文件中添加Telemetry 配置

rest

Telemetry:
  Name: enterprise-api
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger

rpc

Telemetry:
  Name: enterprise-rpc
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger

附录

api配置

api配置控制着api服务中的各种功能,包含但不限于服务监听地址,端口,环境配置,日志配置等,下面我们从一个简单的配置来看一下api中常用配置分别有什么作用。

配置说明

通过yaml配置我们会发现,有很多参数我们并没有与config对齐,这是因为config定义中,有很多都是带optional或者default 标签的,对于optional可选项,你可以根据自己需求判断是否需要设置,对于default标签,如果你觉得默认值就已经够了,可以不用设置, 一般default中的值基本不用修改,可以认为是最佳实践值。

Config

type Config struct{
    rest.RestConf // rest api配置
    Auth struct { // jwt鉴权配置
        AccessSecret string // jwt密钥
        AccessExpire int64 // 有效期,单位:秒
    }
    Mysql struct { // 数据库配置,除mysql外,可能还有mongo等其他数据库
        DataSource string // mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
    }
    CacheRedis cache.CacheConf // redis缓存
    UserRpc    zrpc.RpcClientConf // rpc client配置
}    

rest.RestConf

api服务基础配置,包含监听地址,监听端口,证书配置,限流,熔断参数,超时参数等控制,对其展开我们可以看到:

type RestConf struct{
    service.ServiceConf // service配置
    Host         string `json:",default=0.0.0.0"` // http监听ip,默认0.0.0.0
    Port         int // http监听端口,必填
    CertFile     string `json:",optional"` // https证书文件,可选
    KeyFile      string `json:",optional"` // https私钥文件,可选 
    Verbose      bool   `json:",optional"` // 是否打印详细http请求日志
    MaxConns     int    `json:",default=10000"` // http同时可接受最大请求数(限流数),默认10000
    MaxBytes     int64  `json:",default=1048576,range=[0:8388608]"` // http可接受请求的最大ContentLength,默认1048576,被设置值不能必须在0到8388608之间
    // milliseconds
    Timeout      int64         `json:",default=3000"` // 超时时长控制,单位:毫秒,默认3000
    CpuThreshold int64         `json:",default=900,range=[0:1000]"` // cpu降载阈值,默认900,可允许设置范围0到1000
    Signature    SignatureConf `json:",optional"` // 签名配置
}

service.ServiceConf

type ServiceConf struct {
    Name       string // 服务名称
    Log        logx.LogConf // 日志配置
    Mode       string            `json:",default=pro,options=dev|test|pre|pro"` // 服务环境,dev-开发环境,test-测试环境,pre-预发环境,pro-正式环境
    MetricsUrl string            `json:",optional"` // 指标上报接口地址,该地址需要支持post json即可
    Prometheus prometheus.Config `json:",optional"` // prometheus配置
}

logx.LogConf

type LogConf struct {
    ServiceName         string `json:",optional"` // 服务名称
    Mode                string `json:",default=console,options=console|file|volume"` // 日志模式,console-输出到console,file-输出到当前服务器(容器)文件,,volume-输出docker挂在文件内
    Path                string `json:",default=logs"` // 日志存储路径
    Level               string `json:",default=info,options=info|error|severe"` // 日志级别
    Compress            bool   `json:",optional"` // 是否开启gzip压缩
    KeepDays            int    `json:",optional"` // 日志保留天数
    StackCooldownMillis int    `json:",default=100"` // 日志write间隔
}

prometheus.Config

type Config struct {
    Host string `json:",optional"` // prometheus 监听host
    Port int    `json:",default=9101"` // prometheus 监听端口
    Path string `json:",default=/metrics"` // 上报地址
}

SignatureConf

type SignatureConf struct {
    Strict      bool          `json:",default=false"` // 是否Strict模式,如果是则PrivateKeys必填
    Expiry      time.Duration `json:",default=1h"` // 有效期,默认1小时
    PrivateKeys []PrivateKeyConf // 签名密钥相关配置
}

PrivateKeyConf

type PrivateKeyConf struct {
    Fingerprint string // 指纹配置
    KeyFile     string // 密钥配置
}

cache.CacheConf

type CacheConf struct{
    ClusterConf []NodeConf
    
    NodeConf struct {
        redis.RedisConf
        Weight int `json:",default=100"` // 权重
    }
}

redis.RedisConf

type RedisConf struct {
    Host string // redis地址
    Type string `json:",default=node,options=node|cluster"` // redis类型
    Pass string `json:",optional"` // redis密码
}

rpc配置

rpc配置控制着一个rpc服务的各种功能,包含但不限于监听地址,etcd配置,超时,熔断配置等,下面我们以一个常见的rpc服务配置来进行说明。

配置说明

type Config struct {
    zrpc.RpcServerConf
    CacheRedis         cache.CacheConf // redis缓存配置,详情见api配置说明,这里不赘述
    Mysql struct { // mysql数据库访问配置,详情见api配置说明,这里不赘述
        DataSource string
    }
}

zrpc.RpcServerConf

type RpcServerConf struct {
    service.ServiceConf // 服务配置,详情见api配置说明,这里不赘述
    ListenOn      string // rpc监听地址和端口,如:127.0.0.1:8888
    Etcd          discov.EtcdConf    `json:",optional"` // etcd相关配置
    Auth          bool               `json:",optional"` // 是否开启Auth,如果是则Redis为必填
    Redis         redis.RedisKeyConf `json:",optional"` // Auth验证
    StrictControl bool               `json:",optional"` // 是否Strict模式,如果是则遇到错误是Auth失败,否则可以认为成功
    // pending forever is not allowed
    // never set it to 0, if zero, the underlying will set to 2s automatically
    Timeout      int64 `json:",default=2000"` // 超时控制,单位:毫秒
    CpuThreshold int64 `json:",default=900,range=[0:1000]"` cpu降载阈值,默认900,可允许设置范围0到1000
}

discov.EtcdConf

type EtcdConf struct {
    Hosts []string // etcd host数组
    Key   string // rpc注册key
}

redis.RedisKeyConf

type RedisConf struct {
    Host string // redis 主机
    Type string `json:",default=node,options=node|cluster"` // redis类型
    Pass string `json:",optional"` // redis密码
}

type RedisKeyConf struct {
    RedisConf
    Key string `json:",optional"` // 验证key
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMake基本使用

重要指令 cmake_minimum_required:指定CMake最小版本要求 project&#xff1a;定义工程名称&#xff0c;并可指定语言 set&#xff1a;显示的定义变量 include_directories&#xff1a;向工程添加多个特定头文件搜素路径 link_directories&#xff1a;向工程添加多个特定库文件…

Spring lettuce读写分离

Redis 的 Sentinel 模式默认配置下 Redis 的客户端只对 Master 读写&#xff0c;另外2个Slave闲置。若主从节点在不同机房&#xff0c;在读取时会有跨机房的网络时延&#xff0c;并且比同机房访问更容易发生网络丢包。故在一些场景可以考虑将跨机房的服务节点设置为读写分离 Re…

计算机组成原理——第五章中央处理器(下)

梦里不知身是客&#xff0c;一晌贪欢 文章目录 5.6.1 指令流水线的基本概念5.6.2 指令流水线的影响因素和分类五段式指令流水线5.7.1 多处理器的基本概念5.7.2 硬件多线程的基本概念 5.6.1 指令流水线的基本概念 想要对指令的过程进行优化&#xff0c;一条指令的执行过程可以被…

世界新冠疫情数countrydata.csv 表,实战分析

一、环境要求 Hadoop hive spark hbase开发环境 开启hadoop&#xff1a;start-all.sh开启zookeeper&#xff1a;zkServer.sh start开启hive&#xff1a;nohup hive --service metastore &nohup hive --service hiveserver2 & 打开hive界面&#xff1a;beeline -u …

单列集合之Set集合以及各种实现类

Set集合 Set接口也是Collection单列结合的一个子接口&#xff0c;set集合中没有提供其他额外的方法&#xff0c;但是相比较Collection集合新增了其他的特性。所有实现了Set接口的类都可以叫做Set集合。 Coliection接口中的方法&#xff1a;Collection集合的方法 Set集合不允…

更全面的对比GPT4和Claude对MLIR的掌握能力

本文构造了20个MLIR基础概念的问题以及使用OneFlow IR转换为Tosa IR的5个代码段来评测GPT4和Claude对于MLIR的掌握能力&#xff0c;我的结论是对于基础概念的理解Claude整体上和GPT4持平&#xff0c;而在阅读相关代码片段时Claude表现出了比GPT4更强一点的理解能力。 0x0. 前言…

【Python】读取r语言数据+NMF算法(完整代码+详细注释)

目录 依赖库代码功能完整代码总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 欢迎关注 『Python』 系列&#xff0c;持续更新中 算法部分源码是我的数模兄弟想要深入研究nmf算法方面的内容发给我让我跑的 参考自博文 https://blog.csdn.net/atease0001/article/details/…

计及光伏电站快速无功响应特性的分布式电源优化配置方法(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

JS的函数定义和参数

文章目录 一、JavaScript 函数定义二、JavaScript 函数参数总结 一、JavaScript 函数定义 JavaScript 使用关键字 function 定义函数。 函数可以通过声明定义&#xff0c;也可以是一个表达式。 函数声明 function functionName(parameters) {执行的代码 }函数声明后不会立即…

【C++内联函数】

目录 前言内联函数的概念内联函数的特性内联函数的总结 前言 假设有这样的一个场景&#xff0c;有一个代码量不足三行的函数被调用了一万次&#xff0c;现在让你做优化&#xff0c;你会怎么考虑优化&#xff1f; 我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之…

Ansys Lumerical | 使用 STACK 仿真抗反射偏振器件

1、说明 在本示例中&#xff0c;我们将展示使用 Lumerical STACK 求解器来设计抗反射圆偏振器&#xff0c;以减少 OLED 显示器的环境光反射。 2、综述 OLED 显示器的底部金属电极可以用于增强光提取效率&#xff0c;然而它也会带来环境光反射的不利影响&#xff0c;导致显示器在…

深度学习-基础(二)-numpy中的轴操作

背景 使用Pytorch进行学习&#xff0c;少不了跟numpy打交道&#xff0c;比如数据集中去除通道reduction只有做加法运算等&#xff0c;但是numpy轴操作&#xff0c;很少有人讲清楚&#xff0c;此处加以梳理。 轴的概念 轴用来为超过一维的数组定义的属性&#xff0c;二维数据…

【Atlas500】华为500小站预配置

目录 基础配置解决配置能力项未开启问题 基础配置 1.网线连接盒子 2.1口IP:192.168.2.111 2口IP&#xff1a;192.168.3.111 3.登临网页https://192.168.2.111 输入用户名和密码&#xff08;管理端用户&#xff09;。 ● 默认用户名&#xff1a;admin ● 默认密码&#xff1a;H…

Eclipse安装插件及所有插件下载地址汇总

Eclipse安装插件及所有插件下载地址汇总 插件的意义安装插件各插件下载地址汇总kepler&#xff08;Eclipse配置本地安装好的Tomcat时使用的插件&#xff09;另一个插件名称 插件的意义 自认是为了解耦&#xff0c;使使用eclipse的人可以依据自己所需&#xff0c;有针对性的下载…

MySQL_第04章_运算符

第04章_运算符 讲师&#xff1a;尚硅谷 - 宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a; http://www.atguigu.com 1. 算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式…

Node第三方包 【mysql2】

文章目录 &#x1f31f;前言&#x1f31f;访问数据库&#x1f31f;MySQL驱动&#x1f31f;mysql2&#x1f31f;安装 &#x1f31f;方法&#x1f31f;连接数据库&#x1f31f;通过 query() 方法执行SQL语句&#x1f31f;通过 execute() 方法执行SQL语句 &#x1f31f;使用连接池…

研报精选230419

目录 【行业230419东吴证券】AACR2023本土药企临床进展&#xff1a;“秒懂”全球创新药系列研究之会议追踪 【行业230419浙商证券】大制造行业估值手册&#xff1a;周度数据跟踪 【行业230419东方财富证券】2023上海车展前瞻&#xff1a;自主争先&#xff0c;迎接智能电动新时代…

#Chrome扩展程序开发教程--03:Manifest

#Chrome扩展程序开发教程--03&#xff1a;Manifest 引言1、基本介绍2、必须属性3、重要属性3.1、permissions、host_permissions、optional_permissions、optional_host_permissions3.2、background3.3、content_scripts3.4、action3.5、options_page3.6、options_ui3.7、icons…

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

TiDB实战篇-Data Migration (DM) 同步数据

目录 简介 原理 任务管理 ​编辑同步拓扑示例 使用场景 限制 硬件配置 安装&升级 部署 生成配置文件 生成配置文件模板 更具自身的机器修改 部署 启动集群&查看集群 实战 上游数据库前提 配置mysql的相关配置 编写DM的MySQL相关配置 把MySQL和DM …