【go-zero】api与rpc使用etcd服务发现

news2024/12/29 8:32:32

准备代码

etcd先安装启动

目录结构
go mod init rpc/demo/v2
在这里插入图片描述

编写rpc

在user-rpc目录下
user.proto 文件
可使用goctl快速生成 goctl rpc -o user.proto

syntax = "proto3";

option go_package="./pb";
package pb;

message GetUserInfoReq {
  int64 id = 1;
}

message GetUserInfoResp {
  int64 id = 1;
  string nickname = 2;
}

service StreamGreeter {
  rpc getUserInfo(GetUserInfoReq) returns (GetUserInfoResp);
}

生成rpc项目

goctl rpc protoc .\user.proto --go_out=. --go-grpc_out=. --zrpc_out=.

编写etc目录下的user.yaml文件,一般会把127.0.0.1修改为0.0.0.0

Name: user.rpc
ListenOn: 0.0.0.0:8980
Etcd:
  Hosts:
  - 0.0.0.0:2379
  Key: user.rpc

写下业务代码 user-rpc/internal/logic/getuserinfologic.go

func (l *GetUserInfoLogic) GetUserInfo(in *pb.GetUserInfoReq) (*pb.GetUserInfoResp, error) {
	// todo: add your logic here and delete this line

	return &pb.GetUserInfoResp{
		Id:       in.Id,
		Nickname: "zero-rpc",
	}, nil
}

etcd开启 就可以启动rpc服务了
在这里插入图片描述

编写api

在user-api目录下
user-api.api文件

syntax = "v1"

info (
	title:  "dada"
	desc:   "使用api调用rpc"
	author: "akadod"
	email:  "aka.dod@yandex.com"
)

type request {
	UserId int64 `path:"userId"`
}

type response {
	Id   int64  `json:"id"`
	Name string `json:"name"`
}

service user-api {
	@handler GetUser // TODO: set handler name and delete this comment
	get /users/id/:userId (request) returns (response)

	@handler CreateUser // TODO: set handler name and delete this comment
	post /users/create (request)
}

生成api代码

goctl api go --api .\user-api.api --dir . --style goZero

添加etcd配置 编辑yaml文件

Name: user-api
Host: 0.0.0.0
Port: 8988
UserRpcConf:
  Etcd:
    Hosts:
      - 0.0.0.0:2379
    Key: user.rpc

config.go文件添加rpc配置

package config

import (
	"github.com/zeromicro/go-zero/rest"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct {
	rest.RestConf
	UserRpcConf zrpc.RpcClientConf
}

编辑 user-api/internal/svc/serviceContext.go 文件

package svc

import (
	"github.com/zeromicro/go-zero/zrpc"
	"rpc/demo/v2/user-api/internal/config"
	"rpc/demo/v2/user-rpc/streamgreeter"
)

type ServiceContext struct {
	Config config.Config
	SsRpc  streamgreeter.StreamGreeter
}

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config: c,
		SsRpc:  streamgreeter.NewStreamGreeter(zrpc.MustNewClient(c.UserRpcConf)),
	}
}

编写getUserLogic.go 业务文件

package logic

import (
	"context"
	"rpc/demo/v2/user-rpc/streamgreeter"

	"rpc/demo/v2/user-api/internal/svc"
	"rpc/demo/v2/user-api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type GetUserLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLogic {
	return &GetUserLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *GetUserLogic) GetUser(req *types.Request) (resp *types.Response, err error) {
	// todo: add your logic here and delete this line
	userResp, err := l.svcCtx.SsRpc.GetUserInfo(l.ctx, &streamgreeter.GetUserInfoReq{Id: req.UserId})
	if err != nil {
		return nil, err
	}
	return &types.Response{
		Id:   userResp.Id,
		Name: userResp.Nickname,
	}, nil
}

启动api服务
在这里插入图片描述

测试

在这里插入图片描述

通过直连

rpc把Etcd配置删掉
user.yaml

Name: user.rpc
ListenOn: 0.0.0.0:8980
Mode: dev

api修改配置文件
user-api.api

Name: user-api
Host: 0.0.0.0
Port: 8988
UserRpcConf:
  Endpoints:
    - 127.0.0.1:8980

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券:怎么选出一只好股票?选对股票就能赚钱吗?

怎样选出好股票: 1、比较股票流动性,流动性是指股票成交的生动程度,能够通过股票成交量来判断。好的股票一般具有较高的流动性,这样能够下降流转成本。流动性差的股票在交易时价格可能存在较大的点差,这会添加出资者的…

ComfyUI【基础篇】:小白都可以学会的ComfyUI安装教程(秋叶版安装包)

大家好我是极客菌!!! 前面和大家分享过使用ComfyUI原生安装包在本地搭建ComfyUI环境。 今天和大家分享另一种在本地搭建ComfyUI环境的方式:使用秋叶大佬的安装包。 一. 秋叶大佬的安装包安装教程 (需要的同学可自行…

【个人博客hexo版】npm安装hexo时会出现的一些问题

目录 bug1 关于缓存地址和全局变量1.删除C:\Users\用户\下的.npmrc文件2.重新设置淘宝镜像 bug2 需要管理员权限解决办法 bug1 关于缓存地址和全局变量 之前修改过缓存地址和全局变量,卸载又安装了新版的nodejs,安装hexo时会弹出之前的缓存地址&#xf…

18057 ASCII码值之和的差

**思路**: 1. 读取两个字符串 s1 和 s2。 2. 计算每个字符串中所有字符的 ASCII 码值之和。 3. 计算两个字符串的 ASCII 码值之和的差。 4. 输出结果。 **伪代码**: 1. 读取字符串 s1。 2. 读取字符串 s2。 3. 初始化 sum1 和 sum2 为 0。 4. 对于 s1 中…

龙良曲pytorch笔记14-33

一、张量数据类型 张量维度含义0维标量1维向量2维矩阵3维时间序列数据 股价 文本数据 单张彩色图片(RGB) 例如,一个图像可以用三个字段表示: (width, height, channel) 3D 但是,在机器学习工作中,我们经常要处理不止一张图片或…

黑神话悟空幽魂怎么打?大头怪幽魂打法攻略!

黑神话悟空幽魂是第一章的一个非剧情头目,虽然不是妖王级别,但是实力强劲,一套小连招防不胜防,攻高血厚,稍不注意就会挑战失败,这里带来具体的打法技巧。 在游戏开始之前,我们必须要拥有一件完美…

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提…

录课软件哪个好用?真人出镜微课,让知识生动起来

在数字化教育的浪潮中,录课软件成为了教师和教育工作者不可或缺的得力助手。它们不仅帮助教师高效录制课程,还能通过真人出镜、动画元素和实地拍摄等多种方式,让知识传授更加生动有趣,下面就一起看看具体的方法吧。 录课软件1&…

PCI Express 体系结构导读摘录(四)

系列文章目录 PCI Express 体系结构导读摘录(一) PCI Express 体系结构导读摘录(二) PCI Express 体系结构导读摘录(三) PCI Express 体系结构导读摘录(四) 文章目录 系列文章目录第…

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统

综合视觉分析系统 技术栈: YOLOv8:用于目标检测,是一个快速且准确的目标检测框架。DeepSORT:用于目标跟踪,结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。GUI:提供一个直观易用的图形用户界面&am…

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍: 主要特点 高精度与多功能:便携式气象仪器…

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构,前端以微信小程序为载体,提供直观、易用的用户界面;后端则采用稳定的服务器架构,确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块,通过API接口实现…

VeRA——更高效的大型语言模型微调方法

人工智能咨询培训老师叶梓 转载标明出处 大模型在特定任务上的高效适应性训练面临着巨大的挑战,尤其是在需要针对大量用户或任务进行个性化调整时,存储和计算资源的需求急剧增加。为了解决这一问题,来自阿姆斯特丹大学QUVA实验室的研究者团队…

sse简单介绍

sse fetch-event-source插件的使用https://blog.csdn.net/weixin_42400404/article/details/141896061?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22141896061%22%2C%22source%22%3A%22weixin_42400404%22%7D 严格意义上&…

【漏洞复现】泛微OA E-Cology XmlRpcServlet 任意文件读取漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

使用docker打包项目的流程(小白可懂)

🎉 前言 这并不完全是一个正经的教程,而是根据我的学习经验总结出来的一个模版,大家可以尝试一下,权当了解一下项目打包的流程。 🎉 克隆演示项目 我在我的GitHub仓库里已经上传了演示项目,大家可以使用…

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型程序设计参考资料致谢预测效果 Matlab实现PSO-LSTM多变量回归…

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C的类型转换 📒1. C语言…

Qt多语言/多语种详细开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语…

【Python知识宝库】使用Python进行网络请求:requests库入门

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、requests库简介二、安装requests库三、发送GET请求四、发送POST请求五、处理响应内容1. 获取状态码2. 获取文…