国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用go-zero快速構(gòu)建微服務(wù)

這篇具有很好參考價值的文章主要介紹了使用go-zero快速構(gòu)建微服務(wù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文是對 使用go-zero快速構(gòu)建微服務(wù)[1]的親手實踐


編寫API Gateway代碼


mkdir?bookstore?&&?cd?bookstore
go?mod?init?bookstore

mkdir api && goctl api -o api/bookstore.api

syntax = "v1"

info(
    title: "xx使用go-zero"
    desc: "xx用來上手go-zero"
    author: "xxxx"
    email: "xxxx@gmail.com"
)

type (
    addReq struct {
        book string `form:"book"`
        price int64 `form:"price"`
    }

    addResp struct {
        ok bool `json:"ok"`
    }
)

type (
    checkReq struct {
        book string `form:"book"`
    }

    checkResp struct {
        found bool `json:"found"`
        price int64 `json:"price"`
    }
)


service bookstore-api {
    @handler AddHandler
    get /add (addReq) returns (addResp)

    @handler CheckHandler
    get /check (checkReq) returns (checkResp)
}

cd api && goctl api go -api bookstore.api -dir .

使用go-zero快速構(gòu)建微服務(wù),后端
api
├──?bookstore.api??????????????????//?api定義
├──?bookstore.go???????????????????//?main入口定義
├──?etc
│???└──?bookstore-api.yaml?????????//?配置文件
└──?internal
????├──?config
????│???└──?config.go??????????????//?定義配置
????├──?handler
????│???├──?addhandler.go??????????//?實現(xiàn)addHandler
????│???├──?checkhandler.go????????//?實現(xiàn)checkHandler
????│???└──?routes.go??????????????//?定義路由處理
????├──?logic
????│???├──?addlogic.go????????????//?實現(xiàn)AddLogic
????│???└──?checklogic.go??????????//?實現(xiàn)CheckLogic
????├──?svc
????│???└──?servicecontext.go??????//?定義ServiceContext
????└──?types
????????└──?types.go???????????????//?定義請求、返回結(jié)構(gòu)體


go run bookstore.go -f etc/bookstore-api.yaml

啟動API Gateway服務(wù),默認偵聽在8888端口

因為默認生成的api/etc/bookstore-api.yml為:

Name:?bookstore-api
Host:?0.0.0.0
Port:?8888
使用go-zero快速構(gòu)建微服務(wù),后端

按提示下載,再次運行:

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端
{"@timestamp":"2023-02-16T16:31:09.658+08:00","caller":"stat/usage.go:61","content":"CPU:?0m,?MEMORY:?Alloc=2.5Mi,?TotalAlloc=2.5Mi,?Sys=14.5Mi,?NumGC=0","level":"stat"}
{"@timestamp":"2023-02-16T16:31:09.662+08:00","caller":"load/sheddingstat.go:61","content":"(api)?shedding_stat?[1m],?cpu:?0,?total:?0,?pass:?0,?drop:?0","level":"stat"}
{"@timestamp":"2023-02-16T16:31:15.044+08:00","caller":"stat/metrics.go:210","content":"(bookstore-api)?-?qps:?0.0/s,?drops:?0,?avg?time:?0.0ms,?med:?0.0ms,?90th:?0.0ms,?99th:?0.0ms,?99.9th:?0.0ms","level":"stat"}

會定時(默認一分鐘)輸出cpu,內(nèi)存等的統(tǒng)計信息,可以通過 logx.DisableStat()禁用 (可以做到自定義模板.tpl里)

使用go-zero快速構(gòu)建微服務(wù),后端

返回的是null,并不是預(yù)期的{"found":false,"price":0}

這是因為:

使用go-zero快速構(gòu)建微服務(wù),后端

resp是一個指針,這樣直接return會是nil,需要如下顯式聲明

使用go-zero快速構(gòu)建微服務(wù),后端

重啟服務(wù),再次發(fā)起請求,這樣的response就符合預(yù)期了~

使用go-zero快速構(gòu)建微服務(wù),后端

目前只返回了個空值,接下來會在rpc服務(wù)里實現(xiàn)業(yè)務(wù)邏輯

可以修改internal/svc/servicecontext.go來傳遞服務(wù)依賴(如果需要,比如Config,Auth,后續(xù)用到的RPC等)

實現(xiàn)邏輯可以修改internal/logic下的對應(yīng)文件(如果接口較多,可以在.api里定義不同的group,使用goctl生成代碼時,會自動在logic下根據(jù)group名稱創(chuàng)建不同的文件夾)

可以通過goctl生成各種客戶端語言的api調(diào)用代碼(供客戶端同學使用;支持多種語言)


編寫RPC代碼


編寫add rpc服務(wù)

切到bookstore目錄下

mkdir -p rpc/add && cd rpc/add

goctl rpc template -o add.proto

修改后文件內(nèi)容如下:

syntax = "proto3";

package add;

option go_package = "./pb";

message addReq {
  string book = 1;
  int64 price = 2;
}

message addResp {
  bool ok = 1;
}

service adder {
  rpc add(addReq) returns(addResp);
}

goctl rpc protoc add.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.

使用go-zero快速構(gòu)建微服務(wù),后端
rpc/add
├──?add.go??????????????????????//?rpc服務(wù)main函數(shù)
├──?add.proto???????????????????//?rpc接口定義
├──?adder
???├──?adder.go????????????????//?提供了外部調(diào)用方法,無需修改
???├──?adder_mock.go???????????//?mock方法,測試用
???└──?types.go????????????????//?request/response結(jié)構(gòu)體定義
├──?etc
???└──?add.yaml????????????????//?配置文件
├──?internal
???├──?config
??????└──?config.go???????????//?配置定義
???├──?logic
??????└──?addlogic.go?????????//?add業(yè)務(wù)邏輯在這里實現(xiàn)
???├──?server
??????└──?adderserver.go??????//?調(diào)用入口,?不需要修改
???└──?svc
???????└──?servicecontext.go???//?定義ServiceContext,傳遞依賴
└──?pb
????└──?add.pb.go

go run add.go -f etc/add.yaml 可運行該服務(wù)

默認每隔一分鐘輸出cpu和內(nèi)存信息

{"@timestamp":"2023-02-16T20:02:10.640+08:00","caller":"stat/usage.go:61","content":"CPU:?0m,?MEMORY:?Alloc=3.3Mi,?TotalAlloc=6.2Mi,?Sys=15.9Mi,?NumGC=3","level":"stat"}
{"@timestamp":"2023-02-16T20:02:10.656+08:00","caller":"load/sheddingstat.go:61","content":"(rpc)?shedding_stat?[1m],?cpu:?0,?total:?0,?pass:?0,?drop:?0","level":"stat"}
編寫check rpc服務(wù)

切到bookstore目錄下

mkdir -p rpc/check && cd rpc/check

goctl rpc template -o check.proto

修改后文件內(nèi)容如下:

syntax = "proto3";

package check;

option go_package = "./pb";

message checkReq {
  string book = 1;
}

message checkResp {
  bool found = 1;
  int64 price = 2;
}

service checker {
  rpc check(checkReq) returns(checkResp);
}

goctl rpc protoc check.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.

使用go-zero快速構(gòu)建微服務(wù),后端
rpc/check
├──?check.go????????????????????//?rpc服務(wù)main函數(shù)
├──?check.proto?????????????????//?rpc接口定義
├──?checker
???├──?checker.go??????????????//?提供了外部調(diào)用方法,無需修改
???├──?checker_mock.go?????????//?mock方法,測試用
???└──?types.go????????????????//?request/response結(jié)構(gòu)體定義
├──?etc
???└──?check.yaml??????????????//?配置文件
├──?internal
???├──?config
??????└──?config.go???????????//?配置定義
???├──?logic
??????└──?checklogic.go???????//?check業(yè)務(wù)邏輯在這里實現(xiàn)
???├──?server
??????└──?checkerserver.go????//?調(diào)用入口,?不需要修改
???└──?svc
???????└──?servicecontext.go???//?定義ServiceContext,傳遞依賴
└──?pb
????└──?check.pb.go

go run check.go -f etc/check.yaml 可運行該服務(wù)

修改etc/check.yaml的端口為8081(因為8080已經(jīng)被add服務(wù)使用了)


再回去修改API Gateway代碼,調(diào)用add/check rpc服務(wù)


api/etc/bookstore-api.yaml,增加如下內(nèi)容

Add:
??Etcd:
????Hosts:
??????-?localhost:2379
????Key:?add.rpc
Check:
??Etcd:
????Hosts:
??????-?localhost:2379
????Key:?check.rpc

通過etcd自動去發(fā)現(xiàn)可用的add和check服務(wù)

使用go-zero快速構(gòu)建微服務(wù),后端

修改api/internal/config/config.go如下,增加add&check服務(wù)依賴

使用go-zero快速構(gòu)建微服務(wù),后端

修改api/internal/svc/servicecontext.go,如下:

使用go-zero快速構(gòu)建微服務(wù),后端

通過ServiceContext在不同業(yè)務(wù)邏輯之間傳遞依賴

(問:怎么解決依賴注入問題)


修改api/internal/logic/addlogic.go里的Add方法,如下:

使用go-zero快速構(gòu)建微服務(wù),后端使用go-zero快速構(gòu)建微服務(wù),后端

通過調(diào)用adder的Add方法實現(xiàn)添加圖書到bookstore系統(tǒng)


修改api/internal/logic/checklogic.go里的Check方法,如下:

使用go-zero快速構(gòu)建微服務(wù),后端

通過調(diào)用checker的Check方法實現(xiàn)從bookstore系統(tǒng)中查詢圖書的價格


定義數(shù)據(jù)庫表結(jié)構(gòu),并生成CRUD+cache代碼


bookstore下創(chuàng)建rpc/model目錄

mkdir -p rpc/model (不過一般習慣把這個model文件夾抽出來,和api,rpc在一層)

在rpc/model目錄下編寫創(chuàng)建book表的sql文件book.sql,如下:

CREATE?TABLE?`book`
(
??`book`?varchar(255)?NOT?NULL?COMMENT?'book?name',
??`price`?int?NOT?NULL?COMMENT?'book?price',
??PRIMARY?KEY(`book`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4;

進入mysql命令行,創(chuàng)建DB和table

create?database?gozero;
source?book.sql;

在rpc/model目錄下執(zhí)行如下命令生成CRUD+cache代碼,-c表示使用redis cache

goctl model mysql ddl -c -src book.sql -dir .

使用go-zero快速構(gòu)建微服務(wù),后端

修改add rpc和check rpc,調(diào)用crud+cache代碼


修改rpc/add/etc/add.yaml和rpc/check/etc/check.yaml,均增加如下內(nèi)容:

DataSource:?root:123456@@tcp(xxx.xxx.xx.xx:3306)/gozero
#DataSource:?root:123456@@tcp(localhost:3306)/gozero?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai?#可以這樣指定一些其他信息
Table:?book
Cache:
??-?Host:?localhost:6379

使用go-zero快速構(gòu)建微服務(wù),后端

可以使用多個redis作為cache,支持redis單點或者redis集群


修改rpc/add/internal/config.go和rpc/check/internal/config.go,如下:

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端

修改rpc/add/internal/svc/servicecontext.go和rpc/check/internal/svc/servicecontext.go,如下:

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端

修改rpc/add/internal/logic/addlogic.go,如下

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端

修改rpc/check/internal/logic/checklogic.go,如下:

使用go-zero快速構(gòu)建微服務(wù),后端

項目使用


需要先全部啟動api服務(wù)所依賴的rpc服務(wù)。如果先啟動api,則會報錯:

error: context deadline exceeded, make sure rpc service "add.rpc" is already started

全部啟動:

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端

(后面可以 -f指定不同環(huán)境的xxx.yaml)

調(diào)用add api,新增圖書

curl -i "http://localhost:8888/add?book=Bible&price=10"

使用go-zero快速構(gòu)建微服務(wù),后端

此時看數(shù)據(jù)庫,book表里新增了一行數(shù)據(jù)


調(diào)用check api,檢查某本圖書的價格

curl -i "http://localhost:8888/check?book=Bible"

使用go-zero快速構(gòu)建微服務(wù),后端
使用go-zero快速構(gòu)建微服務(wù),后端

重啟check rpc,再次執(zhí)行curl -i "http://localhost:8888/check?book=Bible"

使用go-zero快速構(gòu)建微服務(wù),后端

完整項目代碼[2]

參考資料

[1]

使用go-zero快速構(gòu)建微服務(wù): http://www.jikejiaocheng.com/c/gozero-microservices.html

[2]

完整項目代碼: https://github.com/cuishuang/bookstore

本文由 mdnice 多平臺發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-640421.html

到了這里,關(guān)于使用go-zero快速構(gòu)建微服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【go-zero】docker鏡像直接部署go-zero的API與RPC服務(wù) 如何實現(xiàn)注冊發(fā)現(xiàn)?docker network 實現(xiàn) go-zero 注冊發(fā)現(xiàn)

    【go-zero】docker鏡像直接部署go-zero的API與RPC服務(wù) 如何實現(xiàn)注冊發(fā)現(xiàn)?docker network 實現(xiàn) go-zero 注冊發(fā)現(xiàn)

    使用docker直接部署go-zero微服務(wù)會發(fā)現(xiàn)API無法找到RPC服務(wù) 用docker直接部署 我們會發(fā)現(xiàn)API無法注冊發(fā)現(xiàn)RPC服務(wù) 原因是我們?nèi)鄙倭薲ocker的network網(wǎng)橋 RPC服務(wù)運行正常 API服務(wù)啟動,通過docker logs 查看日志還是未發(fā)現(xiàn)RPC API的yaml配置 RPC服務(wù)的IP是 127.0.0.1 與對應(yīng)的端口 下圖為改成了定

    2024年02月13日
    瀏覽(27)
  • go-zero的服務(wù)發(fā)現(xiàn)源碼閱讀

    go-zero的服務(wù)發(fā)現(xiàn)源碼閱讀

    服務(wù)發(fā)現(xiàn)原理與grpc源碼解析_wangxiaoangg的博客-CSDN博客 ? go-zero rpc demo官方文檔:rpc編寫與調(diào)用 | go-zero 目錄 一 服務(wù)注冊 1.?創(chuàng)建rpc服務(wù) 2. 啟動rpc服務(wù) 3.?registerEtcd做了什么 4.?discov.NewPublisher 服務(wù)發(fā)布者 二 服務(wù)發(fā)現(xiàn) 1.定義注冊resolver 2.解析etcd地址創(chuàng)建鏈接 3.update方法 在看rp

    2024年02月06日
    瀏覽(16)
  • go-zero的rpc服務(wù)案例解析

    go-zero的rpc服務(wù)案例解析

    go-zero的遠程調(diào)用服務(wù)是基于gRpc的gRPC教程與應(yīng)用。 zero使用使用gRpc需要安裝 protoc 插件,因為gRpc基于protoc插件使用protocol buffers文件生成rpc服務(wù)器和api的代碼的。 gRPC 的代碼生成還依賴 protoc-gen-go,protoc-gen-go-grpc 插件來配合生成 Go 語言的 gRPC 代碼。 也可以使用go get命令安裝

    2024年02月13日
    瀏覽(21)
  • go-zero學習 第三章 微服務(wù)

    go-zero學習 第三章 微服務(wù)

    1.1 API服務(wù)模塊 goctl 使用 api 文件生成 api服務(wù) 命令: 1.2 RPC服務(wù)模塊 goctl 使用 protoc 文件生成 rpc服務(wù) 命令: 注意: --go_out 、 --go-grpc_out 、 --zrpc_out 三者配置的路徑需要完全一致,否則會報下列錯誤。 基礎(chǔ)代碼:已生成基本的API服務(wù)、RPC服務(wù)。 這里以API服務(wù)調(diào)用RPC服務(wù)的登

    2024年02月16日
    瀏覽(21)
  • 【go-zero】go-zero阿里云oss 前端上傳文件到go-zero API服務(wù) 并在k8s pod中創(chuàng)建文件 并推送到阿里云oss 最佳實踐

    問題:在本地通過上傳文件,然后將文件推送到aliyun的oss中,是沒問題的 但是部署到了k8s中,則出現(xiàn)了問題,一直報錯沒有創(chuàng)建的權(quán)限 思路:開始認為應(yīng)該將該文件掛載到configmap中,然后通過這種方式修改了deployment和dockerfile。最終發(fā)現(xiàn)應(yīng)該是go的創(chuàng)建文件路徑方式搞錯了,

    2024年02月13日
    瀏覽(29)
  • 微服務(wù)框架 go-zero logx 日志組件剖析

    微服務(wù)框架 go-zero logx 日志組件剖析

    上一篇我們說到咱們還剩下 addTenant 功能還未實現(xiàn),不知道有沒有兄弟感興趣去實驗一波的,本篇文章進行簡要補充 根據(jù)上一篇文章分析,其實我們只需要執(zhí)行如下幾步即可: 編寫 tenant.api,提供外部 addTenant 的 http 接口 編寫 tenant.api 提供一個 POST http 的接口 / api /tenant/addt

    2024年02月11日
    瀏覽(23)
  • 微服務(wù)架構(gòu)|go-zero 的自適應(yīng)熔斷器

    原文鏈接: go-zero 的自適應(yīng)熔斷器 上篇文章我們介紹了微服務(wù)的限流,詳細分析了計數(shù)器限流和令牌桶限流算法,這篇文章來說說熔斷。 熔斷和限流還不太一樣,限流是控制請求速率,只要還能承受,那么都會處理,但熔斷不是。 在一條調(diào)用鏈上,如果發(fā)現(xiàn)某個服務(wù)異常,

    2024年02月10日
    瀏覽(24)
  • go-zero/grpc的rpc服務(wù)間傳遞額外數(shù)據(jù)

    go-zero/grpc的rpc服務(wù)間傳遞額外數(shù)據(jù) 2024/02/18 客戶端: 初始化 md 也可如下方式: 追加新的如下: 也可使用 md 的 Set 和 Append 方法追加: 服務(wù)端: 注意 key 都會被轉(zhuǎn)為小寫,即使客戶端為大寫: 而且 key 只能由 數(shù)字、字母和三個特殊字符“-_.”組成,大寫字母會自動被轉(zhuǎn)為小寫

    2024年02月19日
    瀏覽(24)
  • GoZero微服務(wù)個人探究之路(二)Go-Zero官方api demo示例探究

    GoZero微服務(wù)個人探究之路(二)Go-Zero官方api demo示例探究

    api demo 代碼生成 | go-zero Documentation 編輯 demo-api.yaml 編輯 服務(wù)名稱:demo-api HOST地址:0.0.0.0監(jiān)聽所有可用網(wǎng)絡(luò)接口 Port地址:服務(wù)運行在8888端口 config/config.go 編輯 存儲config信息,這里rest.RestConf是RESTful API的結(jié)構(gòu)體,此外還可以添加數(shù)據(jù)庫,緩存配置信息 handler/demohandler.go 編輯

    2024年01月18日
    瀏覽(44)
  • GoZero微服務(wù)個人探索之路(三)Go-Zero官方rpc demo示例探究

    GoZero微服務(wù)個人探索之路(三)Go-Zero官方rpc demo示例探究

    兩個文件均為protoc-gen-go-grpc自動生成 構(gòu)成一個完整的 gRPC 服務(wù)的定義和實現(xiàn) demo.go goctl生成的客戶端代碼 Request 和 Response 別名: 定義了 Request 和 Response 兩個別名,實際上是從 demo 包中導入的對應(yīng)的消息類型。 Demo 接口: 定義了一個 Demo 接口,其中包含了調(diào)用 gRPC 服務(wù)中 P

    2024年01月18日
    瀏覽(54)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包