GO 微服務GO-Micro(9)-純個人學習筆記記錄:手寫一個新的微服務示例

說明

前面的一些記錄都是針對我們的使用micro new 創建出來微服務示例模板,后續我們的微服務的編寫,會根據自身的實際的情況進行微服務手動的創建。因為有必要的手動創建一個試一試。

步驟

原來項目結構:


image.png
1) 新建一個微服務的文件夾初始化模塊

新建一個文件夾doigreeter,cd 進入doigreeter, 然后執行命令行:

D:\code\go\Mi_Onse\doigreeter>go mod init doigreeter
go: creating new go.mod: module doigreeter

D:\code\go\Mi_Onse\doigreeter>

image.png
2) 規劃proto文件的存放
D:\code\go\Mi_Onse\doigreeter>mkdir proto

D:\code\go\Mi_Onse\doigreeter>cd proto

D:\code\go\Mi_Onse\doigreeter\proto>mkdir pb

D:\code\go\Mi_Onse\doigreeter\proto>mkdir pbfile

D:\code\go\Mi_Onse\doigreeter\proto>

image.png
3) 編寫proto文件內容
syntax = "proto3";

package pb;

//生成go文件的包路徑------注意這個目錄文件,只讀的是生產的文件的存放位置
option go_package = "proto/pb";

// 定義微服務對外提供的接口
service DoiGreeter {

  rpc RunSay(Request) returns (Response) {}
}

// 請求
message Request {
  string name = 1;
}

// 響應
message Response {
  string msg = 1;
}



4) 生成對應的bp.go 和pb.micro.go文件
D:\code\go\Mi_Onse\doigreeter>protoc --proto_path=. --micro_out=. --go_out=. proto/pbfile/dpigreeter.proto
D:\code\go\Mi_Onse\doigreeter>protoc --proto_path=. --micro_out=. --go_out=. proto/pbfile/dpigreeter.proto
D:\code\go\Mi_Onse\doigreeter>protoc --proto_path=. --micro_out=. --go_out=. proto/pbfile/dpigreeter.proto
D:\code\go\Mi_Onse\doigreeter>protoc --proto_path=. --micro_out=. --go_out=. proto/pbfile/dpigreeter.proto

D:\code\go\Mi_Onse\doigreeter>
image.png

XXXXX這些紅色提示可以暫時忽略不管!


image.png
5) 編寫微服務main文件

因為是新的模塊,我們好像還是需要重新拉一個依賴

D:\code\go\Mi_Onse\doigreeter>go get github.com/micro/go-micro/v2

編寫main文件:

  • 1:定義一個服務實例的結構體,然后改結構體實現我們之前protoc 生產的協議接口中定義接口(方法)
  • 2 :注意需要加載相關依賴go get github.com/micro/go-micro/v2(之后,發送紅色XXXXX沒了)
  • 3 :創建一個micro.NewService 對象,且傳相關的參數信息,如服務名和版本等信息(服務名不能重名喲?。┣疫M行初始化Init()
  • 4 :將實現了協議接口的結構體進行RegisterGreeterHandler注冊;
  • 5 :運行服務(可能有時候,此過程可能會自動去處理上面出現紅色XXXXXX)
package main

import (
    "context"
    "doigreeter/proto/pb"
    "fmt"
    "github.com/micro/go-micro/v2"
)

//定義一個服務的結構體
type DoiGreeter struct {}

//定義一個方法,該方法實現對應的接口
func (g *DoiGreeter) RunSay(ctx context.Context, req *pb.Request, rsp *pb.Response) error  {
    //把客戶端的請求回射給客戶端
    rsp.Msg = req.Name
    return nil
}


func main() {

    // 新創建一個服務,服務名為greeter,服務注冊中心會用這個名字來發現服務
    service := micro.NewService(
        micro.Name("doigreeter"),
        micro.Version("1.0.0"),
    )
    // 初始化
    service.Init()
    // 注冊處理器
    _ =pb.RegisterDoiGreeterHandler(service.Server(), new(DoiGreeter))

    // 啟動服務運行
    if err := service.Run(); err != nil {
        fmt.Println(err)
    }
}
6) 啟動我們的編寫微服務的情況,在doigreeter目錄下:
D:\code\go\Mi_Onse\doigreeter>go run main.go
2021-01-21 16:01:07  file=v2@v2.9.1/service.go:200 level=info Starting [service] doigreeter
2021-01-21 16:01:07  file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:61227
2021-01-21 16:01:07  file=grpc/grpc.go:697 level=info Registry [mdns] Registering node: doigreeter-744e66fc-6940-401f-a273-10e5bdeb587d

7) 查看當前所有的服務列表,在doigreeter目錄下:
D:\code\go\Mi_Onse>micro list services
doigreeter(新建的服務)
go.micro.service.greeter(new出來的示例服務)
micro.http.broker

D:\code\go\Mi_Onse>
8) 編寫請求doigreeter服務的客戶端示例 且運行:
image.png
package main


import (
    "context"
    "doigreeter/proto/pb"
    "fmt"
    "github.com/micro/go-micro/v2"

)

func main() {

    // 創建一個服務(名字區別于我們的服務端名字)
    service := micro.NewService(micro.Name("doigreeter.client"))
    // 初始化
    service.Init()
    // 創建一個微服務的客戶端
    greeter := pb.NewDoiGreeterService("doigreeter", service.Client())
    // 調用微服務
    rsp, err := greeter.RunSay(context.TODO(), &pb.Request{Name: "XXXX XIAOZHONGTONGXUE"})
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(rsp.Msg)
}

運行客戶端:

D:\code\go\Mi_Onse\doigreeter>go run doigreeter_cli.go
XXXX XIAOZHONGTONGXUE

D:\code\go\Mi_Onse\doigreeter>

9) 使用API網關來代理訪問:

(1)查看手動編寫的服務詳情:

D:\code\go\Mi_Onse\greeter>micro get service  doigreeter
service  doigreeter

version 1.0.0

ID      Address Metadata
doigreeter-3c795c6e-1994-4b41-bacf-aa2e5afb152e 192.168.1.213:62052     server=grpc,transport=grpc,broker=http,protocol=grpc,registry=mdns

Endpoint: DoiGreeter.RunSay

Request: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        name string
}

Response: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        msg string
}


D:\code\go\Mi_Onse\greeter>

(2)啟動API網關:

D:\code\go\Mi_Onse> micro api --namespace=go.micro --type=service
2021-01-21 16:14:16  file=api/api.go:285 level=info service=api Registering API Default Handler at /
2021-01-21 16:14:16  file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2021-01-21 16:14:16  file=v2@v2.9.1/service.go:200 level=info service=api Starting [service] go.micro.api
2021-01-21 16:14:16  file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:62030
2021-01-21 16:14:17  file=grpc/grpc.go:697 level=info service=api Registry [mdns] Registering node: go.micro.api-0a0b67de-3a9f-48c1-8c39-6028dcffb1ff
::1 - - [21/Jan/2021:16:15:14 +0800] "GET /doigreeter/runsay HTTP/1.1" 500 98 "" "PostmanRuntime/7.26.8"

(3)查看先用啟動所有服務列表:

D:\code\go\Mi_Onse>micro list services
doigreeter
go.micro.api

D:\code\go\Mi_Onse>

(4)Postman訪問

http://localhost:8080/doigreeter/doigreeter/runsay
image.png

訪問不到我們,應該姿勢不對!

修改我們的服務啟動的是設置服務名稱:


image.png

重新再啟動服務,查看最新修改后服務列表:

D:\code\go\Mi_Onse>micro list services
go.micro.api
go.micro.service.doigreeter

D:\code\go\Mi_Onse>

再訪問我們的

http://localhost:8080/doigreeter/doigreeter/runsay
image.png

問題分析 查看我們的new微服務的示例:

D:\code\go\Mi_Onse>micro call go.micro.service.greeter greeter.call
error calling go.micro.service.greeter.greeter.call: {"id":"go.micro.client","code":500,"detail":"unknown service greeter","status":"Internal Server Error"}
image.png

使用命令行形式調用:

D:\code\go\Mi_Onse>micro call go.micro.service.greeter greeter.call
error calling go.micro.service.greeter.greeter.call: {"id":"go.micro.client","code":500,"detail":"unknown service greeter","status":"Internal Server Error"}

D:\code\go\Mi_Onse>micro call go.micro.service.doigreeter Doigreeter.runsay
error calling go.micro.service.doigreeter.Doigreeter.runsay: {"id":"go.micro.client","code":500,"detail":"unknown service Doigreeter","status":"Internal Server Error"}

D:\code\go\Mi_Onse>micro call go.micro.service.doigreeter Doigreeter.runSay
error calling go.micro.service.doigreeter.Doigreeter.runSay: {"id":"go.micro.client","code":500,"detail":"unknown service Doigreeter","status":"Internal Server Error"}

D:\code\go\Mi_Onse>micro call go.micro.service.doigreeter Doigreeter.RunSay
error calling go.micro.service.doigreeter.Doigreeter.RunSay: {"id":"go.micro.client","code":500,"detail":"unknown service Doigreeter","status":"Internal Server Error"}

D:\code\go\Mi_Onse>micro call go.micro.service.greeter Greeter.call
error calling go.micro.service.greeter.Greeter.call: {"id":"go.micro.client","code":500,"detail":"unknown service Greeter.call","status":"Internal Server Error"}

D:\code\go\Mi_Onse>

奇怪new也出現錯誤:
再次重新啟動網關API ,又好了!!!可能是我們的修改了什么需要重啟?。。?!

D:\code\go\Mi_Onse> micro api --namespace=go.micro --type=service
2021-01-21 16:46:35  file=api/api.go:285 level=info service=api Registering API Default Handler at /
2021-01-21 16:46:35  file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2021-01-21 16:46:35  file=v2@v2.9.1/service.go:200 level=info service=api Starting [service] go.micro.api
2021-01-21 16:46:35  file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:64066
2021-01-21 16:46:35  file=grpc/grpc.go:697 level=info service=api Registry [mdns] Registering node: go.micro.api-0f3c307f-be98-484b-8c61-dbc88275b44a

image.png
image.png

此時再去postman再訪問?卻濤聲依舊?。。?!

image.png

一個代碼訪問(估計沒修改訪問的服務):

D:\code\go\Mi_Onse\doigreeter>go run doigreeter_cli.go
{"id":"go.micro.client","code":500,"detail":"service doigreeter: not found","status":"Internal Server Error"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x28 pc=0xef6804]
image.png
image.png

臥槽最后這樣可以:所以確定了 最終需要這樣才能訪問?。。。。〉菫樯秐ew出來默認全部小寫了吶?????

http://localhost:8080/doigreeter/DoiGreeter/RunSay
image.png
  • POSTMAN請求傳遞參數傳遞大小寫問題:
image.png
image.png

分析兩個服務的不同:

  • go.micro.service.greeter
D:\code\go\Mi_Onse>micro get service go.micro.service.greeter
service  go.micro.service.greeter

version latest

ID      Address Metadata
go.micro.service.greeter-52924ad0-5302-4d9d-8b2c-ea92c97a2d10   192.168.1.213:63439     broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc

Endpoint: Greeter.Call

Request: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        name string
}

Response: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        msg string
}

  • go.micro.service.doigreeter
D:\code\go\Mi_Onse>micro get service go.micro.service.doigreeter
service  go.micro.service.doigreeter

version 1.0.0

ID      Address Metadata
go.micro.service.doigreeter-41ad5768-0f7d-4f75-9e8e-328198f46192        192.168.1.213:62729     broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc

Endpoint: DoiGreeter.RunSay

Request: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        name string
}

Response: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        msg string
}


D:\code\go\Mi_Onse>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容