說明
前面的一些記錄都是針對我們的使用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>