[go-zero] 簡單微服務調用

文章目錄

      • 1.注意事項
      • 2.服務劃分及創建
        • 2.1 用戶微服務
        • 2.2 訂單微服務
      • 3.啟動服務
        • 3.1 etcd 服務啟動
        • 3.2 微服務啟動
        • 3.3 測試訪問

1.注意事項

go-zero微服務的注冊中心默認使用的是Etcd。

本小節將以一個訂單服務調用用戶服務來簡單演示一下,其實訂單服務是api服務,用戶服務是rpc服務。

這里的創建步驟和官方文檔的不一致,做了部分優化,前提是已經了解了go-zero微服務調用及配置流程。初學者還是推薦按照官方文檔操作。

2.服務劃分及創建

2.1 用戶微服務

在這里插入圖片描述

在這里插入圖片描述

syntax = "proto3";package user;// protoc-gen-go 版本大于1.4.0, proto文件需要加上go_package,否則無法生成
option go_package = "./user";message IdRequest {string id = 1;
}message UserResponse {// 用戶idstring id = 1;// 用戶名稱string name = 2;// 用戶性別string gender = 3;
}service User {rpc getUser(IdRequest) returns(UserResponse);
}

在這里插入圖片描述

user服務的代碼邏輯主要是在 internal/logic/xxxlogic.go里填寫,xxxlogic.go的xxx指的是在.proto中定義的方法名的小寫。

在這里插入圖片描述

rpc getUser(IdRequest) returns(UserResponse);

對應 internal/logic/getuserlogic.go,一個rpc方法對應一個logic.go。在logic.go中可以進一步處理請求,比如操作數據庫,Redis等。

package logicimport ("context""go-zero-micro/rpc/user/internal/svc""go-zero-micro/rpc/user/user""github.com/zeromicro/go-zero/core/logx"
)type GetUserLogic struct {ctx    context.ContextsvcCtx *svc.ServiceContextlogx.Logger
}func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLogic {return &GetUserLogic{ctx:    ctx,svcCtx: svcCtx,Logger: logx.WithContext(ctx),}
}func (l *GetUserLogic) GetUser(in *user.IdRequest) (*user.UserResponse, error) {// todo: add your logic here and delete this lineuserRes :=&user.UserResponse{Id: in.Id,Gender: "男",}if in.Id == "1" {userRes.Name = "admin"}else {userRes.Name = "test"}return userRes, nil
}
2.2 訂單微服務

在order服務下添加order.api文件,增加getUser方法:

在這里插入圖片描述

syntax = "v1"type Request {Name string `path:"name,options=you|me"`
}type Response {Message string `json:"message"`
}type (OrderReq {Id string `path:"id"`}OrderResp {Id       string `json:"id"`Name     string `json:"name"`UserName string `json:"userName"`}
)service order-api {@handler OrderHandlerget /from/:name (Request) returns (Response)@handler GetOrderHandlerget /api/order/get/:id (OrderReq) returns (OrderResp)
}

執行生成order服務的命令

在這里插入圖片描述

在這里插入圖片描述

order服務調用user服務需要改動3個地方。

  1. etc/order.yaml
  2. internal/config/config.go
  3. internal/svc/servicecontext.go

order.yaml

Name: order-api
Host: 0.0.0.0
Port: 8888
UserRpc:Etcd:Hosts:- localhost:2379Key: user.rpc

user.yaml

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

加入user服務的RPC。

config.go

package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfUserRpc zrpc.RpcClientConf
}

user服務接口加入到 order服務的ServiceContext中。

servicecontext.go

package svcimport ("github.com/zeromicro/go-zero/zrpc""mall/order/internal/config""mall/user/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)),}
}

order服務修改 getorderlogic.go。

getorderlogic.go

package logicimport ("context""github.com/pkg/errors""mall/user/user""strconv""mall/order/internal/svc""mall/order/internal/types""github.com/zeromicro/go-zero/core/logx"
)type GetOrderLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewGetOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetOrderLogic {return &GetOrderLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *GetOrderLogic) GetOrder(req *types.OrderReq) (resp *types.OrderResp, err error) {// todo: add your logic here and delete this lineId, err := strconv.Atoi(req.Id)if err != nil {return nil, err}if Id < 1 {return nil, errors.New("用戶不存在")}userRes, err := l.svcCtx.UserRpc.GetUser(l.ctx, &user.IdRequest{Id: req.Id,})if err != nil {return nil, err}return &types.OrderResp{Id:       req.Id,Name:     userRes.Name,UserName: "userName",}, nil
}

3.啟動服務

3.1 etcd 服務啟動

在這里插入圖片描述

在這里插入圖片描述

3.2 微服務啟動

在這里插入圖片描述

user.go

package mainimport ("flag""fmt""mall/user/internal/config""mall/user/internal/server""mall/user/internal/svc""mall/user/user""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/core/service""github.com/zeromicro/go-zero/zrpc""google.golang.org/grpc""google.golang.org/grpc/reflection"
)var configFile = flag.String("f", "etc/user.yaml", "the config file")func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)ctx := svc.NewServiceContext(c)s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {user.RegisterUserServer(grpcServer, server.NewUserServer(ctx))if c.Mode == service.DevMode || c.Mode == service.TestMode {reflection.Register(grpcServer)}})defer s.Stop()fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)s.Start()
}

在這里插入圖片描述

order.go

在這里插入圖片描述

package mainimport ("flag""fmt""mall/order/internal/config""mall/order/internal/handler""mall/order/internal/svc""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/rest"
)var configFile = flag.String("f", "etc/order.yaml", "the config file")func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)server := rest.MustNewServer(c.RestConf)defer server.Stop()ctx := svc.NewServiceContext(c)handler.RegisterHandlers(server, ctx)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)server.Start()
}
3.3 測試訪問

http://localhost:8888/api/order/get/1

在這里插入圖片描述

http://localhost:8888/api/order/get/2

在這里插入圖片描述
http://localhost:8888/api/order/get/-1

在這里插入圖片描述

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

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

相關文章

Java 使用sql查詢mongodb

在現代應用開發中&#xff0c;關系型數據庫和NoSQL數據庫各有千秋。MongoDB作為一種流行的NoSQL數據庫&#xff0c;以其靈活的文檔模型和強大的擴展能力&#xff0c;受到廣泛歡迎。然而&#xff0c;有時開發者可能更熟悉SQL查詢語法&#xff0c;或者需要在現有系統中復用SQL查詢…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超優先級中斷詳細介紹】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 Interrupt superpriority超優先級中斷的特性和應用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

進程控制-wait和waitpid進程回收

wait 阻塞函數 函數作用&#xff1a; 1. 阻塞并等待子進程退出 2. 回收子進程殘留資源 3. 獲取子進程結束狀態&#xff08;退出原因&#xff09; pid_t wait(int *wstatus); 返回值&#xff1a; ‐1 : 回收失敗&#xff0c;已經沒有子進程了 >0 : 回收子進程對應的…

一種非凸全變差正則化的信號降噪方法(以模擬信號和軸承振動信號為例,MATLAB)

以旋轉機械振動信號為例&#xff0c;由于旋轉機械運行中背景噪聲較強&#xff0c;振動信號需要進行降噪處理。常用的小波閾值降噪會在信號的不連續處產生虛假的波峰和偽吉布森震蕩&#xff0c;而奇異值分解SVD去噪容易產生虛假分量&#xff0c;全變差去噪則不會出現這樣的情況&…

美國大選特色

美國總統是間接民選的。選民不直接投票選舉總統&#xff0c;而是通過選舉一個稱為選舉人團&#xff08;Electoral College&#xff09;的機構成員來間接決定總統。具體過程如下&#xff1a; 1. **選民投票**&#xff1a;在11月的大選日&#xff0c;選民投票選舉他們所在州的選…

深入理解JS逆向代理與環境監測

博客文章&#xff1a;深入理解JS逆向代理與環境監測 1. 引言 首先要明確JavaScript&#xff08;JS&#xff09;在真實網頁瀏覽器環境和Node.js環境中有很多使用特性的區別。尤其是在環境監測和對象原型鏈的檢測方面。本文將探討如何使用JS的代理&#xff08;Proxy&#xff09…

MySQL之備份與恢復(九)

備份與恢復 從備份中恢復 更高級的恢復技術 復制和基于時間點的恢復使用的是相同的技術:服務器的二進制日志。這意味著復制在恢復時會是個非常有幫助的工具&#xff0c;哪怕方式不是很明顯。下面將演示一些可以用到的方法。這里列出來的不是一個完整的列表&#xff0c;但應該…

STM32-USART

本內容基于江協科技STM32視頻學習之后整理而得。 文章目錄 1. 串口通信協議1.1 通信接口1.2 串口通信1.3 硬件電路1.4 電平標準1.5 串口參數及時序1.6 串口時序 2. USART串口通信2.1 USART簡介2.2 USART框圖2.3 USART基本結構2.4 數據幀2.5 數據幀-配置停止位2.6 起始位偵測2.…

DP學習——簡單工廠模式

學而時習之&#xff0c;溫故而知新。 敵人出招&#xff08;使用場景&#xff09; 不同的業務場景下要創建不同的對象&#xff0c;但是這些對象又有共同的特點。如何復用代碼呢&#xff1f;你會想到&#xff0c;這些對象可以抽象出一個基類/抽象類就行了&#xff0c;那么隨著業…

【Python】一文向您詳細介紹 argparse中 action=‘store_true’ 的作用

【Python】一文向您詳細介紹 argparse中 action‘store_true’ 的作用 下滑即可查看博客內容 &#x1f308; 歡迎蒞臨我的個人主頁 &#x1f448;這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主簡介&#xff1a;98…

pdf怎么轉換成圖片格式文件,pdf文檔怎么轉換成圖片格式

在數字化時代&#xff0c;pdf文件轉換成圖片格式是一種常見的操作&#xff0c;無論是在工作還是日常生活中&#xff0c;我們總會遇到需要將pdf文件轉換為圖片的需求。這可能是因為圖片格式更易于分享、展示或編輯。那么&#xff0c;如何高效地將pdf轉換成圖片呢&#xff1f;本文…

圖神經網絡實戰(16)——經典圖生成算法

圖神經網絡實戰&#xff08;16&#xff09;——經典圖生成算法 0. 前言1. 圖生成技術2. Erd?s–Rnyi模型3. 小世界模型小結系列鏈接 0. 前言 圖生成算法是指用于創建模擬圖或網絡結構的算法&#xff0c;這些算法可以根據特定的規則和概率分布生成具有特定屬性的圖&#xff0c…

深度解析:如何利用Python高效挖掘SQLite潛力

Python與SQLite共舞&#xff1a;構建高效輕量級數據庫應用實戰 Python&#xff0c;作為一門優雅且強大的編程語言&#xff0c;搭配輕巧靈活的SQLite數據庫&#xff0c;無疑為我們提供了揮灑創意的完美畫布。今天&#xff0c;咱們就通過一個鮮活的案例&#xff0c;一起探索如何…

leetcode77組合——經典回溯算法

本文主要講解組合的要點與細節&#xff0c;以及回溯算法的解題步驟&#xff0c;按照步驟思考更方便理解 c和java代碼如下&#xff0c;末尾 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 具體要點&#xff1a; …

將大型語言模型模塊化打造協作智能體

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 論文鏈接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任務環境中&#xff0c;多智能體合作問題因原始感官觀察、高昂…

【機器學習】機器學習重塑廣告營銷:精準觸達,高效轉化的未來之路

&#x1f4dd;個人主頁&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; ?目錄 &#x1f4d2;1. 引言&#x1f4d9;2. 機器學習基礎與廣告營銷的結合&#x1f9e9;機器學習在廣告營銷中的核心應用領域&#x1f339;用…

【React】React18 Hooks 之 useReducer

目錄 useReducer案例1&#xff1a;useReducer不帶初始化函數案例2&#xff1a;useReducer帶初始化函數注意事項1&#xff1a;dispatch函數不會改變正在運行的代碼的狀態注意事項2&#xff1a;獲取dispatch函數觸發后 JavaScript 變量的值注意事項3&#xff1a;觸發了reducer&am…

webrtc sfu性能壓測

1. 前言 不少網友最近私信我&#xff0c;咨詢webrtc sfu服務端性能問題&#xff0c;SRS開源服務能支持多少路webrtc流&#xff0c;mediasoup單房間能支持多少個人&#xff0c;推流能接入多少路&#xff0c;拉流能拉取多少路&#xff1f;720p能支持多少路&#xff0c;360p能支持…

Spring Boot集成olingo快速入門demo

1.什么是olingo&#xff1f; Apache Olingo 是個 Java 庫&#xff0c;用來實現 Open Data Protocol (OData)。 Apache Olingo 包括服務客戶端和 OData 服務器方面。 Open Data Protocol &#xff08;開放數據協議&#xff0c;OData&#xff09; 是用來查詢和更新數據的一種W…

【吊打面試官系列-MyBatis面試題】MyBatis 實現一對多有幾種方式,怎么操作的?

大家好&#xff0c;我是鋒哥。今天分享關于 【MyBatis 實現一對多有幾種方式,怎么操作的&#xff1f;】面試題&#xff0c;希望對大家有幫助&#xff1b; MyBatis 實現一對多有幾種方式,怎么操作的&#xff1f; 有聯合查詢和嵌套查詢。聯合查詢是幾個表聯合查詢,只查詢一次,通過…