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

go-zero微服务入门案例

一、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=./
    
  • 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"`              // 用户idUsername string `json:"username"` // 用户名
    }
    @server(prefix: api/v1/usergroup: user
    )
    service user-api {@doc "根据用户id获取用户新"@handler GetUserByIdApiget /:id (GetUserReq) returns (GetUserResp)
    }
    
  • 3、使用脚本生成对应的项目文件

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

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

    type Config struct {rest.RestConfUserRpc zrpc.RpcClientConf
    }
    
  • 6、在apps/user-api/internal/svc/servicecontext.go依赖注入rpc服务

    type ServiceContext struct {Config  config.ConfigUserRpc userclient.User
    }func NewServiceContext(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, err error) {// 模拟业务开发findByIdResp, err := l.svcCtx.UserRpc.FindById(l.ctx, &user.FindByIdReq{Id: req.Id,})if err != nil {return &types.GetUserResp{}, errors.New("查询失败")}return &types.GetUserResp{Id:       findByIdResp.Id,Username: findByIdResp.Username,}, nil
    }
    
  • 8、直接浏览模拟请求http://localhost:8888/api/v1/user/1

http://www.lryc.cn/news/2403849.html

相关文章:

  • Python控制台输出彩色字体指南
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
  • 开源之夏·西安电子科技大学站精彩回顾:OpenTiny开源技术下沉校园,点燃高校开发者技术热情
  • html、css(javaweb第一天)
  • 解决数据库重启问题
  • 前后端交互过程中—各类文件/图片的上传、下载、显示转换
  • SparkSQL 优化实操
  • 【vLLM 学习】Cpu Offload Lmcache
  • 数据库同步是什么意思?数据库架构有哪些?
  • 【数据结构】详解算法复杂度:时间复杂度和空间复杂度
  • Rest-Assured API 测试:基于 Java 和 TestNG 的接口自动化测试
  • 多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案
  • 【分销系统商城】
  • LangChainGo入门指南:Go语言实现与OpenAI/Qwen模型集成实战
  • 5.1 HarmonyOS NEXT系统级性能调优:内核调度、I/O优化与多线程管理实战
  • react public/index.html文件使用env里面的变量
  • chili3d 笔记17 c++ 编译hlr 带隐藏线工程图
  • 创建一个纯直线组成的字体库
  • 接口不是json的内容能用Jsonpath获取吗,如果不能,我们选用什么方法处理呢?
  • 使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
  • Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)
  • Linux进程(中)
  • 【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理
  • npm error Cannot read properties of null (reading ‘matches‘)
  • MVC分层架构模式深入剖析
  • 【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)
  • 新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
  • LeetCode 239. 滑动窗口最大值(单调队列)
  • 华为云Flexus+DeepSeek征文|DeepSeek-V3/R1开通指南及使用心得
  • 鸿蒙图片缓存(一)