关于go-zero:都在还说链路跟踪那么-gozero-的链路跟踪是咋样的

工作中,天然少不了开发去排查问题,那如果链路比拟长,客户端一个申请打进来,可能外部微服务进行了多个服务的交互,那么如果其中有一个环节呈现了问题,咱们如何定位是哪一个申请或者是说是哪一条调用链呢? 可能开发的时候或多或少会退出本人的一些示意,例如申请外面会退出 requuid,链路中波及的服务都会将这个 requuid 传下去,直到整个调用链完结 当然比拟 low 的一种形式是,在微服务交互的申请和相应中加上 requuid 字段,这个应该也是从单体服务适度到微服务开发时特地容易呈现的状况 实际上做链路跟踪,简略的形式就是在各种申请的上下文加上 traceid 就能够了,明天咱们来看看 go-zero 中的链路跟踪是如何利用的 别离从如下几个局部来看看 go-zero 中利用链路跟踪 Http 服务端局部,客户端局部<!----> Rpc 服务端局部,客户端局部当然对于日志组件,数据库组件等相干组件,利用到链路跟踪的中央,做法大体一致,咱们一起看看 http 和 rpc 服务中利用的形式,其余的组件利用咱们也就能够简略的将常识迁徙过来即可上手 Http 服务端局部对于 ge-zero http ,咱们能够一起来看看 服务端局部是如何利用的 简略来说,在咱们启动 http 服务的时候,就曾经将链路追踪的性能给关上了,go-zero 是通过 http handle 的形式来解决的 当然,同理,咱们也能够本人在 go-zero 中加一个 middleware 也是能够达到这样的成果 go-zero 中实际上在咱们服务 start 的时候,外部就开始了各种初始化,大体流程是这样的 (s Server) Start() -> (ng engine) start(router httpx.Router) error调用外部服务启动,注册路由 (ng engine) bindRoutes(router httpx.Router) -> (ng engine) bindFeaturedRoutes -> (ng *engine) bindRoute进行路由的绑定,并默认增加中间件 middleware TracingHandler ...

August 27, 2023 · 1 min · jiezi

关于go-zero:微服务框架-gozero-logx-日志组件剖析

addTenant api 和 rpc 的实现上一篇咱们说到咱们还剩下 addTenant 性能还未实现,不晓得有没有兄弟感兴趣去试验一波的,本篇文章进行简要补充 依据上一篇文章剖析,其实咱们只须要执行如下几步即可: 编写 tenant.api,提供内部 addTenant 的 http 接口编写 tenant.api提供一个 POST http 的接口 / api /tenant/addtenant type ( AddTenantReq { Name string `json:"name"` Addr string `json:"addr"` } AddTenantRsp { Id string `json:"id"` })service tenant { @handler addTenant post /api/tenant/addtenant(AddTenantReq) returns (AddTenantRsp)goctl 生成 api 代码goctl api go -api tenant.api -dir .批改 api 的配置和逻辑层,让 api 层去调用之前写好的 rpc 接口 即可对于配置能够模拟上一篇文章 order.api 的配置进行批改,另外只须要调整 addTenant 的 logic 层即可 func (l *AddTenantLogic) AddTenant(req *types.AddTenantReq) (*types.AddTenantRsp, error) { // todo: add your logic here and delete this line rsp,err :=l.svcCtx.TenantRpc.AddTenant(l.ctx, &tenant.AddTenantReq{ Name: req.Name, Addr: req.Addr, }) if err !=nil{ return nil,err } return &types.AddTenantRsp{Id: rsp.Id},nil}具体的代码案例能够拜访地址:https://github.com/qingconglaixueit/my_test_Demo ...

August 26, 2023 · 2 min · jiezi

关于go-zero:微服务框架-gozero-快速实战

对于咱们疾速理解和将 go-zero 应用起来,咱们须要具备如下能力: 根本的环境装置和看文档的能力<!----> Golang 的基本知识<!----> Protobuf 的基本知识<!----> web,rpc 的基本知识<!----> 根本的 mysql 常识其实这些能力,很根底,不须要如许深刻,只须要你有所理解,这样至多对于咱们去看 go-zero 波及的知识点就不会那么费劲儿 本文分为如下 4 个局部来别离介绍和疾速实战微服务框架 go-zero 微服务框架 go-zero 的根本介绍<!----> go-zero 的环境搭建<!----> go-zero 的疾速实战 rpc , api ,model 局部微服务框架 go-zero 的根本介绍go-zero 是一个集成了各种工程实际的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,禁受了充沛的实战测验。 go-zero 中的 api,rpc,数据库等波及的代码,都能够给咱们一键生成,无需消耗咱们什么精力 只须要在生成的代码中填入本人的配置以及逻辑即可,咱们应用 go-zero 能够轻松做到如下成果: 轻松取得撑持千万日活服务的稳定性<!----> 内建级联超时管制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额定代码<!----> 微服务治理中间件可无缝集成到其它现有框架应用<!----> 极简的 API 形容,一键生成各端代码<!----> 主动校验客户端申请参数合法性<!----> 大量微服务治理和并发工具包对于咱们开发微服务堪称是极大的进步了开发效率和品质,缩小了开发者的心智累赘 go-zero 官网提供了一张架构图 从架构图咱们晓得,上述的各种成果离不开架构图中的每一个模块,本文先展现如下性能的利用: HTTP 协定<!----> gRPC 协定<!----> 日志记录<!----> 链路追踪<!----> 数据库<!----> ETCD 服务发现<!----> ...看到 go-zero 有这么多益处,架构图也十分清晰,是不是有点急不可待了呢 ...

August 25, 2023 · 4 min · jiezi

关于go-zero:gozero-组件分析之-Breaker

概述熔断机制是一种微服务爱护机制。当某个微服务呈现故障或者异样时,通过熔断机制,能够避免故障或异样扩散到整个微服务零碎中,从而防止整个微服务零碎被拖垮,熔断机制的大抵流程是(以下流程基于 go-zero 熔断器为背景): 指标采集:熔断器通过一直监测服务的申请和响应来收集指标,这些指标蕴含但不限于响应工夫,错误率,超时率等。阈值设定:熔断器通过指标来计算出阈值,当指标超过阈值时,熔断器会关上。熔断状态管制:个别熔断器都有3个状态,熔断开启,熔断复原,熔断半开:3.1 熔断开启:当服务的指标超过设定的阈值时,熔断机制将服务切换到熔断状态。在熔断状态下,服务将进行接管新的申请,并立刻返回谬误响应,而不会进行理论的业务逻辑解决。3.2 熔断复原:一旦服务进入熔断状态,熔断机制会设定一个复原工夫窗口,在该窗口内不再接管新的申请。在这段时间内,零碎能够尝试修复服务或期待服务主动复原。3.3 半开状态:在熔断复原工夫窗口完结后,熔断机制将服务切换到半开状态。在半开状态下,零碎会尝试发送一部分申请给服务,以检测其是否曾经恢复正常。如果这些申请胜利响应,那么服务将被认为是恢复正常,并持续接管新的申请。否则,服务将从新进入熔断状态。但在 go-zero 中并非齐全如此,go-zero 中只有熔断敞开,熔断触发开启状态,为什么是熔断触发开启,在 go-zero 中,熔断指标达到设定阈值后,并不是间接拦挡所有申请,而是有肯定的概率拦挡申请,这并不是说他就没有熔断复原和熔断半开状态,只是 go-zero 中熔断器将这 2 个状态奇妙的用滑动窗口来实现了。go-zero 熔断器时序图 源码解析在 go-zero 中,Breaker 是一个接口,其接口定义如下: Breaker interface { Name() string Allow() (Promise, error) Do(req func () error) error DoWithAcceptable(req func () error, acceptable Acceptable) error DoWithFallback(req func () error, fallback func (err error) error) error DoWithFallbackAcceptable(req func () error, fallback func (err error) error, acceptable Acceptable) error}Breaker 接口定义了 6 个办法,提供了 2 中对熔断器管制执行的机制: Allow 办法抛出了一个 Promise 句柄,容许用户自行对熔断指标进行管制,采集指标能够依据用户需要抉择申请时延、错误码等,且熔断触发后须要执行的逻辑也有用户自行管制。如 go-zero中 rest 中熔断中间件的用法: ...

May 28, 2023 · 2 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务九http统一返回和集成日志服务

0、索引go-zero docker-compose 搭建课件服务(九):http对立返回和集成日志服务 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、http对立返回个别返回中会有code,message,data。当申请胜利的时候code返回0或者200,message返回success,data为要获取的数据;当申请失败的时候code返回自定义的错误码,message返回展现给前端的错误信息,data为空。 咱们将封装一个谬误返回的函数,利用到api handler的返回 在user服务中创立了common文件夹,外面存一些专用的办法,创立response/response.go package responseimport ( "go-zero-courseware/user/common/xerr" "net/http" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/rest/httpx" "google.golang.org/grpc/status")type Response struct { Code uint32 `json:"code"` Message string `json:"message"` Data interface{} `json:"data"`}//http返回func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) { if err == nil { //胜利返回 r := &Response{ Code: 0, Message: "success", Data: resp, } httpx.WriteJson(w, http.StatusOK, r) } else { //谬误返回 errcode := uint32(500) errmsg := "服务器谬误" causeErr := errors.Cause(err) // err类型 if e, ok := causeErr.(*xerr.CodeError); ok { //自定义谬误类型 //自定义CodeError errcode = e.GetErrCode() errmsg = e.GetErrMsg() } else { if gstatus, ok := status.FromError(causeErr); ok { // grpc err谬误 grpcCode := uint32(gstatus.Code()) errcode = grpcCode errmsg = gstatus.Message() } } logx.WithContext(r.Context()).Errorf("【API-ERR】 : %+v ", err) httpx.WriteJson(w, http.StatusBadRequest, &Response{ Code: errcode, Message: errmsg, Data: nil, }) }}创立xerr/errors.go文件,定义CodeError构造体 ...

September 9, 2022 · 6 min · jiezi

关于go-zero:gozero源码学习熔断器

1. 熔断器作用熔断器是对于一段时间内申请失败数超过设定的阈值的客户端,之后不再申请后端服务,间接返回出错信息,以防申请工作沉积。过期之后的申请失常拜访后端服务。 2. grpc拦截器grpc拦截器分为两类: 一元拦截器UnaryInterceptor, 能够拦挡一元rpc申请流式拦截器StreamInterceptor, 能够拦挡服务端流式rpc、客户端流式、双向散失rpc申请罕用来做日志,认证,metric 等等 3. go-zero 熔断器的应用go-zero 应用grpc的一元和流式,总共有6个拦截器。 func (c *client) buildDialOptions(opts ...ClientOption) []grpc.DialOption { options = append(options, WithUnaryClientInterceptors( clientinterceptors.UnaryTracingInterceptor, clientinterceptors.DurationInterceptor, clientinterceptors.PrometheusInterceptor, clientinterceptors.BreakerInterceptor, //熔断器应用 clientinterceptors.TimeoutInterceptor(cliOpts.Timeout), ), WithStreamClientInterceptors( clientinterceptors.StreamTracingInterceptor, ), )}func (c *client) dial(server string, opts ...ClientOption) error { options := c.buildDialOptions(opts...) //结构options timeCtx, cancel := context.WithTimeout(context.Background(), dialTimeout) defer cancel() conn, err := grpc.DialContext(timeCtx, server, options...)//调用入口 if err != nil { service := server if errors.Is(err, context.DeadlineExceeded) { pos := strings.LastIndexByte(server, separator) // len(server) - 1 is the index of last char if 0 < pos && pos < len(server)-1 { service = server[pos+1:] } } return fmt.Errorf("rpc dial: %s, error: %s, make sure rpc service %q is already started", server, err.Error(), service) } c.conn = conn return nil}// WithStreamClientInterceptors uses given client stream interceptors.func WithStreamClientInterceptors(interceptors ...grpc.StreamClientInterceptor) grpc.DialOption { return grpc.WithChainStreamInterceptor(interceptors...)}// WithUnaryClientInterceptors uses given client unary interceptors.func WithUnaryClientInterceptors(interceptors ...grpc.UnaryClientInterceptor) grpc.DialOption { return grpc.WithChainUnaryInterceptor(interceptors...)}其余拦截器本篇暂不介绍,先重点看一下熔断器拦截器BreakerInterceptor ...

August 31, 2022 · 2 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务六完善jwt鉴权和返回结构

0、索引go-zero docker-compose 搭建课件服务(一):编写服务api和proto go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 go-zero docker-compose 搭建课件服务(五):欠缺user服务 go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、用户服务登录接口生成jwt tokenuser/api/etc/user.yaml中减少用于生成jwt的secret和过期工夫 ...Auth: AccessSecret: 38f9c7af24ff11edb92900163e30ef81 AccessExpire: 86400user/api/internal/config/config.go减少配置参数 ...Auth struct { AccessSecret string AccessExpire int64}在之前编写的登录逻辑中减少获取token的办法,并批改登录逻辑 ...func (l *UserLoginLogic) UserLogin(req *types.LoginRequest) (resp *types.LoginResponse, err error) { login, err := l.svcCtx.UserRpc.Login(l.ctx, &userclient.LoginRequest{ LoginName: req.LoginName, Password: req.Password, }) if err != nil { return nil, err } now := time.Now().Unix() login.Token, err = l.getJwtToken(l.svcCtx.Config.Auth.AccessSecret, now, l.svcCtx.Config.Auth.AccessExpire, int64(login.Id)) if err != nil { return nil, status.Error(5000, err.Error()) } return &types.LoginResponse{ Id: login.Id, Token: login.Token, }, nil}func (l *UserLoginLogic) getJwtToken(secretKey string, iat, seconds, userId int64) (string, error) { claims := make(jwt.MapClaims) claims["exp"] = iat + seconds claims["iat"] = iat claims["userId"] = userId token := jwt.New(jwt.SigningMethodHS256) token.Claims = claims return token.SignedString([]byte(secretKey))}2、用户明码加密user/rpc/internal/logic/registerlogic.go批改代码加密明码 ...

August 29, 2022 · 3 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务五完善user服务

0、索引go-zero docker-compose 搭建课件服务(一):编写服务api和proto go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 go-zero docker-compose 搭建课件服务(五):欠缺user服务 go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、生成model到我的项目根目录下创立model目录,并新建user.sql mkdir user/rpc/modeltouch user/rpc/model/user.sqlCREATE TABLE `user`( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `login_name` varchar(255) NOT NULL DEFAULT '' COMMENT '登录名', `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户姓名', `sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '用户性别', `password` varchar(255) NOT NULL DEFAULT '' COMMENT '用户明码', `is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0-未删除 1-已删除', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `udx_login_name` (`login_name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;到model目录下生成model ...

August 29, 2022 · 5 min · jiezi

关于go-zero:gozero-dockercompose搭建课件服务四生成Dockerfile

0、索引go-zero docker-compose 搭建课件服务(一):编写服务api和proto go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 go-zero docker-compose 搭建课件服务(五):欠缺user服务 go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、目前的目录文件构造目前只是创立好了courseware服务,这一章节我咱们先在docker-compose跑通课件服务 .├── courseware│ ├── api│ │ ├── courseware.api│ │ ├── courseware.go│ │ ├── etc│ │ │ └── courseware.yaml│ │ └── internal│ │ ├── config│ │ │ └── config.go│ │ ├── handler│ │ │ ├── coursewareaddhandler.go│ │ │ ├── coursewaredeletehandler.go│ │ │ ├── coursewaregethandler.go│ │ │ ├── coursewareupdatehandler.go│ │ │ └── routes.go│ │ ├── logic│ │ │ ├── coursewareaddlogic.go│ │ │ ├── coursewaredeletelogic.go│ │ │ ├── coursewaregetlogic.go│ │ │ └── coursewareupdatelogic.go│ │ ├── svc│ │ │ └── servicecontext.go│ │ └── types│ │ └── types.go│ ├── go.mod│ ├── go.sum│ └── rpc│ ├── courseware│ │ ├── courseware.pb.go│ │ └── courseware_grpc.pb.go│ ├── courseware.go│ ├── courseware.proto│ ├── coursewareclient│ │ └── courseware.go│ ├── etc│ │ └── courseware.yaml│ ├── internal│ │ ├── config│ │ │ └── config.go│ │ ├── logic│ │ │ ├── addlogic.go│ │ │ ├── deletelogic.go│ │ │ ├── getlogic.go│ │ │ └── updatelogic.go│ │ ├── server│ │ │ └── coursewareserver.go│ │ └── svc│ │ └── servicecontext.go│ └── model│ ├── courseware.sql│ ├── coursewaremodel.go│ ├── coursewaremodel_gen.go│ └── vars.go└── user ├── api │ └── user.api └── rpc └── user.proto2、我的项目根目录下创立依赖的服务创立etcd Dockerfile ...

August 29, 2022 · 3 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务三编写courseware-api服务

0、索引go-zero docker-compose 搭建课件服务(一):编写服务api和proto go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 go-zero docker-compose 搭建课件服务(五):欠缺user服务 go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、生成api相干文件# 到之前创立的courseware/api目录下goctl api go -api courseware.api -dir . -style gozero2、courseware/api/etc/user.yaml下减少rpc配置Name: coursewareHost: 0.0.0.0Port: 8400CoursewareRpc: Etcd: Hosts: - etcd:2379 Key: courseware.rpc3、courseware/api/internal/config/config.go下减少CoursewareRpcpackage configimport ( "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/zrpc")type Config struct { rest.RestConf CoursewareRpc zrpc.RpcClientConf}3、courseware/api/internal/svc/servicecontext.go下减少CoursewareRpc配置package svcimport ( "github.com/zeromicro/go-zero/zrpc" "go-zero-courseware/courseware/api/internal/config" "go-zero-courseware/courseware/rpc/coursewareclient")type ServiceContext struct { Config config.Config CoursewareRpc coursewareclient.Courseware}func NewServiceContext(c config.Config) *ServiceContext { return &ServiceContext{ Config: c, CoursewareRpc: coursewareclient.NewCourseware(zrpc.MustNewClient(c.CoursewareRpc)), }}4、补充增删改查相干接口逻辑courseware/api/internal/logic/coursewareaddlogic.go ...

August 29, 2022 · 2 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务二编写courseware-rpc服务

转载自:go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 1、创立modelmysql中创立数据库 create database go_zero_courseware default character set utf8mb4 collate utf8mb4_unicode_ci;创立sql文件 touch courseware/rpc/model/courseware.sqlCREATE TABLE `courseware`( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `code` varchar(255) NOT NULL DEFAULT '' COMMENT '编号', `name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户姓名', `type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '课件类型 1-h5 2-scorm 3-多媒体多章节', `is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0-未删除 1-已删除', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_mobile_unique` (`mobile`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;生成model ...

August 22, 2022 · 3 min · jiezi

关于go-zero:gozero-dockercompose-搭建课件服务一编写服务api和proto

转载自:# go-zero docker-compose 搭建课件服务(一):编写服务api和proto 1、创立我的项目目录mkdir go-zero-coursewarecd go-zero-courseware2、装置goctl# 装置GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest# mac放到/usr/local/bin/上面ln -s ~/go/bin/goctl /usr/local/bin/goctl# 校验goctl -vgoctl version 1.4.0 darwin/amd64 # 看到版本阐明装置胜利3、创立服务创立服务目录 mkdir -p user/apimkdir -p user/rpcmkdir -p courseware/apimkdir -p courseware/rpc创立user.api、courseware.api、user.proto、courseware.proto touch user/api/user.apitouch user/rpc/user.prototouch courseware/api/courseware.apitouch courseware/rpc/courseware.proto4、编写user.api、user.prototype ( // 登录 LoginRequest { LoginName string `json:"loginName"` Password string `json:"password"` } LoginResponse { Id uint64 `json:"id"` Token string `json:"token"` } // 注册 RegisterRequest { LoginName string `json:"loginName"` Username string `json:"username"` Password string `json:"password"` Sex uint64 `json:"sex"` } RegisterResponse { } // 用户信息 UserInfoRequest { Id uint64 `json:"id"` } UserInfoResponse { Id uint64 `json:"id"` Username string `json:"username"` LoginName string `json:"loginName"` Sex uint64 `json:"sex"` })service user { @handler userLogin post /api/user/login (LoginRequest) returns (LoginResponse) @handler userRegister post /api/user/register (RegisterRequest) returns (RegisterResponse) @handler userInfo post /api/user/userInfo (UserInfoRequest) returns (UserInfoResponse)}syntax = "proto3";package user;option go_package = "./user";// 登录message LoginRequest { string LoginName = 1; string Password = 2;}message LoginResponse { uint64 Id = 1; string Token = 2;}// 注册message RegisterRequest { string LoginName = 1; string Username = 2; string Password = 3; uint64 Sex = 4;}message RegisterResponse {}// 用户信息message UserInfoRequest { uint64 Id = 1;}message UserInfoResponse { uint64 Id = 1; string Username = 2; string LoginName = 3; uint64 Sex = 4;}service User { rpc Login(LoginRequest) returns(LoginResponse); rpc Register(RegisterRequest) returns(RegisterResponse); rpc UserInfo(UserInfoRequest) returns(UserInfoResponse);}5、编写courseware.api、courseware.prototype ( // 新增 AddRequest { Code string `json:"code"` Name string `json:"name"` Type uint64 `json:"type"` } AddResponse { } // 更新 UpdateRequest { Id uint64 `json:"id"` Code string `json:"code"` Name string `json:"name"` Type uint64 `json:"type"` } UpdateResponse { } // 查看 GetRequest { Id uint64 `json:"id"` } GetResponse { Id uint64 `json:"id"` Code string `json:"code"` Name string `json:"name"` Type uint64 `json:"type"` } // 删除 DeleteRequest { Id uint64 `json:"id"` } DeleteResponse { })service courseware { @handler coursewareAdd post /api/courseware/add (AddRequest) returns (AddResponse) @handler coursewareUpdate post /api/courseware/update (UpdateRequest) returns (UpdateResponse) @handler coursewareGet post /api/courseware/get (GetRequest) returns (GetResponse) @handler coursewareDelete post /api/courseware/delete (DeleteRequest) returns (DeleteResponse)}syntax = "proto3";package user;option go_package = "./courseware";// 新增message AddRequest { string Code = 1; string Name = 2; uint64 Type = 3;}message AddResponse {}// 更新message UpdateRequest { uint64 Id = 1; string Code = 2; string Name = 3; uint64 Type = 4;}message UpdateResponse {}// 查看message GetRequest { uint64 Id = 1;}message GetResponse { uint64 Id = 1; string Code = 2; string Name = 3; uint64 Type = 4;}// 删除message DeleteRequest { uint64 Id = 1;}message DeleteResponse {}service Courseware { rpc Add(AddRequest) returns(AddResponse); rpc Update(UpdateRequest) returns(UpdateResponse); rpc Get(GetRequest) returns(GetResponse); rpc Delete(DeleteRequest) returns(DeleteResponse);}

August 22, 2022 · 2 min · jiezi