監聽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(register引數的配置conf.schema,
conf.servername, //knowing
conf.serveraddress,
client3, //etcd3的client
)
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作為介面定義語...