grpc框架分析一 Server分析

2021-09-24 16:46:13 字數 3446 閱讀 9019

監聽tcp埠

生成乙個*grpc.server物件, 

把*grpc.server物件和 實現userserviceserver介面的例項繫結起來

啟動grpc伺服器

func main() 

log.println("userservice to listen:9000 success")

grpcserver := grpc.newserver()

protofiles_hello.registeruserserviceserver(grpcserver,&impl.userservice{})

grpcserver.serve(lis)

}

主要函式,  conf是乙個配置檔案  endpoints是etcd的伺服器位址,如果有多個集群可以使用,往後面追加位址

func server(count int) ,

schema: "www.vector.com",

servername: "knowing",

endpoints: string,

serveraddress: ":20001",

} demo := ®ionhandlerserver

rpcserver, err := grpcx.mustnewgrpcxserver(conf, func(server *grpc.server) )

if err != nil

log.fatal(rpcserver.run())

}

grpc.mustnewgrpcxsserver函式

clientv3.new是生成乙個etcd的client物件,

conf.serveraddress是":20001", findlocaladdress是返回客戶端的內網ip,

strings.join是把address切片,用colon結合起來,就是 example: 192.168.1.2:20001  ,在賦值給conf.serveraddress引數

grpcxservicefunc是

func(server *grpc.server)
grpcxserver的register引數
register: register.newregister(

conf.schema,

conf.servername, //knowing

conf.serveraddress,

client3, //etcd3的client

)

register引數的配置 

func newregister(

schema string,

servername string,

serveraddress string,

client3 *clientv3.client,

) *register

}

func mustnewgrpcxserver(conf *config.serviceconf, rpcservicefunc grpcxservicefunc) (*grpcxserver, error) )

if nil != err

address := strings.split(conf.serveraddress, colon)

if len(address) == 1

if strings.trimspace(address[0]) == ""

conf.serveraddress = strings.join(address, colon)

return &grpcxserver, nil

}

run函式就是常規的啟動grpc伺服器 

s.register.getserveraddress   =   192.168.1.2:20001

og4g.infoformat是列印出ectd的key和  name 和rpc的伺服器監聽埠資訊

s.register.register看下面介紹

gprc.newserver ,然後執行s.rpcservicefunc函式,s.rpcservicefunc實際就是proto.registerregionhandlerserver(server, ®ionhandlerserver)    進行了常規的 rpc伺服器啟動操作

s.deadnotify看下面介紹

func (s *grpcxserver) run(serveroptions ...grpc.serveroption) error 

log4g.infoformat(

"serveraddress [%s] of %s rpc server has started and full key [%s]",

s.register.getserveraddress(),

s.register.getservername(),

s.register.getfulladdress(),

) if err := s.register.register(); err != nil

server := grpc.newserver(serveroptions...)

s.rpcservicefunc(server)

s.deadnotify()

if err := server.serve(listen); nil != err

return nil

}

s.register.register()函式  (主要作用就是把rpc伺服器節點資訊寫入到etcd伺服器中)

ticker 的用處是間隔r.interval (在newregister的時候賦值為3秒鐘),執行一次for迴圈

goroutine的函式是從etcd伺服器中讀取節點資訊, 如果 getresp.count = 0表示沒有節點資訊

就進入withalive 函式,把節點資訊加入到etcd伺服器中,然後keepalived進行包活操作

func (r *register) register() error  else if getresp.count == 0 

}//這個select是阻塞退出迴圈的作用 意思是3秒執行一次

select

} }()

return nil

}

<-ch這裡會阻塞,如果程式退出就會執行log4g.infoformat函式, ch阻塞的之後他本身的log4g也是阻塞的,

不阻塞後,則會進行etcd的反註冊流程,列印伺服器資訊

func (s *grpcxserver) deadnotify() 

os.exit(1) //

}()return

}

到這裡整個server就正常執行起來了

server和client通過grpc建立連線

一 檔案結構 server端和client端分布在兩個不同的集群裡,可以通過下發mq訊息,或者grpc連線傳遞訊息,這裡介紹通過grpc建立連線,第一步是建立proto檔案,要傳遞的方法和變數都在這裡定義 senddata data.proto log 二 建立data.proto檔案 注意,如果s...

golang 網路框架之 grpc

grpc 是 google 開源的一款網路框架,具有極好的效能,可能是目前效能最好的網路框架,支援流式 rpc,可以很方便地構建訊息訂閱發布系統,支援幾乎所有主流的語言,使用上面也很簡單,公司很多服務基於 grpc 框架構建,執行非常穩定 開始之前首先你要知道網路框架為你做了哪些事情 網路協議序列化...

Go語言 gRPC框架使用

上節課已經學習了grpc基本知識,對grpc有了初步的認識。本節課通過程式設計實現grpc程式設計。我們想要實現的是通過grpc框架進行遠端服務呼叫,首先第一步應該是要有服務。利用之前所掌握的內容,grpc框架支援對服務的定義和生成。grpc框架預設使用protocol buffers作為介面定義語...