Dubbo-go 的網(wǎng)絡(luò)協(xié)議

2022-04-14 10:24 更新

1. 網(wǎng)絡(luò)協(xié)議是什么

對(duì)于 Dubbo-go 微服務(wù)框架,網(wǎng)絡(luò)協(xié)議為遠(yuǎn)程過程調(diào)用中負(fù)責(zé)網(wǎng)絡(luò)通信的模塊,負(fù)責(zé)應(yīng)用層到網(wǎng)絡(luò)層的數(shù)據(jù)序列化、打包、請(qǐng)求發(fā)起、網(wǎng)絡(luò)端口監(jiān)聽等功能。Dubbo-go 為協(xié)議抽象了一套接口如下:

type Protocol interface {
	// Export service for remote invocation
	Export(invoker Invoker) Exporter
	// Refer a remote service
	Refer(url *common.URL) Invoker
	// Destroy will destroy all invoker and exporter, so it only is called once.
	Destroy()
}

該接口包含三個(gè)方法。其中 Export 方法負(fù)責(zé)服務(wù)的暴露過程。入?yún)?invoker 為dubbo 的概念,其封裝了一個(gè)可以被調(diào)用的實(shí)例。在具體網(wǎng)絡(luò)協(xié)議(例如Triple)實(shí)現(xiàn)的 Export 方法中,會(huì)針對(duì)特定的協(xié)議,將封裝有一定邏輯的可調(diào)用實(shí)例 Invoker 以網(wǎng)絡(luò)端口監(jiān)聽的形式暴露給外部服務(wù),來自外部針對(duì)該網(wǎng)絡(luò)端口的請(qǐng)求將會(huì)被 Export 方法開啟的監(jiān)聽協(xié)程獲取,進(jìn)而根據(jù)網(wǎng)絡(luò)協(xié)議進(jìn)行拆解包和反序列化,得到解析后的請(qǐng)求數(shù)據(jù)。

Refer 方法負(fù)責(zé)服務(wù)的引用過程,其入?yún)?url 為 dubbo 框架通用的結(jié)構(gòu),可以描述一個(gè)希望引用的服務(wù),url 參數(shù)中包含了多個(gè)希望引用服務(wù)的參數(shù),例如對(duì)應(yīng)服務(wù)的接口名(interface),版本號(hào)(version),使用協(xié)議(protocol) 等等。在具體網(wǎng)絡(luò)協(xié)議(例如Triple)實(shí)現(xiàn)的 Refer 方法中,會(huì)將特定的網(wǎng)絡(luò)協(xié)議封裝到 Invoker 可調(diào)用實(shí)例的方法中,用戶層發(fā)起的 RPC 調(diào)用即可直接通過返回的 Invoker 對(duì)象,發(fā)起特定協(xié)議的網(wǎng)絡(luò)請(qǐng)求。

Destroy 方法作用為銷毀當(dāng)前暴露的服務(wù),用于服務(wù)下線場(chǎng)景。Dubbo-go 框架有優(yōu)雅下線機(jī)制,可以在服務(wù)進(jìn)程終止前以監(jiān)聽信號(hào)的形式,下線所有已啟動(dòng)的服務(wù)。

2. Dubbo-go 3.0 支持的網(wǎng)絡(luò)協(xié)議

Dubbo-go 3.0 版本支持的網(wǎng)絡(luò)協(xié)議和序列化方式如下:

協(xié)議 協(xié)議名 (用于配置) 序列化方式 默認(rèn)序列化方式
Triple tri pb hessian2 msgpack custome pb
Dubbo dubbbo hessian2 hessian2
gRPC grpc pb pb
jsonRPC jsonrpc json json

3. 如何配置網(wǎng)絡(luò)協(xié)議

在快速開始章節(jié)可以看到,在配置的過程中將 Protocol 設(shè)置為 tri,表明使用 Triple 協(xié)議進(jìn)行服務(wù)暴露和服務(wù)調(diào)用。快速開始章節(jié)使用的配置 API 進(jìn)行配置的寫入,這樣的好處是無需使用配置文件。我們摘取出和網(wǎng)絡(luò)協(xié)議相關(guān)的內(nèi)容進(jìn)行說明。

使用配置 API

  • 客戶端使用配置 API 設(shè)置網(wǎng)絡(luò)協(xié)議
rc := config.NewRootConfigBuilder().
    SetConsumer(config.NewConsumerConfigBuilder().
        AddReference("GreeterClientImpl", config.NewReferenceConfigBuilder().
            SetInterface("org.apache.dubbo.UserProvider").
            SetProtocol("tri"). // set reference protcol to triple
            Build()).
        Build()).
    Build()
  • 服務(wù)端使用配置 API 設(shè)置網(wǎng)絡(luò)協(xié)議
rc := config.NewRootConfigBuilder().
    SetProvider(config.NewProviderConfigBuilder().
        AddService("GreeterProvider", config.NewServiceConfigBuilder().
            SetInterface("org.apache.dubbo.UserProvider").
            SetProtocolIDs("tripleProtocolKey"). // use protocolID 'tripleProtocolKey'
            Build()).
        Build()).
    AddProtocol("tripleProtocolKey", config.NewProtocolConfigBuilder(). // define protocol config with protocolID 'tripleProtocolKey'
        SetName("tri"). // set service protocol to triple
        Build()).
    Build()

使用配置文件

參考 samples/helloworld

  • 客戶端使用配置文件設(shè)置網(wǎng)絡(luò)協(xié)議
dubbo:
  consumer:
    references:
      GreeterClientImpl:
        protocol: tri # set protcol to tri
        interface: com.apache.dubbo.sample.basic.IGreeter 
  • 服務(wù)端使用配置文件設(shè)置網(wǎng)絡(luò)協(xié)議
dubbo:
  protocols:
    triple: # define protcol-id 'triple'
      name: tri # set protcol to tri
      port: 20000 # set port to be listened
  provider:
    services:
      GreeterProvider:
        protocol-ids: triple # use protocol-ids named 'triple'
        interface: com.apache.dubbo.sample.basic.IGreeter

下一


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)