go-zero微服务的使用
一、入门案例
-
1、使用
goland创建一个工程 -
2、新建一个
user.protosyntax = "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、创建一个项目分别创建两个文件夹
rpc和api -
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文件中,定义了大量的<mime-mapping>元素,例如: 其中<extension>指定了文件的扩展名,<mime-type>指定了mime类型,放在<mime-mapping>元素中,就是将…...
【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲
在前端开发的舞台上,用户与页面的互动是一场精彩的表演。而 JQuery,作为 JavaScript 的一种封装库,为这场表演提供了更为便捷和优雅的事件绑定方式。其中,on 和 off 两位主角,正是这场奇妙舞曲中的核心演员。在这篇博客…...
模块化Common JS 和 ES Module
目录 历程 1.几个函数:全局变量的污染,模块间没有联系 2.对象:暴露成员,外部可修改 3.立即执行函数:闭包实现模块私有作用域 common JS module和Module 过程 模块依赖:深度优先遍历、父 -> 子 -…...
基于java web个人财务管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
soc估计:DESIGN AND DEVELOPMENT OF SoC ESTIMATION MODEL USING MACHINE LEARNING
这是一篇印度那边学生的毕业论文,唯一要记录的是里面提到了一个特征构造的思想,记录如下: 论文思想: 特征选用速度、电流、电压、温度、平均电压、平均电流、平均速度,模型用cnnlstmlrlr 平均特征计算方式:…...
2、LeetCode之两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。 输入&am…...
redis三种集群方式
redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…...
Java --- JVM之垃圾回收相关算法
目录 一、垃圾标记算法 1.1、垃圾标记阶段:对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡? 三、查看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的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 一)如何安装Newman 1、下载并安装NodeJs 在官网下载NodeJs: Download | Node.js(官网的…...
Transformer中WordPiece/BPE等不同编码方式详解以及优缺点
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
Ubuntu20.04安装Beyond Compare 4.4.7
参考链接: 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是一个模板类,它存储一对值(key,value),可以是不同的数据类型。QPair的用法有以下几个方面: QPair的构造函数有以下几种形式: QPair():默认构造函数,创建一个空的QP…...
掌握未来技术趋势,Python编程引领人工智能时代
掌握未来技术趋势,Python编程引领人工智能时代 摘要:Python作为一种高级编程语言,在人工智能领域中扮演着越来越重要的角色。本文将通过介绍Python编程的特点、应用场景及发展前景,展望Python未来的发展趋势,并结合代…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
