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、本案例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/200790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画

0. 功能需求 在 SwiftUI 丰富多彩的动画世界中,我们有时希望可以随意开始和停止永久循环(repeatForever)的动画,不过这时往往会产生错误的动画“叠加”效果。 从上图可以看到:虽然我们希望密码输入框背景只在用户输入密码时才发生闪烁,但顶部的密码输入框随着不断输入其…

Speech | openSMILE语音特征提取工具

官方地址:openSMILE 3.0 - audEERING 使用指导:openSMILE — openSMILE Documentation (audeering.github.io) openSMILE 简介 openSMILE是一款以命令行形式运行的工具,通过配置config文件来提取音频特征。主要应用于语音识别、情感计算、音…

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…

中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)

中间件安全:Apache Tomcat 弱口令. Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登录后台,部署 war 包…

使用Arrays.asList与不使用的区别

在写算法的时候,遇到了有的题解使用的是Arrays.asList,也有的是直接新建一个List集合将元素加进去的。 看了一下算法的时间,两者居然相差了9秒。 算法原地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长…

手机运行内存大揭秘:探索你手机的超级大脑!

你有没有想过,为什么有些手机看起来外形相似,但运行速度却有如天壤之别?答案就在手机的运行内存里!今天,我们就一起揭开手机运行内存的神秘面纱,探索你手机的超级大脑! 01 运行内存究竟是干什么…

vue3-响应式函数

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-响应式函数 目录 ref 响应式函数 引言: ref 函数 reactive 函数 Reactive 与…

【软件工程师从0到1】- 继承 (知识汇总)

前言 介绍:大家好啊,我是hitzaki辰。 社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。 自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名:hi…

ES 查询语法-详解

文章目录 1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.总结 1.3.精准查询1.3.1.term查询1.3.2.总结 1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff…

uniapp开发小程序,包过大解决方案

1、首先和大家说一下 微信小程序 主包限制不能超过2M 分包一共不能超过8M 然后具体解决优化步骤如下, 将主包进行分包 在pages.json 下subPackages里面进行配置分包 分包配置完 配置过的文件都需要进行修改对应的路径 2 、 在运行的时候 一定要勾选 压缩代码 有…

vatee万腾科技先锋之选:vatee创新力驱动着未来发展

在科技潮流的浩荡前行中,Vatee万腾崭新的科技先锋之选正以强大的创新力引领着未来的发展。Vatee万腾凭借其前瞻性的技术理念和卓越的创新实践,成为业界的引领者,为整个科技行业树立了标杆。 Vatee万腾不仅仅是一家科技公司,更是一…

Redis篇---第十三篇

系列文章目录 文章目录 系列文章目录前言一、redis的过期策略以及内存淘汰机制二、Redis 为什么是单线程的三、Redis 常见性能问题和解决方案?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

URAT串口通信协议

UART是异步串行全双工总线,面向设备和设备之间的连接 配置相关内容 1、串口为串行通讯方式,代表一个时钟周期,只可以收发一位数据 2、115200代表什么,以及115200单位 单位:bps(比特率、二进制/秒) 115200代表&#…

贪吃蛇游戏

一、创建项目,创建文件夹images,放入图片,创建两个包com.snake.controller和com.snake.view。 二、主要游戏界面 package com.snake.view;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame…

x shell 用作串口调试助手

x shell 用作串口调试助手 Xshell 介绍 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Wi…

140.【鸿蒙OS开发-01】

鸿蒙开发 (一)、初识鸿蒙1.初识鸿蒙(1).移动通讯技术的发展(2).完整的鸿蒙开发 (二)、鸿蒙系统介绍1.鸿蒙系统的官方定义(1).鸿蒙操作系统概述(2).鸿蒙的生态 2.鸿蒙系统的特点3.鸿蒙和安卓的对比4.鸿蒙开发的发展前景 (三)、鸿蒙开发准备工作1.鸿蒙OS的完整开发流程2.注册并实…

深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…

4.3、Linux进程(2)

个人主页:Lei宝啊 愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢? 为什么会出来三个打印呢? 就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct,还有代码和数据,他们…

Linux免密登录——A登录B密钥设置(SSH SCP)

密钥登录 密钥登录比帐号密码方式更安全、更方便,并提供了更多的自动化和批处理选项。 安全性:使用非对称加密算法,公钥存在服务器,私钥存在本地计算机,私钥不在网络传输,降低被黑客截获风险。强密码&#…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长,作为 AI 背后技术的核心之一 GPU(图形处理器)的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要,特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多,主要就是 NVIDIA、AM…