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

go-zero微服务的使用

一、入门案例

  • 1、使用goland创建一个工程

  • 2、新建一个user.proto

    syntax = "proto3";package user;
    // 这个地方表示生成的go的包名叫user
    option go_package = "./user";message UserInfoRequest {int64 userId = 1;
    }message UserInfoResponse {int64 userId = 1;string username = 2;
    }message UserCreateRequest {string username = 1;string password = 2;
    }message UserCreateResponse {string message = 1;
    }// 定义两个方法
    service Users {rpc UserInfoById(UserInfoRequest) returns(UserInfoResponse);rpc CreateUser(UserCreateRequest) returns(UserCreateResponse);
    }// goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
    
  • 3、使用goctl执行生成对应的项目文件

    goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
    
  • 4、安装依赖包

  • 5、运行文件go run user.go,不出意外的话肯定会启动后挂的,查看etc/user.yaml文件里面用etcd的服务,但是本地没启动etcd

二、etcd的安装

  • 1、github下载地址
  • 2、如果是window电脑,直接下载后解压,运行可执行文件就可以
  • 3、可视界面的安装
  • 4、具体使用可以自己查看文档

三、测试启动的rpc端口

  • 1、需要下载一个最新版的apifox(老版的不支持),创建一个grpc的项目

    在这里插入图片描述

  • 2、导入你刚刚写的proto文件

在这里插入图片描述

  • 3、测试调用接口

在这里插入图片描述

  • 4、在internal/logic/userinfobyidlogic.go里面补充代码,重启服务继续测试

    func (l *UserInfoByIdLogic) UserInfoById(in *user.UserInfoRequest) (*user.UserInfoResponse, error) {// todo: add your logic here and delete this linereturn &user.UserInfoResponse{UserId:   in.UserId,Username: "水痕",}, nil
    }
    

四、rpc对接gorm数据库操作

  • 1、参考go-zero对数据库的操作,基本步骤都是一样的,这里就不继续重复的工作

  • 2、修改根据用户id查询用户数据方法

    func (l *UserInfoByIdLogic) UserInfoById(in *user.UserInfoRequest) (*user.UserInfoResponse, error) {// todo: add your logic here and delete this line//userEntity := &model.UserEntity{}//l.svcCtx.MySqlDb.Where("id = ?", in.UserId).First(&userEntity)userEntity, err := dao.Use(l.svcCtx.MySqlDb).UserEntity.WithContext(l.ctx).Where(dao.Use(l.svcCtx.MySqlDb).UserEntity.ID.Eq(in.UserId)).First()fmt.Println(userEntity, "获取到的数据")return &user.UserInfoResponse{UserId:   userEntity.ID,Username: userEntity.Username,}, err
    }
    
  • 3、继续测试下创建用户的方法

    func (l *CreateUserLogic) CreateUser(in *user.UserCreateRequest) (*user.UserCreateResponse, error) {// todo: add your logic here and delete this lineif err := dao.Use(l.svcCtx.MySqlDb).UserEntity.Create(&model.UserEntity{Username: in.Username,Password: in.Password,}); err != nil {return &user.UserCreateResponse{Message: "创建失败",}, nil}return &user.UserCreateResponse{Message: "创建成功",}, nil
    }
    

五、api对接rpc接口

  • 1、创建一个项目分别创建两个文件夹rpcapi

  • 2、rpc项目和上面介绍的一样的,这里就不继续重复介绍,执行转换脚本

    goctl rpc protoc user.proto --go_out=types --go-grpc_out=types --zrpc_out=.
    
  • 3、创建一个user.api文件

    type CreateRequest {Username string `json:"username"`Password string `json:"password"`
    }type CreateResponse {Message string `json:"message"`
    }type UserInfoRequest {Id int64 `path:"id"`
    }
    type UserInfoResponse {Id int64 `json:"id"`Username string `json:"username"`
    }// 定义要被方法的方法
    service users {@handler createpost /api/users (CreateRequest) returns (CreateResponse)@handler userInfoget /api/users/:id (UserInfoRequest) returns (UserInfoResponse)
    }
    
  • 4、在api/etc/users.yaml文件中添加rpc中配置

    Name: users
    Host: 0.0.0.0
    Port: 8888
    # 直接引入etcd的地址就可以,Key直接查看rpc/etc/user.yaml,并且要保持一致
    UserRpc:Etcd:Hosts:- 127.0.0.1:2379Key: user.rpc
    
  • 5、在api/internal/config/config.go中添加user.rpc的配置

    package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
    )type Config struct {rest.RestConfUserRpc zrpc.RpcClientConf
    }
    
  • 6、 api/internal/svc/servicecontext.go添加rpc的服务配置

    package svcimport ("github.com/zeromicro/go-zero/zrpc""zero_demo06_rpc_api/api/internal/config""zero_demo06_rpc_api/rpc/userclient"
    )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、在api/internal/logic里面写业务逻辑

    func (l *UserInfoLogic) UserInfo(req *types.UserInfoRequest) (resp *types.UserInfoResponse, err error) {// todo: add your logic here and delete this lineuserInfo, err := l.svcCtx.UserRpc.UserInfoById(l.ctx, &user.UserInfoRequest{UserId: req.Id})if err != nil {return &types.UserInfoResponse{}, err}return &types.UserInfoResponse{Id:       userInfo.UserId,Username: userInfo.Username,}, nil
    }
    
    func (l *CreateLogic) Create(req *types.CreateRequest) (resp *types.CreateResponse, err error) {// todo: add your logic here and delete this linecreateUser, err := l.svcCtx.UserRpc.CreateUser(l.ctx, &user.UserCreateRequest{Username: req.Username,Password: req.Password,})if err != nil {return nil, err}return &types.CreateResponse{Message: createUser.Message,}, nil
    }
    
  • 8、运行2个项目,前端直接访问api层接口

  • 9、本案例代码

相关文章:

go-zero微服务的使用

一、入门案例 1、使用goland创建一个工程 2、新建一个user.proto syntax "proto3";package user; // 这个地方表示生成的go的包名叫user option go_package "./user";message UserInfoRequest {int64 userId 1; }message UserInfoResponse {int64 user…...

Java排序算法之基数排序

基数排序(Radix Sort)是一种线性时间复杂度的排序算法,其时间复杂度为O(d(nk)),其中d是数字的位数,k是进制数。基数排序是一种非比较排序算法,它按照数位的大小来进行排序。它可以处理正整数、负整数和小数…...

Ubuntu20.0中安装Gradle

下载Gradle到temp文件夹 wget https://services.gradle.org/distributions/gradle-8.3-bin.zip -P /tmp 然后解压文件到/opt/gradle目录 sudo unzip -d /opt/gradle /tmp/gradle-8.3.zip 配置Gradle环境变量 接下来我们会创建一个gradle.sh文件来保存Gradle的环境变量 sudo…...

【Java并发编程六】多线程越界问题

ArrayList()越界错误 import java.util.ArrayList; public class myTest implements Runnable {static ArrayList<Integer> a new ArrayList<>(10);public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(new myTest());T…...

聊聊httpclient的disableConnectionState

序 本文主要研究一下httpclient的disableConnectionState disableConnectionState org/apache/http/impl/client/HttpClientBuilder.java /*** Disables connection state tracking.*/public final HttpClientBuilder disableConnectionState() {connectionStateDisabled t…...

Tomcat web.xml文件中的mime-mapping

在Tomcat安装目录的conf/web.xml文件中&#xff0c;定义了大量的<mime-mapping>元素&#xff0c;例如&#xff1a; 其中<extension>指定了文件的扩展名&#xff0c;<mime-type>指定了mime类型&#xff0c;放在<mime-mapping>元素中&#xff0c;就是将…...

【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲

在前端开发的舞台上&#xff0c;用户与页面的互动是一场精彩的表演。而 JQuery&#xff0c;作为 JavaScript 的一种封装库&#xff0c;为这场表演提供了更为便捷和优雅的事件绑定方式。其中&#xff0c;on 和 off 两位主角&#xff0c;正是这场奇妙舞曲中的核心演员。在这篇博客…...

模块化Common JS 和 ES Module

目录 历程 1.几个函数&#xff1a;全局变量的污染&#xff0c;模块间没有联系 2.对象&#xff1a;暴露成员&#xff0c;外部可修改 3.立即执行函数&#xff1a;闭包实现模块私有作用域 common JS module和Module 过程 模块依赖&#xff1a;深度优先遍历、父 -> 子 -…...

基于java web个人财务管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

soc估计:DESIGN AND DEVELOPMENT OF SoC ESTIMATION MODEL USING MACHINE LEARNING

这是一篇印度那边学生的毕业论文&#xff0c;唯一要记录的是里面提到了一个特征构造的思想&#xff0c;记录如下&#xff1a; 论文思想&#xff1a; 特征选用速度、电流、电压、温度、平均电压、平均电流、平均速度&#xff0c;模型用cnnlstmlrlr 平均特征计算方式&#xff1a;…...

2、LeetCode之两数相加

给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这两个数都不会以0开头。 输入&am…...

redis三种集群方式

redis有三种集群方式&#xff1a;主从复制&#xff0c;哨兵模式和集群。 1.主从复制 主从复制原理&#xff1a; 从服务器连接主服务器&#xff0c;发送SYNC命令&#xff1b; 主服务器接收到SYNC命名后&#xff0c;开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…...

Java --- JVM之垃圾回收相关算法

目录 一、垃圾标记算法 1.1、垃圾标记阶段&#xff1a;对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡&#xff1f; 三、查看GC Roots 3.1、使用MAT查看 四、使用JProfiler分析OOM 五、清除阶段算…...

CentOS 7.9 安装 nginx

系统版本 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)搜索nginx相关的软件包 yum search nginx显示已安装的与 “nginx” 相关的软件包 yum list | grep nginx列出可用的 Nginx 软件包 yum list nginx --showduplicates安装 Nginx yum install -y ng…...

Newman

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;如何安装Newman 1、下载并安装NodeJs 在官网下载NodeJs&#xff1a; Download | Node.js&#xff08;官网的…...

Transformer中WordPiece/BPE等不同编码方式详解以及优缺点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

Ubuntu20.04安装Beyond Compare 4.4.7

参考链接&#xff1a; 1.Ubuntu20.04 Beyond Compare 4.3.7 安装 2.Ubuntu20.04安装Beyond Compare 4.3.7...

制作含有音频、视频的网页

参考代码如下 <!DOCTYPE html> <html> <head><title>视频音乐网页</title> </head> <body><!-- 视频 --><video width"320" height"240" controls><source src"movie.mp4" type"…...

QPair的介绍及用法

QPair是一个模板类&#xff0c;它存储一对值&#xff08;key&#xff0c;value&#xff09;&#xff0c;可以是不同的数据类型。QPair的用法有以下几个方面&#xff1a; QPair的构造函数有以下几种形式&#xff1a; QPair()&#xff1a;默认构造函数&#xff0c;创建一个空的QP…...

掌握未来技术趋势,Python编程引领人工智能时代

掌握未来技术趋势&#xff0c;Python编程引领人工智能时代 摘要&#xff1a;Python作为一种高级编程语言&#xff0c;在人工智能领域中扮演着越来越重要的角色。本文将通过介绍Python编程的特点、应用场景及发展前景&#xff0c;展望Python未来的发展趋势&#xff0c;并结合代…...

UE Mobility

UE4传统光照模式最求极致性能&#xff1a;静态光源 静态物体&#xff1b;平衡画质与性能&#xff1a;固定光源 静态物体&#xff08;经典组合&#xff0c;如太阳&#xff09;&#xff1b;完全动态场景&#xff1a;可移动光源 Lumen&#xff1b;静态光源静态物体&#xff1a;…...

李白的思乡诗 / 山水诗 / 豪放诗有哪些?诗词在线app手工整理

"酒入豪肠&#xff0c;七分酿成了月光&#xff0c;余下的三分啸成剑气&#xff0c;绣口一吐就半个盛唐。" 李白的诗&#xff0c;是盛唐最耀眼的星&#xff0c;既有 "天生我材必有用" 的豪放&#xff0c;也有 "低头思故乡" 的柔情&#xff0c;更有…...

如何用Python脚本实现大麦网90%成功率的自动抢票:终极指南

如何用Python脚本实现大麦网90%成功率的自动抢票&#xff1a;终极指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 你是否曾经为了抢到心仪演唱会门票而守在电脑前疯狂刷新…...

鸿蒙健身计划页面构建:训练英雄区与今日训练模块详解

鸿蒙健身计划页面构建&#xff1a;训练英雄区与今日训练模块详解 前言 在 HarmonyOS 6.0 应用开发中&#xff0c;健身类页面的核心挑战在于如何展示训练进度、训练目标和实时数据。本文将以“健身计划”应用的主页面为例&#xff0c;深入解析如何在鸿蒙平台上构建健身管理类应用…...

你的GPU内存还好吗?MemTestCL深度诊断指南

你的GPU内存还好吗&#xff1f;MemTestCL深度诊断指南 【免费下载链接】memtestCL OpenCL memory tester for GPUs 项目地址: https://gitcode.com/gh_mirrors/me/memtestCL 你的显卡在运行大型游戏时会不会突然花屏&#xff1f;AI训练过程中是否经常遇到莫名其妙的崩溃…...

CleanMyWechat:一键解放你的PC微信存储空间

CleanMyWechat&#xff1a;一键解放你的PC微信存储空间 【免费下载链接】CleanMyWechat 自动删除 PC 端微信缓存数据&#xff0c;包括从所有聊天中自动下载的大量文件、视频、图片等数据内容&#xff0c;解放你的空间。 项目地址: https://gitcode.com/gh_mirrors/cl/CleanMy…...

GitHub星标超50k的开源AI工具,为何大厂仍每年豪掷千万采购商业套件?(20年AI基建老兵深度复盘)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;GitHub星标超50k的开源AI工具&#xff0c;为何大厂仍每年豪掷千万采购商业套件&#xff1f;&#xff08;20年AI基建老兵深度复盘&#xff09; 开源AI工具如LangChain、LlamaIndex、Ollama和Hugging Fac…...

Kubernetes事件驱动架构实践:构建响应式微服务系统

Kubernetes事件驱动架构实践&#xff1a;构建响应式微服务系统 一、事件驱动架构概述 事件驱动架构是一种基于事件发布/订阅模式的分布式系统设计方法。在Kubernetes中实现事件驱动架构可以实现松耦合、高可扩展的微服务系统。 1.1 事件驱动模式 模式说明适用场景发布/订阅…...

对比直接使用厂商API体验Taotoken在路由与容灾方面的优势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API体验Taotoken在路由与容灾方面的优势 在开发基于大模型的应用时&#xff0c;开发者通常会面临一个选择&#x…...

Win11蓝屏修复了?实测UHUB V5.15到V5.16版本升级,虚拟摄像头设置避坑指南

Win11蓝屏修复实测&#xff1a;UHUB V5.15到V5.16版本升级全攻略与虚拟摄像头深度优化最近在调试一套无人直播系统时&#xff0c;发现不少同行还在被Win11蓝屏问题困扰。作为从XCMS时代就开始使用这套工具的老用户&#xff0c;我完整经历了从音视频不同步到驱动框架彻底重构的技…...