go-zero学习笔记(四)

server/2025/2/7 9:41:21/

在api中访问rpc服务

  1. 必备条件
    api端(客户端)有rpc端的pb文件,以及客户端文件(非必要),且已知rpc端的服务注册方式(etcd、k8s)及地址,端口等
    在这里插入图片描述

  2. api端配置文件编写

    # 新增如下配置:
    # 如果rpc端的服务注册为ETCD
    DemoRpcConf:Etcd:Hosts:- 0.0.0.0:2379 # etcd的地址及端口key: demo.rpc #rpc注册时的key# 如果rpc端的服务注册为K8S
    DemoRpcConf:Target: kubernetes:///<service-name>.<namespace>.svc.cluster.local:port
    

    当然还有其他方式,但主要以这两种为主

  3. api端internal/config/config.go编写

    // 在config结构体中新增如下代码:
    DemoRpcConf zrpc.RpcClientConf 
    
  4. api端internal/svc/servicecontext.go编写

    // 在ServiceContext结构体中新增如下代码:
    DemoRpc         demo.DemoClient
    
    // 在NewServiceContext方法的返回值中新增如下代码:
    DemoRpc: democlient.NewDemo(zrpc.MustNewClient(c.DemoRpcConf)),//如果你有democlient包
    DemoRpc: demo.NewDemoClient(zrpc.MustNewClient(c.DemoRpcConf).Conn()), // 只有pb文件
    

    这里,如果你的rpc服务做了多节点部署,zrpc会自动实现基于p2c的负载均衡算法,使客户端到服务端的访问变为负载均衡模式。

  5. rpc方法调用
    经过上述步骤,已经实现rpc客户端的初始化,并将其保存在svc中,那么在logic中,你就可以直接调用具体方法了。
    在这里插入图片描述

本地测试rpc服务

  1. 前提
    如果你在写完rpc的logic层以后,想做一个简单的测试,且你电脑上也没有安装ETCD、k8s等服务注册、服务发现组件,那么此时你可以使用直连的方式。

  2. 在rpc的配置文件中etc/demo.yaml删除关于etcd的配置

    Name: demo.rpc
    ListenOn: 0.0.0.0:8080
    Etcd:Hosts:- 127.0.0.1:2379Key: demo.rpc
    
  3. 直连代码

    package mainimport ("context""demo/rpc/demo""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""google.golang.org/grpc/metadata"
    )func main() {addr := ":8080" // rpc端口conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {// 错误处理fmt.Println(err.Error())}defer conn.Close()client := demo.NewDemoClient(conn)ctx := metadata.AppendToOutgoingContext(context.Background(), "key", "value")resp, err := client.Search(ctx, nil) // 具体方法if err != nil {fmt.Println(err)return}fmt.Printf("==============%#v==============", resp.Projects)
    }

api请求rpc时使用ctx传值

  1. 需求:
    在上述代码中,api调用rpc时需要传入上下文ctx,有时候,我们需要将一些固定的值由ctx带入,而不是在请求参数中带过去,比如api版本,请求唯一ID等。

  2. 问题:
    如果你使用的是:

    ctx := context.WithValue(r.Context(), "key", "value")
    

    你会发现,在rpc端是无法读取到对应的数据的,也就是说这种方式是无法将值存储在ctx中传递给rpc服务端的。

  3. 解决方案:使用metadata包实现

    // 客户端(api端)实现如下方法设置ctx:
    ctx := metadata.AppendToOutgoingContext(context.Background(), "key", "value")
    // 也可以使用,但是NewOutgoingContext会将之前的数据覆盖,因此推荐第一种
    md := metadata.New(map[string]string{"key": "value", "key1": "value1"})
    ctx := metadata.NewOutgoingContext(context.Background(), md)
    
    // 服务端(rpc端)读取ctx
    md, ok := metadata.FromIncomingContext(l.ctx)
    if ok {for k, v := range md {fmt.Printf("key:%s  value:%s\n", k, v)}
    }
    

更多metadata包使用详情可参考 写给go开发者的gRPC教程-metadata


http://www.ppmy.cn/server/165644.html

相关文章

【探商宝】DeepSeek 最新模型对 ChatGPT 的影响及行业新变革

在人工智能领域的激烈竞争中&#xff0c;DeepSeek 发布的最新模型无疑给 ChatGPT 带来了巨大的冲击&#xff0c;同时也促使整个行业出现了一系列引人注目的变化&#xff0c;如 ChatGPT 的降价以及搜索功能无需登录即可使用等。 一、DeepSeek 最新模型的技术优势 架构创新与效…

React 第二十二节 useSyncExternalStore Hook 常见问题及用法详解

1、概述 在React 中我们通常会使用 useState useReducer 进行数据状态更新&#xff0c;但是当我们需要对外部的数据状态进行处理时候&#xff0c;我们需要使用React 提供的新Hook&#xff0c;useSyncExternalStore 让我们可以在React 内部订阅外部数据属性的状态&#xff0c;当…

最大值的期望 与 期望的最大值

期望的最大值与最大值的期望 先上结论: m a x i E [ X i ] ≠ E [ m a x i X i ] max_i \mathbb{E}[X_i]\neq \mathbb{E}[max_i X_i] maxi​E[Xi​]E[maxi​Xi​] 情况一&#xff1a;最大值和数学期望都关于自变量 i i i 在这种情况下&#xff0c;最大值与期望都依赖于同一…

git bash添加tree命令

1 git bash环境没有自带tree命令 在git bash里面输入命令&#xff1a;tree&#xff0c;弹出错误如下&#xff0c;解决git Bash下安装使用tree 2 官网下载 官网下载&#xff1a;Tree for Windows 将下载的tree-1.5.2.2-bin.zip解压&#xff0c;将tree-1.5.2.2-bin\bin\tree.…

Go-Gin Web 框架完整教程

1. 环境准备 1.1 Go 环境安装 Go 语言&#xff08;或称 Golang&#xff09;是一个开源的编程语言&#xff0c;由 Google 开发。在开始使用 Gin 框架之前&#xff0c;我们需要先安装 Go 环境。 安装步骤&#xff1a; 访问 Go 官网下载页面&#xff1a;https://golang.org/dl…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

langchain教程-3.OutputParser/输出解析

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…

大模型—Dify本地化部署实战

Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…