当前位置: 首页 > news >正文

goZero微服务开发

一、go-zero微服务环境安装

  • 1、go-zero脚手架的安装

    go install github.com/zeromicro/go-zero/tools/goctl@latest
  • 2、etcd的安装下载地址根据自己电脑操作系统下载对应的版本,具体的使用自己查阅文章

二、创建一个user-rpc服务

  • 1、定义user.proto文件

    syntax = "proto3"; package user; option go_package="./user"; service User { rpc FindById(FindByIdReq) returns (FindByIdResp); } message FindByIdReq{ int64 id = 1; } message FindByIdResp { int64 id = 1; string username = 2; }
  • 2、使用命令生成对应的项目文件

    goctl rpc protoc ./user.proto --go_out=. --go-grpc_out=. --zrpc_out=./ goctl rpc protoc ./user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. --style goZero -m
  • 3、安装对应的依赖包

    go mod tidy
  • 4、运行user服务

    go run user.go
  • 5、在etcd中查看服务是否已经注册成功

    etcdctl get --prefix user.rpc
  • 6、模拟业务代码返回数据

    func(l*FindByIdLogic)FindById(in*user.FindByIdReq)(*user.FindByIdResp,error){return&user.FindByIdResp{Id:in.Id,Username:"哈哈哈",},nil}
  • 7、使用apifox可以直接调用rpc的服务,引入文件

三、在提供restful api接口端调用rpc服务返回数据给前端

  • 1、创建一个user-api的项目

  • 2、创建描述文件

    syntax = "v1" type GetUserReq { Id int64 `path:"id"` // 主键id } type GetUserResp { Id int64 `json:"id"` // 用户id Username string `json:"username"` // 用户名 } @server( prefix: api/v1/user group: user ) service user-api { @doc "根据用户id获取用户新" @handler GetUserByIdApi get /:id (GetUserReq) returns (GetUserResp) }
  • 3、使用脚本生成对应的项目文件

    goctl api go -api *.api -dir . --style=gozero
  • 4、在user-api的配置文件中引入rpc服务的配置

    Name:user-apiHost:0.0.0.0Port:8888UserRpc:Etcd:Hosts:-127.0.0.1:2379Key:user.rpc
  • 5、在apps/user-api/internal/config/config.go创建服务的配置

    typeConfigstruct{rest.RestConf UserRpc zrpc.RpcClientConf}
  • 6、在apps/user-api/internal/svc/servicecontext.go依赖注入rpc服务

    typeServiceContextstruct{Config config.Config UserRpc userclient.User}funcNewServiceContext(c config.Config)*ServiceContext{return&ServiceContext{Config:c,UserRpc:userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),}}
  • 7、模拟实现业务代码

    func(l*GetUserByIdApiLogic)GetUserByIdApi(req*types.GetUserReq)(resp*types.GetUserResp,errerror){// 模拟业务开发findByIdResp,err:=l.svcCtx.UserRpc.FindById(l.ctx,&user.FindByIdReq{Id:req.Id,})iferr!=nil{return&types.GetUserResp{},errors.New("查询失败")}return&types.GetUserResp{Id:findByIdResp.Id,Username:findByIdResp.Username,},nil}
  • 8、直接浏览模拟请求http://localhost:8888/api/v1/user/1

四、实际项目中可能是多个微服务的引入

  • 1、在go-zero项目的svc文件夹下创建一个rpcClient.go的文件

    typeRpcClientstruct{config config.Config// 服务1systemRpc zrpc.Client systemMutex sync.Mutex// 服务2usersMutex sync.Mutex usersRpc zrpc.Client}funcNewRpcClient(c config.Config)*RpcClient{return&RpcClient{config:c,}}func(r*RpcClient)GetSystemRpc()system.ConfigServiceClient{r.systemMutex.Lock()deferr.systemMutex.Unlock()ifr.systemRpc==nil{systemRpc,err:=zrpc.NewClient(r.config.SystemRpc)iferr!=nil{logx.Errorf("new system rpc failed: %+v",err)returnnil}r.systemRpc=systemRpc}returnsystem.NewConfigServiceClient(r.systemRpc.Conn())}func(r*RpcClient)GetUsersRpc()users.UsersClient{r.usersMutex.Lock()deferr.usersMutex.Unlock()ifr.usersRpc==nil{usersRpc,err:=zrpc.NewClient(r.config.UsersRpc)iferr!=nil{logx.Errorf("new user rpc failed: %+v",err)returnnil}r.usersRpc=usersRpc}returnusers.NewUsersClient(r.usersRpc.Conn())}
  • 2、在serviceContext.go文件中注入上面的rpcClient.go

    typeServiceContextstruct{Config config.Config RpcClient*RpcClient}funcNewServiceContext(c config.Config)*ServiceContext{rpcClient:=NewRpcClient(c)ifrpcClient==nil{logx.Errorf("new rpc client failed")panic(0)}return&ServiceContext{Config:c,RpcClient:rpcClient,}}
  • 3、正常使用user服务的方法

http://www.jsqmd.com/news/475708/

相关文章:

  • 题解:因子化简
  • 2026商家寄件价格对比:一站式平台vs传统模式,省成本秘诀?
  • 天梯赛练习(3月13日)
  • JavaOOP学习笔记13:IO流
  • 跨平台文件系统的Windows工具:WinBtrfs打破系统边界的存储解决方案
  • 第三十五天--小人物的坚持--网络编程
  • 如何用AI破解图像分层难题?LayerDivider实战指南
  • (397页PPT)麦肯锡高级咨询培训手册(附下载方式)
  • 智能小车最短路径规划算法研究:基于RRT与Dubins的混合A*方法与Dubins相结合方法的探讨
  • 351. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 3
  • Python基于flask-django校园个人闲置物品换购平台的设计与开发
  • Qwen-Max 8G 内存本地部署方案(轻量化可用版)
  • 如何实现精准号码定位?开源工具让位置查询变简单
  • 5分钟上手!数据可视化开源工具NPYViewer如何解决科研与工程中的3大核心痛点
  • 3分钟实现本地图片秒搜:ImageSearch从入门到精通
  • 3步释放显卡潜能:DLSS Swapper让游戏帧率提升30%的开源工具
  • 3.13 121~127(无123,124)翻译 单词
  • 数据库实体关系设计、SQL 连接查询及MyBatis 多表映射
  • 如何用wow_api提升魔兽世界宏命令效率?5个进阶技巧全解析
  • 2026电力交易:光伏+25%背后的隐忧,你的交易策略急需一张“气象底图”
  • 怎么给OpenClaw安装更多实用的‘skills‘?
  • 突破硬件限制:让旧Mac焕发新生的6大核心策略
  • Windows驱动存储终极解决方案:DriverStore Explorer效率革命
  • 猫抓cat-catch终极全攻略:零基础掌握网页资源高效捕获技术
  • 3大维度解析开源GPS追踪系统:从技术突破到商业落地
  • 3大技术突破让老游戏在Windows 11重获新生:DDrawCompat全解析
  • 5个核心功能解决内容创作者视频管理痛点
  • FanControl风扇控制进阶指南:从问题诊断到智能调节
  • SCI论文降AI实战:从80%+到安全线,这份指南帮你搞定国际期刊
  • 2023老旧Mac设备系统升级实战指南:从硬件限制到性能重生