基于go-zero的rpc服務示例

以下是一個基于 go-zero 框架的簡單 RPC 服務示例,該示例包括一個服務端和一個客戶端通過 gRPC 進行通信。

服務端

1、定義 .proto 文件

在 rpc/add 目錄下創建 adder.proto 文件,定義 RPC 服務:

syntax = "proto3";package adder;service Adder {rpc Add(AddRequest) returns (AddResponse) {}
}message AddRequest {int32 a = 1;int32 b = 2;
}message AddResponse {int32 result = 1;
}

2、生成代碼

使用 protoc 工具生成 Go 代碼:

protoc --go_out=plugins=grpc:. adder.proto

3、實現服務

創建 adder_grpc.go 文件,實現 Adder 服務:

package adderimport ("context"
)type AdderServer struct{}func (s *AdderServer) Add(ctx context.Context, req *AddRequest) (*AddResponse, error) {result := req.GetA() + req.GetB()return &AddResponse{Result: result}, nil
}

4、啟動服務

創建 server.go 文件,啟動 gRPC 服務:

package mainimport ("flag""fmt""net""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/core/logx""github.com/zeromicro/go-zero/zrpc""github.com/your/path/to/rpc/add"
)var configFile = flag.String("f", "etc/config.yaml", "the config file")func main() {flag.Parse()var c zrpc.RpcServerConfconf.MustLoad(*configFile, &c)server := zrpc.MustNewServer(c)defer server.Stop()adderServer := &add.AdderServer{}add.RegisterAdderServer(server.Server, adderServer)fmt.Printf("Starting rpc server on %s...\n", c.ListenOn)server.Start()
}

5、配置文件

在 etc 目錄下創建 config.yaml 文件,配置服務地址和端口:

Name: adder
ListenOn: 127.0.0.1:8080

6、啟動服務端

運行 server.go 文件,啟動 RPC 服務:

go run server.go

客戶端

1、創建客戶端

創建 client.go 文件,創建 gRPC 客戶端:

package mainimport ("context""fmt""time""github.com/zeromicro/go-zero/zrpc""github.com/your/path/to/rpc/add"
)func main() {client := zrpc.MustNewClient("127.0.0.1:8080")defer client.Conn.Close()adderClient := add.NewAdderClient(client.Conn)ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()req := &add.AddRequest{A: 5,B: 7,}resp, err := adderClient.Add(ctx, req)if err != nil {fmt.Println("Error:", err)} else {fmt.Println("Result:", resp.GetResult())}
}

2、運行客戶端

運行 client.go 文件,調用 RPC 服務:

go run client.go

輸出結果:

Result: 12

至此,一個基于 go-zero 框架的簡單 RPC 服務示例完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161577.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IOS+Appium+Python自動化全實戰教程

由于公司的產品坐落于不同的平臺,如ios、mac、Android、windows、web。因此每次有新需求的時候,開發結束后,留給測試的時間也不多。此外,一些新的功能實現,偶爾會影響其他的模塊功能正常的使用。 網上的ios自動化方面的…

MyBatis-Plus的分頁插件和樂觀鎖插件

MyBatis-Plus: 探索分頁查詢和樂觀鎖插件 在現代的Web應用開發中,高效的數據處理是不可或缺的一部分。MyBatis-Plus,作為MyBatis的增強版,提供了多種插件來簡化和優化數據庫操作。在這篇博客中,我們將重點介紹兩個非常實用的插件…

09_面向對象高級_泛型

泛型 1. 認識泛型 定義類、接口、方法時,同時聲明了一個或多個類型變量(如:),稱為泛型類、泛型接口、泛型方法、它們統稱為泛型。 2. 泛型類 public class Test {public static void main(String[] args) {MyArray…

計算機網絡之物理層(數據通信有關)

一、概述 1.1物理層引入的目的 屏蔽掉傳輸介質的多樣性,導致數據傳輸方式的不同;物理層的引入使得高層看到的數據都是統一的0,1構成的比特流 1.2.物理層如何實現屏蔽 物理層靠定義的不同的通信協議(一般稱通信規程) 這些協議…

基于高質量訓練數據,GPT-4 Turbo更出色更強大

11月7日消息,OpenAI在首屆開發者大會上正式推出了GPT-4 Turbo。 與GPT-4相比,GPT-4 Turbo主要有6方面的提升: 1、擴展下文對話長度:GPT4最大只能支持8k的上下文長度(約等于6000個單詞),而GPT-4…

智能小車速通版——手把手教程

考慮到大部分學校,會發放簡易小車來作為智能車初期培訓和篩選的工具, 于是,我寫一個簡單的教程,能夠實現簡單小車的電磁循跡。 通過這個教程,能夠通過簡化的步驟搭建尋跡小車,進而了解整個智能車是如何實…

Redis-Redis持久化,主從哨兵架構詳解

Redis持久化 RDB快照(snapshot) 在默認情況下, Redis 將內存數據庫快照保存在名字為 dump.rdb 的二進制文件中。 你可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數…

【操作系統】I/O軟件層次結構

文章目錄 1. 前言2. I/O軟件層次結構2.1 用戶層軟件2.2 設備獨立性軟件2.3 設備驅動程序2.4 中斷處理程序 1. 前言 偶然看到“程序員的護城河是什么”這個話題,作為一個工作兩年多的程序員吧,經常看到網上關于各種35歲危機、裁員甚至猝死之云云。最近也…

modbus協議及modbus TCP協議

一、Modbus協議 1.起源 Modbus由Modicon公司于1979年開發,是一種工業現場總線協議標準。 Modbus通信協議具有多個變種,其中有支持串口,以太網多個版本,其中最著名的是Modbus RTU(通信效率最高,基于串口&am…

springboot前后端分離項目配置https接口(ssl證書)

文章目錄 說明vue.js前端部署vue.js項目axios請求配置本地創建日志文件創建Dockerfile文件配置ssl證書nginx.confvue項目打包上傳創建容器部署 后端springboot項目部署配置ssl證書打包部署 補充:jsk證書和pfx證書補充:兩種證書的轉化JKS轉PFXPFX 轉 JKS …

Elasticsearch:將最大內積引入 Lucene

作者:Benjamin Trent 目前,Lucene 限制 dot_product (點積) 只能在標準化向量上使用。 歸一化迫使所有向量幅度等于一。 雖然在許多情況下這是可以接受的,但它可能會導致某些數據集的相關性問題。 一個典型的例子是 Cohere 構建的嵌入&#x…

使用 Lhotse 高效管理音頻數據集

Lhotse 是一個旨在使語音和音頻數據準備更具靈活性和可訪問性的 Python 庫,它與 k2 一起,構成了下一代 Kaldi 語音處理庫的一部分。 主要目標: 1. 以 Python 為中心的設計吸引更廣泛的社區參與語音處理任務。 2. 為有經驗的 Kaldi 用戶提供…

SpringBoot——啟動類的原理

優質博文:IT-BLOG-CN SpringBoot啟動類上使用SpringBootApplication注解,該注解是一個組合注解,包含多個其它注解。和類定義SpringApplication.run要揭開SpringBoot的神秘面紗,我們要從這兩位開始就可以了。 SpringBootApplicati…

Spring實例化對象

默認proxyBeanMethods true,這種方法是用的代理模式創建對象,每次創建都是同一個對象,如果改為false每次都是不同的對象 FactoryBean的使用 定義的類A,造出來一個類B,可以在創造bean之前做一些自己的個性化操作

MFS分布式文件系統

目錄 集群部署 Master Servers ?Chunkservers ?編輯Clients Storage Classes LABEL mfs高可用 pacemaker高可用 ?編輯ISCSI 添加集群資源 主機 ip 角色 server1 192.168.81.11 Master Servers server2 192.168.81.12 Chunkservers server3 192.168.81.13 Chunkserver…

【產品安全平臺】上海道寧與Cybellum將整個產品安全工作流程整合到一個專用平臺中,保持構建的互聯產品的網絡安全和網絡合規性

Cybellum將 整個產品安全工作流程 整合到一個專用平臺中 使設備制造商能夠 保持他們構建的互聯產品的 網絡安全和網絡合規性 產品安全性對 每個人來說都不一樣 每個行業的系統、工作流程和 法規都存在根本差異 因此,Cybellum量身定制了 Cybellum的平臺和技…

為何內存不夠用?微服務改造啟動多個Spring Boot的陷阱與解決方案

在生產環境中我們會遇到一些問題,此文主要記錄并復盤一下當時項目中的實際問題及解決過程。 背景簡述 最初系統上線后都比較正常風平浪靜的。在系統運行了一段時間后,業務量上升后,生產上發現java應用內存占用過高,服務器總共64…

打印出一個底部有n個*的漏斗c語言

題目描述 打印出一個底部有n個*的漏斗 輸入 第一行輸入一個T;表示有T組測試數據 下面每一行都有一個n表示漏斗底部*的個數 n保證是奇數 輸出 輸出打印結果 兩個測試答案之間要用換行分割 /*printf("這是第%d行 我要打印%d個* \n",Num,i); */ *********** *…

愛創科技總裁謝朝暉榮獲“推動醫藥健康產業高質量發展人物”

中國醫藥市場規模已經成為全球第二大醫藥市場,僅次于美國。近年來,隨著中國經濟的持續增長和人民生活水平的提高,醫藥市場需求不斷擴大。政府對醫療衛生事業的投入也在不斷加大,為醫藥行業的發展創造了良好的政策環境。為推動醫藥…

SparkSession介紹

一、 介紹 SparkSession是Spark 2.0中引入的新概念,它是Spark SQL、DataFrame和Dataset API的入口點,是Spark編程的統一API,也可看作是讀取數據的統一入口;它將以前的SparkContext、SQLContext和HiveContext組合在一起&#xff0…