go微服務系列之一

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。如何編寫一個微服務?這裡用的是go的微服務架構go micro,具體的情況可以查閱:http://btfak.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1/2016/03/28/go-micro/這裡給出的是開發一個微服務的步驟(如果想直接查閱源碼或者通過demo學習的,可以訪問[ricoder_demo](https://gitee.com/xi_fan/ricoder_demo)。):1、書寫proto檔案,定義函數等具體實現:```protobufsyntax = "proto3";package pb;service UserService { //增 rpc InsertUser (InsertUserReq) returns (InsertUserRep){} //刪 rpc DeletetUser (DeletetUserReq) returns (DeletetUserRep){} //查 rpc SelectUser(SelectUserReq)returns (SelectUserRep){} //改 rpc ModifyUser(ModifyUserReq)returns (ModifyUserRep){}}message User{ int32 id = 1 ; string name = 2; string Address = 3; string Phone = 4;}message ModifyUserReq { int32 id = 1 ; string name = 2; string Address = 3; string Phone = 4;}message ModifyUserRep {}message SelectUserReq { int32 id = 1 ;}message SelectUserRep { User users = 1;}message DeletetUserReq { int32 id = 1 ;}message DeletetUserRep {}message InsertUserReq { int32 id = 1 ; string name = 2; string Address = 3; string Phone = 4;}message InsertUserRep { int32 id = 1 ; string name = 2; string Address = 3; string Phone = 4;}```2、採用代碼產生工具產生user.pb.go檔案,產生協議具體可以查看 https://github.com/micro/go-micro ,這裡我自己寫了個指令檔 build_proto.sh ,自動將指定檔案夾下的proto檔案產生相應的協議,具體代碼如下:```bash#!/usr/bin/env bashprotoc --proto_path=./proto --go_out=plugins=micro:./src/share/pb ./proto/*.proto```可以對代碼進行自訂修改 ... .... ...運行 build_proto.sh 檔案後可以看到在指定檔案夾下產生了相應的 user.pb.go 檔案,在我這裡如:![Screenshot from 2017-10-11 17-09-09.png](http://upload-images.jianshu.io/upload_images/3365849-a5ddf7ce5fd38070.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)3、書寫一個handler實現user.pb.go定義的介面具體實現:1)先建立一個user.go檔案2)定義一個結構體,命名為UserHandler,實現user.proto檔案所有定義的service,在這裡要注意一點,即使是暫時沒有實現好業務,也有給個空實現,代碼如下:```gopackage handlerimport("mewe_job/GoMicroDemo/src/share/pb""golang.org/x/net/context")type UserHandler struct {}// new一個UserHandlerfunc NewUserHandler() *UserHandler{return &UserHandler{}}// 增func (c *UserHandler) InsertUser(ctx context.Context, req * pb.InsertUserReq,rsp *pb.InsertUserRep)error {return nil}// 刪func (c *UserHandler) DeletetUser(ctx context.Context, req * pb.DeletetUserReq,rsp *pb.DeletetUserRep)error {return nil}// 查func (c *UserHandler) SelectUser(ctx context.Context, req * pb.SelectUserReq,rsp *pb.SelectUserRep)error {return nil}//改func (c *UserHandler) ModifyUser(ctx context.Context, req * pb.ModifyUserReq,rsp *pb.ModifyUserRep)error {return nil}```4、將handler註冊進微服務,這一步在main中實現具體實現:```gopackage mainimport ("github.com/micro/cli""mewe_job/GoMicroDemo/src/share/pb""github.com/micro/go-micro/server""mewe_job/GoMicroDemo/src/user-srv/handler""github.com/micro/go-micro""log""mewe_job/GoMicroDemo/src/user-srv/db""mewe_job/GoMicroDemo/src/share/config")func main() {// 建立Service,並定義一些參數service := micro.NewService(micro.Name("go.micro.srv.user"),micro.Version("latest"),)// 定義Service動作操作service.Init(micro.Action(func(c *cli.Context) {log.Println("micro.Action test ...")// 先註冊dbdb.Init(config.MysqlDSN)pb.RegisterUserServiceHandler(service.Server(), handler.NewUserHandler(), server.InternalHandler(true))}),micro.AfterStop(func() error {log.Println("micro.AfterStop test ...")return nil}),micro.AfterStart(func() error {log.Println("micro.AfterStart test ...")return nil}),)log.Println("啟動user-srv服務 ...")//啟動serviceif err := service.Run(); err != nil {log.Panic("user-srv服務啟動失敗 ...")}}```這段代碼主要的點有:- 建立service,通過以下代碼可以初始化一個名叫 go.micro.srv.user 的微服務 ```go // 建立Service,並定義一些參數 service := micro.NewService( micro.Name("go.micro.srv.user"), micro.Version("latest"), ) ```- 註冊db串連和給go.micro.srv.user這個微服務綁定handler,雖然目前我還沒有在db中定義db層的操作```godb.Init(config.MysqlDSN)pb.RegisterUserServiceHandler(service.Server(), handler.NewUserHandler(), server.InternalHandler(true))```- 啟動service,通過Run開啟```goif err := service.Run(); err != nil {log.Panic("user-srv服務啟動失敗 ...")}```5、現在就可以通過 go run main.go --registry=mdns 啟動該服務了,之所以攜帶 --registry=mdns 是因為我本地ubuntu系統沒有安裝consul實現服務發現,所以就採用了gomicro官方推薦的方法。![Screenshot from 2017-10-11 17-42-03.png](http://upload-images.jianshu.io/upload_images/3365849-33f56af2c4e93f67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)6、到這一步用戶端還無法訪問到服務,需要做些處理,我這裡是加了個web服務,再將用戶端的請求進行轉寄,main函數實現如下:```gofunc main() {/*方案一: mux := http.NewServeMux()mux.HandleFunc("/", handleRPC)log.Println("Listen on :8082")http.ListenAndServe(":8082", mux)*//* 方案二 */service := web.NewService(web.Name(config.ServicePrefix+".web"),)service.HandleFunc("/", handleRPC)if err := service.Init(); err != nil {log.Fatal(err)}if err := service.Run(); err != nil {log.Fatal(err)}}```這裡主要的函數是handleRPC這個函數,由於代碼量偏多,具體實現可以查看源碼。這裡如果使用consul實現了服務發現,也可以通過方案一進行實現,這樣的話web服務的連接埠還是固定的。7、開啟web服務```go$ go run web.go --registry=mdnsListening on [::]:36859```8、到這一步用戶端就可以通過web服務連接埠和介面以及參數訪問user這個微服務了,訪問連結:(這裡安利postman,一個Google的外掛程式,超級好用 ... )```gohttp://127.0.0.1:36859/user/selectUser```tip:該項目的源碼(包含資料庫的增刪查改的demo)可以查看 [原始碼](https://gitee.com/xi_fan/ricoder_demo)767 次點擊  ∙  2 贊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.