基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 1/3
基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 2/3
基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 3/3
项目地址:https://github.com/janrs-io/Jgrpc
转载请注明来源:https://janrs.com/br6f
Jgrpc
本项目为基于 Go/Grpc/kubernetes/Istio
开发微服务的最佳实践提供参考。
并基于 Jenkins/Gitlab/Harbor
实现了CICD
。
并使用 grpc-gateway
作为网关代理。
本最佳实践分为三个部分:
- 创建一个
pingservice
的微服务 - 创建一个
pongservice
的微服务 - 基于
Jenkins/Gitlab/Harbor
创建CICD
部署流程并部署到k8s/istio
在这一部分中,我们将创建 pongservice
微服务。
前提
假设已经安装了以下工具:
protoc-gen-grpc-gateway
protoc-gen-openapiv2
protoc-gen-go
protoc-gen-go-grpc
buf
wire
下面是安装这些工具的教程地址:
protoc-gen-grpc-gateway
& protoc-gen-openapiv2
& protoc-gen-go
& protoc-gen-go-grpc
这四个工具的安装教程请查看:install protoc-gen* tools
wire
wire
工具的安装教程请查看:install wire tool
buf
buf
工具的安装教程请查看:install buf tool
项目结构
这部分最终的目录结构如下:
Jgrpc
├── devops
├── istio-manifests
├── kubernetes-manifests
└── src
└── pongservice
├── buf.gen.yaml
├── cmd
│ ├── main.go
│ └── server
│ ├── grpc.go
│ ├── http.go
│ ├── run.go
│ ├── wire.go
│ └── wire_gen.go
├── config
│ ├── config.go
│ └── config.yaml
├── genproto
│ └── v1
│ ├── gw
│ │ └── pongservice.pb.gw.go
│ ├── pongservice.pb.go
│ └── pongservice_grpc.pb.go
├── go.mod
├── go.sum
├── proto
│ ├── buf.lock
│ ├── buf.yaml
│ └── v1
│ ├── pongservice.proto
│ └── pongservice.yaml
└── service
├── client.go
└── server.go
14 directories, 20 files
开始
创建项目的整体目录结构如下:
Jgrpc
├── devops
├── istio-manifests
├── kubernetes-manifests
├── src
创建 pongservice 微服务
创建基本目录
在src
目录下创建名为pongservice
的微服务,目录结构如下:
pongservice
├── cmd
│ └── server
├── config
├── proto
│ └── v1
└── service
6 directories, 0 files
生成代码和文件
生成 buf.yaml
在 pongservice/proto 目录下执行以下命令:
buf mod init
此命令创建一个名为 buf.yaml
的文件,位于 ponservice/proto
目录中。
buf.yaml
的代码如下:
version: v1
breaking:
use:
- FILE
lint:
use:
- DEFAULT
在 version
和 breaking
之间添加如下依赖代码:
deps:
- buf.build/googleapis/googleapis
请查看添加此依赖代码的原因:https://github.com/grpc-ecosystem/grpc-gateway#3-external-configuration
添加依赖代码后完整的 buf.yaml
文件如下:
version: v1
deps:
- buf.build/googleapis/googleapis
breaking:
use:
- FILE
lint:
use:
- DEFAULT
然后在pongservice/proto
目录下执行如下命令:
buf mod update
执行命令后会生成一个buf.lock
文件,代码如下:
# Generated by buf. DO NOT EDIT.
version: v1
deps:
- remote: buf.build
owner: googleapis
repository: googleapis
commit: 463926e7ee924d46ad0a726e1cf4eacd
生成 pongservice.proto
在 pongservice/proto/v1
目录中使用以下代码创建一个名为 pongservice.proto
的原型文件:
syntax = "proto3";
package proto.v1;
option go_package = "github.com/janrs-io/Jgrpc/src/pongservice/genproto/v1";
service PongService {
rpc Pong(PongRequest) returns(PongResponse){}
}
message PongRequest {
string msg = 1 ;
}
message PongResponse {
string msg = 1;
}
生成 pongservice.yaml
在 pongservice/proto/v1
目录中使用以下代码创建一个名为 pongservice.yaml
的原型文件:
type: google.api.Service
config_version: 3
http:
rules:
- selector: proto.v1.PongService.Pong
get: /pong.v1.pong
生成 buf.gen.yaml
在 pongservice
目录中使用以下代码创建一个名为 buf.gen.yaml
的 yaml 文件:
version: v1
plugins:
- plugin: go
out: genproto/v1
opt:
- paths=source_relative
- plugin: go-grpc
out: genproto/v1
opt:
- paths=source_relative
- plugin: grpc-gateway
out: genproto/v1/gw
opt