零聲Golang云原生
golang/云原生/Docker/DevOps/K8S/持續(xù)集成/分布式/etcd/ipfs
Go 云原生應用實戰(zhàn):
啟動注冊中心
docker run -d -p 30100:30100 servicecomb/service-center(已報名零聲go 底部評)
初始化Go工程
go mod init github.com/go-chassis/go-chassis-examples/hello
go get github.com/go-chassis/go-chassis/v2
工程目錄規(guī)劃
可以創(chuàng)建一個server(名稱任意)文件夾,這個就是一個微服務(wù)的目錄
mkdir server
目錄結(jié)構(gòu)
servicecomb:
?registry:
? ? address: http://127.0.0.1:30100
?protocols:
? ? rest:
? ? ? listenAddress: 127.0.0.1:9000
最小化配置
在chassis.yaml中涵蓋了幾乎所有的配置,不過想要啟動只需要2個簡單的配置
servicecomb:
?registry:
? ? address: http://127.0.0.1:30100
?protocols:
? ? rest:
? ? ? listenAddress: 127.0.0.1:9000
復制
也就是服務(wù)監(jiān)聽地址和注冊中心地址
在microservice.yaml里定義微服務(wù)信息,只需要一個簡單的微服務(wù)名即可,它還有大量的其他高級特性,我們將后續(xù)在高級特性中介紹
servicecomb:
?service:
? ?name: HelloServer
復制
編寫業(yè)務(wù)邏輯
是時候編寫自己的API了
//通常持有一批API,并定義API Patternstype HelloResource struct {}//業(yè)務(wù)APIfunc (r *HelloResource) SayHi(b *rf.Context) {
b.Write([]byte("hello, go chassis"))
return}//定義所有的API Patterns,用于API路由func (r *HelloResource) URLPatterns() []rf.Route {
return []rf.Route{
{Method: http.MethodGet, Path: "/hello", ResourceFunc: r.SayHi},
}}
復制
之后僅需要注冊即可
chassis.RegisterSchema("rest", &HelloResource{})
復制
啟動服務(wù)
啟動很簡單,只需要編寫如下內(nèi)容
if err := chassis.Init(); err != nil {
openlog.Fatal("Init failed." + err.Error())
return}chassis.Run()
復制
編譯執(zhí)行
go build main.go./main
復制
驗證:訪問UIhttp://127.0.0.1:30103


額外可以看到自動生成的open API文檔


直接訪問服務(wù)
curl http://127.0.0.1:9000/hello
復制
調(diào)用服務(wù)
接著我們需要調(diào)用這個服務(wù)
創(chuàng)建一個新的微服務(wù)
mkdir client
復制
定義微服務(wù)
在chassis.yaml中定義另一個監(jiān)聽地址
servicecomb:
?registry:
? ? ?address: http://127.0.0.1:30100
?protocols:
? ?rest:
? ? ?listenAddress: 127.0.0.1:8000
復制
在microservice.yaml中定義微服務(wù)名
servicecomb:
?service:
? ?name: HelloClient
復制
#編寫客戶端
為了簡單這里只需要簡單的轉(zhuǎn)發(fā)即可,這里給出完整邏輯
type SimpleResource struct {}//在這個方法中,調(diào)用上面編寫的服務(wù)func (r *SimpleResource) SayHi(b *rf.Context) {
req, _ := rest.NewRequest(http.MethodGet, "http://HelloServer/hello", nil)//這里要填寫需要調(diào)用哪個服務(wù),填寫服務(wù)名即可,然后就是他的api路徑
restInvoker := core.NewRestInvoker()//并發(fā)安全,可全局使用
resp, err := restInvoker.ContextDo(context.TODO(), req)//執(zhí)行調(diào)用,這時go chassis介入,執(zhí)行一些列用戶不可見的計算和操作
if err != nil {
log.Println(err)
return
}
b.Write(httputil.ReadBody(resp))//讀出服務(wù)端body體并直接透傳返回
return}func (r *SimpleResource) URLPatterns() []rf.Route {
return []rf.Route{
{Method: http.MethodGet, Path: "/hi", ResourceFunc: r.SayHi},
}}func main() {
chassis.RegisterSchema("rest", &SimpleResource{})
if err := chassis.Init(); err != nil {
openlog.Fatal("Init failed." + err.Error())
return
}
chassis.Run()}
復制
驗證:
go build main.go./main
## 打開另一個終端,執(zhí)行
curl http://127.0.0.1:8000/hi
復制
將返回HelloServer的返回結(jié)果
此時2個微服務(wù)實例應該同時在線