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 line
    
    	return &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 line
    	if 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 create
        post /api/users (CreateRequest) returns (CreateResponse)
    
        @handler userInfo
        get /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:2379
        Key: user.rpc
    
  • 5、在api/internal/config/config.go中添加user.rpc的配置

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

    package svc
    
    import (
    	"github.com/zeromicro/go-zero/zrpc"
    	"zero_demo06_rpc_api/api/internal/config"
    	"zero_demo06_rpc_api/rpc/userclient"
    )
    
    type ServiceContext struct {
    	Config  config.Config
    	UserRpc 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 line
    	userInfo, 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 line
    	createUser, 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、本案例代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

300. 最长递增子序列

题目 题解 class Solution:def lengthOfLIS(self, nums: List[int]) -> int:# 定义状态dp [1 for i in range(len(nums))]# 状态转移for i in range(len(nums)):for j in range(i):if nums[i] > nums[j]:dp[i] max(dp[i], dp[j] 1)# 返回结果res 0for i in range(le…

如何查看 class 文件的编译器版本

文章目录 原理分析解决方案其它解决方案javap 命令行工具 在平时的 Java 开发中,有时候我们需要知道某个 class 文件是由哪个版本的 Java 编译器编译生成的 原理分析 class 文件,即字节码文件,它有特定的二进制格式,这种格式是由…

vulhub redis-4-unacc

环境搭建 cd vulhub/redis/4-unacc docker-compose up -d 漏洞复现 检测 redis-cli -h ip 使用redis工具 工具地址:https://github.com/vulhub/redis-rogue-getshell 下载完成后,先进入RedisModulesSDK/exp/ 目录进行make操作 获得exp.so后可以进行…

memcacheredis构建缓存服务器

一、缓存服务器: 1、简介: ① 许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。 ● RDBMS&…

【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

参考 Go语言基础之包 | 李文周的博客Go mod的使用、发布、升级 | weiGo Module如何发布v2及以上版本1.2.7. go mod命令 — 新溪-gordon V1.7.9 文档golang go 包管理工具 go mod的详细介绍-腾讯云开发者社区-腾讯云Go Mod 常见错误的原因 | walker的博客 项目案例 oceanweav…

LoRA低秩微调技术详解

在当今快节奏的技术环境中,大型AI模型正在推动不同领域的突破。 然而,根据特定任务或数据集定制这些模型可能是一项计算和资源密集型工作。 LoRA是一种突破性且高效的微调技术,它利用这些高级模型的强大功能来执行自定义任务和数据集&#xf…

注解【元数据,自定义注解等概念详解】(超简单的好吧)

注解的理解与使用 注解的释义元数据的含义基础阶段常见的注解注解的作用(包括但不限于)教你读懂注解内部代码内容五种元注解尝试解读简单注解我当时的疑惑点 自定义注解自定义注解举例 注解的原理总结 注解的释义 我们都知道注释是拿来给程序员看的&…

fopen/fwrite/fread 对UNICODE字符写入的总结

windows对fopen函数进行了升级,可以支持指定文件的编码格式(ccs参数指定)。 例如: FILE *fp fopen("newfile.txt", "rt, ccsUTF-8"); 当以 ccs 模式打开文件时,进行读写操作的数据应为 UTF-16…

湖北成人自考毕业学位申请照片要求及自拍制作方法

湖北成人自考学位申请需要上传照片是为了身份验证和学籍管理的目的。通过上传照片,学校可以确认申请者的身份,并将照片与其他申请信息进行关联。这有助于提高学校对学生的管理效率,确保学籍信息的准确性。同时,照片也用于学位证书…

公众号留言功能怎么恢复?评论功能如何开启?

为什么公众号没有留言功能?从2018年2月开始,新注册的微信公众号取消了留言功能,原因是为了规避一些营销号通过虚假留言骗取读者信任。不过大部分公众号运营者对TX此举感到失望,一方面大片的留言就像店前排队的顾客,能体…

项目全生命周期阶段检查单

项目全生命周期阶段检查单 1、立项阶段 2、计划阶段 3、需求阶段 4、设计阶段 5、编码集成阶段 6、测试阶段 7、交付阶段 8、结项阶段

高可用--限流熔断降级

熔断 熔断是应对微服务雪崩效应的一种链路保护机制。 场景 服务端出现问题 服务指标:响应时间、错误率、连续错误数等,超过阈值出发熔断。硬件指标:CPU、网络IO、内存 目的 服务端恢复需要时间、服务端需要休息避免全调用链路崩溃&…

Unity使用Visual Studio Code 调试

Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor ,这个已经被官方废弃安…

portraiture2024ps磨皮插件参数设置教程

ps磨皮插件一般是第三方软件,通过安装的方式放在ps的相关文件夹中。但也有一些插件是放置在系统软件目录的,不与ps文件放在一起。本文会给大家具体介绍以上两种不同的情况,方便大家了解ps磨皮插件放在哪个文件夹,ps的磨皮插件在哪…

每天一点python——day71

#每天一点Python——71 #格式化字符串在Python中,你可以使用格式化字符串来动态地插入变量的值、表达式的结果等到字符串中。 如图:xxx部分需要不断变化,再和原文拼接 如上图所示这是一个类似于字符串拼接的操作。 因为字符串拼接操作会产生很…

Linux:清空或删除大文件内容的5种方法

在Linux终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件。那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空文件内容的方法。 注意:在我们进一步…

美国政府首席信息安全官详细介绍零信任战略竞赛

如果企业想吸取教训,为庞大的组织快速制定零信任战略,他们应该看看美国联邦政府在 2024 年之前让所有机构合规的努力。 这就是被任命为联邦办公室 CISO(首席信息安全官) 的克里斯德鲁沙 (Chris DeRusha) 的看法。 周三&#xf…

debian10 开启rdp安装firefox,firefox 中文乱码

debian10 开启rdp安装firefox apt -y install tigervnc-standalone-server apt -y install xrdp tigervnc-standalone-server systemctl enable xrdpapt install firefox-esrmstsc连接 firefox-settings-general-fonts-advanced-Simplified Chinese

Redis(地理空间Geospatial和HyperLogLog)

Geospatial: Redis中的Geospatial提供了一种存储和处理地理空间数据的能力,这对于许多应用非常有用。以下是Redis中的Geospatial的一些作用: 1. 地理位置查询:可以存储地理位置的坐标信息,并且可以通过查询指定半径范…