Skip to content

Releases: grpc-kit/cli

release-v0.3.8

15 Jan 15:20
1270ce7
Compare
Choose a tag to compare

[0.3.8] - 2025-01-15

Added

降低编译后二进制大小

go build -ldflags="-s -w"

为降低生成的二进制大小,默认移除调试符号表和调试信息。

基于 cloudevents 添加审计事件

启用功能后在,客户端请求接口,服务端自动推送相应请求、响应事件以便审计。

{
    "service_name": "netdev.v1.oneops.api.grpc-kit.com",
    "level": "request_response",
    "audit_id": "ee03fc569f7ebf8c88ef026457db5425",
    "stage": "response_complete",
    "grpc_method": "ListSwitchAdminUsers",
    "grpc_service": "default.api.oneops.netdev.v1.OneopsNetdev",
    "user": {
        "uid": "user1",
        "username": "user1",
        "groups": [
            "kpy-seat"
        ],
        "extra": {}
    },
    "source_ips": [
        "127.0.0.1"
    ],
    "user_agent": "PostmanRuntime/7.43.0",
    "response_status": {
        "status": "success",
        "reason": "OK",
        "code": 200
    },
    "request_object": "{}",
    "response_object": "{}",
    "request_received_timestamp": "2024-12-24T15:33:47.814063+08:00",
    "stage_timestamp": "2024-12-24T15:33:47.844292+08:00"
}

支持缓存服务配置

# 缓存服务配置
cachebox:
  enable: true
  driver: memory # memory, redis
  memory:
    max_entry: 60
  #redis:
    #endpoints:

添加 docs 目录

放置项目相关文档与说明。

ent 添加 mixin 示例固定字段

func (Demo) Mixin() []ent.Mixin {
	return []ent.Mixin{
		mixin.Time{},
	}
}

这样初始化数据库表时,自动会添加 "create_time" 与 "update_time" 字段。

添加工作流的支持

配置

# 流程编排配置
automations:
  enable: true
  # kubernetes-1.26.11/staging/src/k8s.io/client-go/tools/clientcmd/client_config.go
  kubernetes:
    # 未配置则为 inClusterConfig 使用集群内 sa 授权
    config_path: /Users/mingqing/.kube/config
    #rest_config:
    #  host: fake.dev.kpy.cloud:6443
    #  bearer_token: xxx
    #  tls_client_config:
    #    insecure: true

handler/private.go

	if m.baseCfg.Automations.Enable {
		fcc, err := m.baseCfg.GetFlowClientConfig()
		if err != nil {
			return idpOpts, err
		}

		idpOpts = append(idpOpts, modeler.WithWorkflow(m.logger, fcc))
	}

改造

modeler/flow/

添加常见 git lfs 文件

.gitattributes

*.tar.gz filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text

Fixed

使用 podman 构建镜像错误

在 Makefile 中使用错误,

Cannot connect to Podman. Please verify your connection to the Linux system using podman system connection list, or try podman machine init and podman machine start to manage a new Linux VM
Error: unable to connect to Podman socket: Get "http://d/v4.4.0/libpod/_ping": dial unix ///var/folders/m5/4s1cpkvd3xsbt7lr9ncwl1xw0000gn/T/podman-run--1/podman/podman.sock: connect: no such file or directory

但直接在 shell 中使用 podman 又是正常的。

因为在系统中使用了 alias docker="podman" 设置别名,可能引起变量无法集成,改进 scripts/docker.sh 脚本,支持自动判断 dockerpodman 容器运行时。

ent 交叉编译问题

>> precheck environment
>> generation release version
>> generation code from proto files
>> generation database schema
fork/exec /var/folders/m5/4s1cpkvd3xsbt7lr9ncwl1xw0000gn/T/go-build462434904/b001/exe/entc: exec format error
modeler/ent/generate.go:3: running "go": exit status 1
make: *** [generate] Error 1

因为 "go:generate" 也是继承 "GOOS"、"GOARCH" 变量,如果跟当前主机不匹配,则后续的 "go run" 是无法运行的。

通过变量 "GOOS=${GOHOSTOS} GOARCH=${GOHOSTARCH} go generate ./modeler/ent/" 解决。

release-v0.3.7

28 Aug 07:57
Compare
Choose a tag to compare

[0.3.7] - 2024-08-28

Fixed

修复 "security.enable" 关闭情况下的空指针

>> precheck environment
>> generation release version
>> generation code from proto files
>> generation database schema
Using config file: config/app-dev-local.yaml
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x38 pc=0x1032af7b0]

goroutine 1 [running]:
github.com/grpc-kit/pkg/cfg.(*LocalConfig).SecurityPolicyLoad(0x140007ea360, {0x103e8e510, 0x104d2ffa0}, {0x14000301860?})
	/Users/coding/go/pkg/mod/github.com/grpc-kit/pkg@v0.3.6/cfg/cfg.go:420 +0x140
github.com/opsaid/testdb/handler.(*Microservice).Register(0x1400018aa00, {0x103e8e510, 0x104d2ffa0})
	/Users/coding/go/src/git.lmq.io/training/testdb/handler/register.go:27 +0x1e0
main.startServer({0x103e8e510, 0x104d2ffa0})
	/Users/coding/go/src/git.lmq.io/training/testdb/cmd/server/main.go:72 +0x4c
main.main()
	/Users/coding/go/src/git.lmq.io/training/testdb/cmd/server/main.go:47 +0x158
exit status 2
make: *** [run] Error 1

Added

重构 database 引入 ent 框架

  1. 添加 "modeler/ent/entc.go" 文件;

  2. 添加 "modeler/ent/generate.go" 文件;

  3. 在 Makefile 添加 "generation database schema" 阶段;

  4. 变更 "handler/microservice.go" 中 Init 方法添加,如:

     // 其他个性扩展逻辑
     opts, err := m.privateExtended()
     if err != nil {
         return m, err
     }
    
     // 自定义配置初始化
     if err = m.thisCfg.Init(opts...); err != nil {
         return m, err
     }
  5. 更改 modeler/independent_cfg.go 添加 WithXXXOption;

  6. 在 handler/private.go 中注册方法,如:

     idpOpts := make([]modeler.ClientIndependentOption, 0)
     idpOpts = append(idpOpts, modeler.WithLogger(m.logger))
    
     driver, err := m.baseCfg.GetDatabaseEntSQLDriver()
     if err == nil && driver != nil {
     	idpOpts = append(idpOpts, modeler.WithDatabaseEntDriver(driver))
     }

release-v0.3.6

25 May 06:04
22c363d
Compare
Choose a tag to compare

[0.3.6] - 2024-05-25

Added

实现基于 OPA 的鉴权方案

在使用本方案时,存在以下三种数据:

  1. 权限鉴权模型:由开发人员设计编写,使用 rego 语言;

    • 在各微服务内嵌路径:internal/security/auth.rego
    • 可配置使用外部文件:"security.authorization.opa_native.policy.auth_file" 参数决定
    • 数据源也可来自外部服务
  2. 权限验证数据:由管理人员添加补充,格式微 envoy rbac 数据结构,使用 yaml 格式;

    • 在各微服务内嵌路径:internal/security/data.yaml
    • 可配置使用外部文件:"security.authorization.opa_native.policy.data_file" 参数决定
    • 数据源也可来自外部服务
  3. 用户输入数据:由用户登录后产生的数据,提出关键字根据模型对比,是否允许。

    • 由服务框架自动转换为兼容 opa-envoy-plugin 的 input 结构

当前仅能实现根据 "http method"、"http header"、"http url" 进行权限鉴定。具体使用见参考示例。

K8S 部署模版的优化

  • 变量的默认值

为变量 "KUBERNETES_LABEL_PREFIX", "KUBERNETES_PM2_UUID", "KUBERNETES_CLUSTER_DOMAIN" 设置默认值。

  • 在部署模版添加 tls secret 配置
secretGenerator:
- name: git-lmq-io-tls
  files:
  - tls.crt=config/tls/git.lmq.io.pem
  - tls.key=config/tls/git.lmq.io.key
  type: "kubernetes.io/tls"
  options:
    disableNameSuffixHash: true
  • 添加安全加固策略
......
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          capabilities:
            drop:
            - ALL
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        seccompProfile:
          type: RuntimeDefault
        runAsGroup: 65534
        runAsUser: 65534
        runAsNonRoot: true
......

Fixed

配置项 "independent" 中存在 "time.Duration" 类型无法解析

类似如下错误:

>> precheck environment
>> generation release version
>> generation assets to static code
>> generation code from proto files
Using config file: config/app-dev-local.yaml
Start server err: 1 error(s) decoding:

* 'storage_configs[0].write_timeout' expected type 'time.Duration', got unconvertible type 'string', value: '10s'
exit status 1
make: *** [run] Error 1

这个因为 "independent" 使用了全局单独的 mapstructure.Decode 解析,默认仅支持基础类型(bool, int, string),这里通过自定义解析器,添加 "time.Duration" 类型即可,类似viper的实现。

Changed

配置存储在 etcd 更改为 json 格式

跟 k8s crd 类似,不存储为 yaml 避免第三方类库引入,json 格式需压缩。

请求头 “x-tr-request-id" 响应传递行为

如果客户端主动设置了 "x-tr-request-id" 请求头:

  1. 当响应成功时,不能返回客户端设置的 "x-tr-request-id" 值;
  2. 当响应失败时,返回了客户端设置的 "x-tr-request-id" 值,变更为忽略客户端设置值。

默认生成的 swagger 文档使用了驼峰格式

// DemoRequest Demo 方法请求可使用的接口参数
type DemoRequest struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    UserName string             `protobuf:"bytes,3,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
}

在 "protoc-gen-openapiv2" 设置参数 "json_names_for_fields=false" 以使用 "protobuf:name=" 的值替代默认 "protobuf:json=" 的内容来生成 swagger 文档属性。

grpc-ecosystem/grpc-gateway#3594

静态 admin webroot 服务默认生成 index.html 文件

为解决 go embed admin:* 空目录问题,由生成原文件 "public/admin/.not-empty-dir.txt" 变更为 "public/admin/index.html" 文件。

release-v0.3.5

26 Dec 05:40
c3a37e4
Compare
Choose a tag to compare

[0.3.5] - 2023-12-26

Added

新增前端静态文件托管服务

如果版本为 "grpc-kit-cli/0.3.4" 或之前,可通过更改由该工具生成的模版中以下部分代码,以接入服务。

更多内容也可参考文档

  • 新增 .gitignore 以下内容
# Frontend
web/admin/node_modules
web/webroot/node_modules
public/openapi/microservice.swagger.json
  • 更改 public 目录结构与 "embed.go" 内容
mv public/doc public/openapi

mkdir public/admin public/webroot

mv public/openapi/embed.go public
package public

import (
	"embed"
)

//go:embed admin/*
//go:embed openapi/*
//go:embed webroot/*
var Assets embed.FS
  • 变更 handler/register.go 对静态文件引用
import xxx/xxx/public/doc

import xxx/xxx/public
    // 移除
    // 注册API文档
    mux.Handle("/openapi-spec/", http.FileServer(http.FS(doc.Assets)))

    // 新增
    // 注册前端静态数据托管
    if err = m.baseCfg.HTTPHandlerFrontend(mux, public.Assets); err != nil {
        return err
    }
  • 变更 public/doc/openapi-spec 路径
scripts/genproto.sh

mv ./api/${PRODUCT_CODE}/${SHORT_NAME}/${API_VERSION}/microservice.swagger.json ./public/doc/openapi-api/

->

mv ./api/${PRODUCT_CODE}/${SHORT_NAME}/${API_VERSION}/microservice.swagger.json ./public/openapi/
  • 健康探测 healthz 地址的变更

由 "/healthz" 变更为 "/api/healthz",如有接口探测需更改下地址,如 k8s 的存活探测,参考以下 "Changed" 部分说明。

使用 TLS 加密 gRPC 或 HTTP 连接

支持 http 与 grpc 服务 tls 加密,可使用 acme TLS-ALPN-01 方式自动化证书等,详见文档

可单独开启或关闭 gRPC 或 HTTP 服务

services:
  grpc_service
    enabled: true

  http_service
    enabled: false

这样开启 grpc 并关闭 http 服务。

Changed

统一 Microservice 使用指针接收器

原 Microservice 结构体在 rpc 定义方法中均非指针形式,如下:

func (m Microservice) HealthCheck

现对其结构体统一使用指针形式,更改为:

func (m *Microservice) HealthCheck

这里参考了 https://github.com/grpc/grpc-go/blob/v1.60.0/health/server.go#L46。

开发环境容器镜像默认以 "latest" 为标签

构建系统通过获取以下变量决定使用哪个 "env-${DEPLOY_ENV}-${BUILD_ENV}" 文件

export DEPLOY_ENV=dev
export BUILD_ENV=local

当为 dev 环境构建容器镜像标签默认均为 "latest",其他环境默认使用 "VERSION" 内容。

健康探测 http api 接口 healthz 地址变更

由于针对所有 grpc 转化为 http 接口强制使用 "/api/" 为前缀,所以 "/healthz" 也变更为 "/api/healthz",这涉及到旧健康检测使用到的地方,如 k8s manifests:

spec:
  template:
    spec:
      containers:
        readinessProbe:
          httpGet:
            path: /api/healthz?service=_SERVICE_CODE_
            port: 10080
            scheme: HTTP

更改了默认 grpc 不使用 tls 的行为

不在使用 grpc.WithInsecure()grpc.WithTransportCredentials(insecure.NewCredentials()) 代替该功能,但这样不兼容原服务连接,需调整客户端代码,如:

grpc.DialContext(ctx, "127.0.0.1:10081",
        grpc.WithInsecure(),
        grpc.WithDefaultServiceConfig(serviceConfig))
grpc.DialContext(ctx, "127.0.0.1:10081",
        grpc.WithTransportCredentials(insecure.NewCredentials()),
        grpc.WithDefaultServiceConfig(serviceConfig))

目前约定,如果客户端主动配置了 http_service.tls_client.ca_filehttp_service.tls_client.insecure_skip_verify 则说明服务端主动配置了证书用于加密连接,如果没有则服务端默认使用 insecure.NewCredentials() 实现。

release-v0.3.4

15 Nov 09:51
3605e79
Compare
Choose a tag to compare

[0.3.4] - 2023-11-15

Added

新增客户端 health 验证示例函数

生成服务的模版地址 cmd/client/health.go

# go run cmd/client/health.go

grpc_health_v1 check ok
grpc health private check ok

该示例探测以下两个方法:

  1. 标准的 grpc_health_v1 Check 与 Watch 方法;
  2. 自定义的 HealthCheck 方法:
rpc HealthCheck(grpc_kit.api.known.status.v1.HealthCheckRequest) returns (grpc_kit.api.known.status.v1.HealthCheckResponse) {}

对类库 google.golang.org/grpc 版本不在锁定

原先的版本锁定为 v1.38.0 因为被 etcd 依赖,此次调整更新为最新 v1.59.0 版本,移除 go.mod 中 replace 语句。

replace google.golang.org/grpc => google.golang.org/grpc v1.38.0

Fixed

修复 rpc_grpc_status_code 状态码获取不对

rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Demo", ... ,rpc_system="grpc",le="0"} 1
rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Demo", ... ,rpc_system="grpc",le="10"} 2

这个为 otelgrpc 在 v0.45.0 版本 之前存在 BUG 需升级版本,statusCode 未成功赋值。

go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0

在新版本中已经修复。

release-v0.3.3

09 Nov 09:16
Compare
Choose a tag to compare

[0.3.3] - 2023-04-09

Added

配置对接兼容 S3 接口的公有云对象存储

  1. 基于 minio-go/v7 封装,提供简单:Get、Upload、Delete、Attributes、Iter 等方法;
  2. 实现腾讯云 COS、阿里云 OSS的接入,见配置使用文档

可观测性重构以支持 OTLP 协议上报数据

  1. 支持 遥测数据(链路、指标)通过 OLTP 协议上报数据,见 配置使用文档
  2. 支持 阿里云 可观测链路 OpenTelemetry 版 的接入;
  3. 支持 腾讯云 应用性能监控 的接入;
  4. 支持 私有 jaeger 服务 的接入。

环境文件 env-* 新增变量 DOCKER_IMAGE_FROM

scripts/env-dev-local

# 基础镜像:构建业务镜像依赖的基础环境
DOCKER_IMAGE_FROM=centos:latest

也就是控制 Dockerfile 中 FROM 的镜像来源。

在 jwt 中添加属性 tenant 表示租户

示例 token 格式如下:

{
  "aud": "api-gateway",
  "exp": 1893427200,
  "iat": 1668396542,
  "iss": "https://grpc-kit.com/oauth2",
  "sub": "oneops",
  "email": "oneops@grpc-kit.com",
  "email_verified": true,
  "federated_claims": {
    "connector_id": "local",
    "user_id": "oneops"
  },
  "groups": [
    "admin"
  ],
  "tenant" : "default"
}

相比原先新增 tenant 表示租户,参考了第三方文档设计

支持 http 响应体为空时以 204 状态码返回

当微服务中 rpc 方法定义使用 google.protobuf.Empty 类型返回时,处理请求时会在 http gateway 中判断 proto 类型是否为 *emptypb.Empty 如则以状态码 204 返回。

// 该微服务支持的 RPC 方法定义
service OpsaidTest1 {
  rpc HelloNoContent(DemoRequest) returns (google.protobuf.Empty) {}
}

Fixed

make manifests 变量问题修复

scripts/variable.sh: line 45: CI_BIZ_GROUP_APPID: command not found

Changed

升级 go-grpc-middleware 为 v2 版本

  1. go-grpc-middleware v1 已被废弃;
  2. 更改了服务依赖组件,以兼容 v2 版本。

私有 http handler 实现函数添加错误返回

在代码文件 handler/private.go 中函数 privateHTTPHandle(mux *http.ServeMux) error 添加错误返回。

同时这里实现的 http 接口默认不支持链路可观测,需用户特殊编码后开启,见配置使用文档

release-v0.3.2

28 May 08:34
7c3a79f
Compare
Choose a tag to compare

[0.3.2] - 2023-05-28

Added

更改 gitlab runner 为有向无环图 (DAG) 流水线

  1. 每个 job 均使用独立的容器来运行,避免无意义拆分多个 job;
  2. 在根目录默认生成 Dockerfile 文件;
  3. 确定默认镜像相关使用的变量名;

为方便 nginx 配置路由转发,更改 swagger 使用相对地址

  1. 由原先 “/openapi-spec/microservice.swagger.json” 更改为 "./microservice.swagger.json"

    <body>
      <redoc spec-url='./microservice.swagger.json'></redoc>
      <script src="./redoc.standalone.js"> </script>
    </body>
  2. 在 nginx 中 location 配置

    location /opsaid/test1/v1/openapi-spec/ {
        proxy_pass http://opsaid-test1:10080/openapi-spec/;
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Real-Port $remote_port;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  3. 实现对接口文档的转发

修复 gitlab 的 check-protoc 阶段检测文件错误

protoc-gen-go-grpc

gitlab runner 更改为 有向无环图 (DAG) 流水线

  1. 每个 job 均使用独立的 容器 来运行,适合用来运行独立的任务,加快速度,避免无意义拆分多个 job;
  2. 让 Dockerfile 默认生成;
  3. 确定默认镜像使用的变量名;
```shell
CI_REGISTRY
CI_REGISTRY_IMAGE
CI_REGISTRY_USER
CI_REGISTRY_PASSWORD
```

进入:https://{gitlab}/-/settings/ci_cd,设置好变量。

新增 jenkins 流水线模版配置

.jenkins/workflows/Jenkinsfile

依赖 k8s 环境,需提前配置好,参考 Jenkins Pipeline

统一规范 CICD 变量名

  1. 新增 scripts/variable.sh 用于动态变量生成;
  2. 区别 scripts/env 用于全局静态变量;
  3. 支持静态配置编译运行时的变量,文件路径 scripts/env-${DEPLOY_ENV}-${BUILD_ENV}

更改本微服务的 proto 为相对路径

github.com/opsaid/test1/api/opsaid/test1/v1/microservice.proto

更改为

api/opsaid/test1/v1/microservice.proto

为解决服务在容器内构建时,如果为绝对路径,则代码目录必须存放至 $GOPATH/src/$REPOSITORY 路径下,否则无法运行。

protoc \
    -I ./ \
    -I /usr/local/include/ \
    -I "${GOPATH}"/src \
    -I "${GOPATH}"/src/github.com/grpc-ecosystem/grpc-gateway/ \
    -I "${GOPATH}"/src/github.com/googleapis/googleapis/ \
    --go_opt paths=source_relative \
    --go_out ./ \
    --go-grpc_opt paths=source_relative \
    --go-grpc_opt require_unimplemented_servers=false \
    --go-grpc_out ./ \
    ./api/opsaid/test5/${API_VERSION}/*.proto

添加 paths=source_relative 这个的意思是在当前目录生成 *.pb.go 文件,而忽略 proto 文件中的 go_package 路径。

统一 Makefile 与 scripts 中镜像相关的变量

  • make manifests 自动生成部署清单:

    1. 文件:Dockerfile
    2. 目录:deploy/*
  • 移除 Makefile 中以下变量

    转移至 scripts/env 中做设定,因不直接在 Makefile 文件中使用,简化结构。

    # 构建Docker容器变量
    BUILD_GOOS      ?= $(shell ${GO} env GOOS)
    IMAGE_FROM      ?= scratch
    IMAGE_HOST      ?= hub.docker.com
    IMAGE_NAME      ?= ${IMAGE_HOST}/${NAMESPACE}/${SHORTNAME}
    IMAGE_VERSION   ?= ${RELEASE_VERSION}
    
    # 部署与运行相关变量
    BUILD_ENV       ?= local
    DEPLOY_ENV      ?= dev
  • 更改 NAMESPACE 为部署使用的空间

    区别于 PRODUCT_CODE 表示产品代码或项目代码,而 NAMESPACE 表示租户空间,部署含义。

  • 改进 scripts/manifests.sh 后的变量

    1. 移除 Makefile 中的 NAMESPACE 变量;
    BIZ_GROUP_APPID=hello
    DEPLOY_ENV=dev
    DEPLOY_ENV=local

    部署的环境变量,值:dev test prod stress demo staging

  • 生成模版时支持自定义路径

    make manifests TEMPLATES=kubernetes     TEMPLATE_PATH=../gitops/deploy/kubernetes/dev/

    添加以下内容:

    1. scripts/kaniko.sh
    2. 移除 scripts/env 镜像变量
    3. 支持设置全局变量以 env-$DEPLOY_ENV-$BUILD_ENV 文件为准;

Fixed

go embed 存在 .svn 异常

  • 问题

    + make lint
    >> precheck environment
    >> generation release version
    >> generation code from proto files
    public/doc/embed.go:9:12: pattern openapi-spec/*: cannot embed directory openapi-spec/.svn: invalid name .svn
    public/doc/embed.go:9:12: pattern openapi-spec/*: cannot embed directory openapi-spec/.svn: invalid name .svn
    make: *** [Makefile:74: lint] Error 1
  • 解决

    需更改为更明确的文件路径,避免使用 "*"

    // Code generated by "grpc-kit-cli/0.3.1-beta.1". DO NOT EDIT.
    
    package doc
    
    import (
        "embed"
    )
    
    //go:embed openapi-spec/*.js
    //go:embed openapi-spec/*.json
    //go:embed openapi-spec/*.html
    var Assets embed.FS

release-v0.3.1

09 Apr 07:59
607ca76
Compare
Choose a tag to compare

[0.3.1] - 2023-04-09

Added

  • 使用文档更新

    1. 去除 gogo 模块文档;
    2. 更新 grpc 地址由 https://github.com/golang/protobuf 转变为 https://github.com/protocolbuffers/protobuf-go;
  • 多平台镜像构建

    1. 由于阿里云镜像中心不支持存放多架构容器更改为使用腾讯容器镜像服务;
    2. 当前多架构容器仅支持使用 "docker buildx",暂不支持 "podman";
  • 添加依赖工具的下载

    make protoc
    make protoc-gen-go
    make protoc-gen-go-grpc
    make protoc-gen-grpc-gateway
    make protoc-gen-openapiv2
  • 仅版本号发生变更时才执行 sed

    1. 更改了 scripts/version.sh 中的 update 方法;
    2. 仅当先前与当前版本号不一致才更改 microservice.openapiv2.yaml 文件;
    3. 更改了 /tmp/microservice.openapiv2.yaml 生成临时文件地址;

Fixed

  • 在 "oidc authenticator" 的 logger 存在空指针错误

    异常代码位置

    github.com/grpc-kit/pkg@v0.3.0/cfg/security.go:76

    当设置的 "oidc issuer" 可访问,但未正常返回 "/.well-known/openid-configuration" 日志输出触发了空指针。

release-v0.3.0

10 Mar 08:25
780cc52
Compare
Choose a tag to compare

[0.3.0] - 2023-03-10

Added

  • 新增 "组织代码" 作为所有 proto 包名前缀

    1. 默认 "组织代码" 取值为 "grpc-kit"

    2. 根据规则自动生成内置变量:应用名称、服务包名、服务标题、服务代码

    APPNAME、PROTO_PACKAGE、SERVICE_TITLE、SERVICE_CODE
  • 对 microservice.proto 文件中的功能注解分离并声明式

    1. 分离 "google.api.http" 功能到文件 "microservice.gateway.yaml"

      文档地址:https://github.com/googleapis/googleapis/blob/master/google/api/service.proto

    2. 分离 "grpc.gateway.protoc_gen_openapiv2.options" 功能到文件 "microservice.openapiv2.yaml"

      文档地址:https://github.com/grpc-ecosystem/grpc-gateway/internal/descriptor/openapiconfig/openapiconfig.proto

  • 去掉 gogo 模块,升级 grpc-gateway v2 版本

    1. 移除了 https://github.com/gogo/protobuf 的依赖;
    2. 升级了 grpc-gateway 为 v2 版本;
  • 重新规范公知类 proto 的文件存放目录

    1. 更改了 https://github.com/grpc-kit/api 原先 proto 路径规范;
    proto/v1/example.proto
    proto/v1/tracing.proto

    更改为以下格式:

    known/status/v1/response.proto
    known/example/v1/example.proto
    known/config/v1/config.proto
    1. 更改了 proto 的包名称:
    grpc.kit.api.proto.v1

    更改为以下前缀:

    grpc_kit.api.known.
  • 更改库 "errors" 为 "errs" 防止对标准库重名

    1. 更改 "github.com/grpc-kit/pkg/errors" 为 "github.com/grpc-kit/pkg/errs";
    2. 升级 proto 使用 "google.golang.org/protobuf/proto" 版本
    3. 状态使用公知版本 "grpc_kit.api.known.status.Status" 结构体
  • 移除 pkg/api 中使用 gogo 类库

    1. 去除由 "protoc-gen-gogo" 生成的 "pb.go" 文件
    2. 统一使用新规范后的 "grpc-kit/api proto" 生成的 "pb.go" 文件
  • 使用 gitlab-ci runner 为 shell 添加默认变量

    1. 默认模版添加以下变量;
    # 默认全局变量
    variables:
      CGO_ENABLED: "0"
      GIT_SSL_NO_VERIFY: "true"
      #GO111MODULE: "on"
      #GOPROXY: "https://goproxy.cn"
      #GOSUMDB: "sum.golang.google.cn"
      #GOPRIVATE: ""
      #GOPATH: "/home/gitlab-runner/go"

Fixed

  • make lint 首次无法正常运行

    1. 首次代码初始化后 "api/" 目录下不存在 "*.pb.go" 代码,导致无法引用;
    2. 通过在执行 make lint 之前,做 "proto" 文件的序列化;

release-v0.2.4

27 Feb 02:24
Compare
Choose a tag to compare

[0.2.4] - 2023-02-27

Added

grpc-kit/cli 模块

  • 重新格式化几个文件
    handler/rpc_demo.go
    handler/rpc_internal.go
    modeler/independent_cfg.go
  • 添加 make docker-run 以容器化运行模式
  • 生成微服务模版新增 "README.md" 文件
  • 可一次性构建所支持的二进制文件
  • 自动生成 systemd 或 supervisor 的服务配置文件
  • 默认模版添加测试案例
    1. handler/microservice_test.go
    2. handler/rpc_demo_test.go
    3. handler/rpc_internal_test.go
    4. modeler/independent_cfg_test.go
  • 支持 gitlab-ci 的模版
    1. 文件地址:.gitlab/workflows/grpc-kit.yml
  • 更换 app-sample.yaml 为 app-min.yaml
  • 添加 make test 以进行应用单元测试
  • scripts/env 添加 APPNAME SERVICE_CODE 全局变量
    1. 在 version 中的 appname 格式统一更改为:
    # 应用名称
    APPNAME={{ .Global.ProductCode }}-{{ .Global.ShortName }}-{{ .Template.Service.APIVersion }}
    
    # 服务的代码,名称唯一且必填,格式:应用短名.接口版本.产品代码
    SERVICE_CODE={{ .Global.ShortName }}.{{ .Template.Service.APIVersion }}.{{ .Global.ProductCode }}

grpc-kit/pkg 模块

  • 对模块 "version" 更改为 "vars" 专用于变量定义
    1. 目录下新增 "VERSION" 表示当前软件包版本,为了兼容当前目录下创建 VERSION 文件记录版本号,而把原先 "version" 重新命名为 "vars",对原先引用会存在破坏性,需更改引用路径,代码包含以下地址:Makefile、cmd/server/main.go
  • 支持 gRPC Health Checking Protocol 健康检测
    1. 可使用工具 grpc-health-probe 进行健康检查。
    2. 这个区别于内部自定义 HealthCheck 方法,它可用于检查从 gateway 至 grpc 整条链路的健康状态,而此仅能探测 grpc 服务。
  • 对 golang-jwt 由 v3.2 升级至 v4 版本
  • 对 OIDC 支持 HS256 签名算法
    由于 OIDC 目前大部分仅支持 RS256 签名算法,如 微软OIDC服务 中的 "id_token_signing_alg_values_supported" 属性,但是内部系统一些场景需要额外支持 HS256 算法。
    这里如果 token 是 HS256 算法,则获取 token 中的 sub 属性,跟配置中的 security.authentication.http_users 用户密码作为密钥解密。
  • scripts 目录下 shell 脚本锁进
    原先存在使用 tab 或四空格、二空格锁进,现统一调整为二个空格。