RPC 遠(yuǎn)程調(diào)用的說明
作用:像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法
和直接HTTP調(diào)用的區(qū)別:
- 對(duì)開發(fā)者更透明,減少了很多的溝通成本。
- RPC向遠(yuǎn)程服務(wù)器發(fā)送請(qǐng)求時(shí),未必要使用 HTTP 協(xié)議,比如還可以用 TCP / IP,性能更高(內(nèi)部服務(wù)更適用)。
調(diào)用模型圖示:
?? 注意:在整個(gè)流程中,最終的調(diào)用并不是由注冊(cè)中心來完成的。雖然注冊(cè)中心會(huì)提供信息,但實(shí)際上調(diào)用方需要自己進(jìn)行最后的調(diào)用動(dòng)作。注冊(cè)中心的作用是告訴調(diào)用方提供者的地址等信息,然后調(diào)用方會(huì)根據(jù)這些信息來完成最后的調(diào)用。
-
為什么一定要知道注冊(cè)中心的地址?
因?yàn)榉?wù)提供者需要將自己提供的接口方法告知注冊(cè)中心,所以它必須知道注冊(cè)中心的地址,這樣才能將自己的信息上報(bào)給注冊(cè)中心,所以必須要配置注冊(cè)中心。同樣的道理,消費(fèi)者調(diào)用方也需要知道注冊(cè)中心的地址,以便將注冊(cè)中心的地址配置到項(xiàng)目中。 -
IDL是什么?
IDL(接口定義語言)是一種約定俗成的語言,用于定義接口和數(shù)據(jù)結(jié)構(gòu)的語法。它是一種人為約定的語言,通過這種語法,可以明確地定義接口和數(shù)據(jù)的結(jié)構(gòu),使各方在交流和協(xié)作時(shí)能夠達(dá)成一致。這種約定的語言為不同的系統(tǒng)、平臺(tái)或語言提供了一種統(tǒng)一的描述方式,使得不同環(huán)境下的應(yīng)用程序能夠理解和交互。
Dubbo 框架說明
Dubbo 是一個(gè)開源的高性能、輕量級(jí)的分布式服務(wù)框架,最初由阿里巴巴公司開發(fā)并開源。它提供了分布式服務(wù)治理、通信框架、智能負(fù)載均衡、容錯(cuò)策略等功能,用于幫助開發(fā)者構(gòu)建可擴(kuò)展、高性能、松耦合的分布式應(yīng)用。
Dubbo框架,是目前國內(nèi)非常主流的RPC實(shí)現(xiàn)框架。Dubbo底層用的是Triple協(xié)議:Triple協(xié)議。 —— Dubbo框架官方文檔
當(dāng)前,還有其他類似的框架,比如 GRPC 和 TRPC 等等,這些都是不同的 RPC 遠(yuǎn)程調(diào)用框架,Dubbo 和 GRPC 是比較知名的。
Dubbo 由阿里開發(fā),而 GRPC 是由 Google 開發(fā),TRPC 則是由騰訊開發(fā)。
Dubbo Go 介紹
Dubbo Go(也稱為 dubbo-go)是 Dubbo 框架的 Go 語言版本,是一個(gè)基于 Go 語言開發(fā)的分布式服務(wù)框架,用于構(gòu)建高性能、可擴(kuò)展的分布式應(yīng)用程序。它提供了與原始 Java 版本類似的功能,允許開發(fā)者使用 Go 語言構(gòu)建分布式應(yīng)用程序。dubbo-go 可以與 Java 版本的 Dubbo 框架無縫集成,使得在混合語言環(huán)境中開發(fā)分布式系統(tǒng)更加便捷。
dubbo-go 提供了對(duì) Dubbo 協(xié)議的支持,允許 Go 語言服務(wù)提供者和消費(fèi)者之間進(jìn)行通信,并利用 Dubbo 的治理能力實(shí)現(xiàn)服務(wù)注冊(cè)、發(fā)現(xiàn)、負(fù)載均衡等功能。它也支持多種序列化和網(wǎng)絡(luò)傳輸協(xié)議,以滿足不同場(chǎng)景的需求。
應(yīng)用 Dubbo Go
環(huán)境安裝(Mac 系統(tǒng))
安裝 Go語言環(huán)境
go version >= go 1.15。
【Go 語言官網(wǎng)下載地址】
安裝 序列化工具protoc
- 使用Homebrew安裝protoc:
這將會(huì)安裝 protobuf 和 protoc編譯器。brew install protobuf
- 驗(yàn)證安裝:
如果一切正常,將顯示protoc的版本信息。protoc --version
安裝 dubbogo-cli 以及相關(guān)插件
- 執(zhí)行以下指令安裝dubbogo-cli 至 $GOPATH/bin (控制臺(tái)輸入
go env
可以看到GOPATH目錄所在)$ export GOPROXY="https://goproxy.cn" $ go install github.com/dubbogo/dubbogo-cli@latest $ dubbogo-cli hello
- 安裝依賴的工具插件
dubbogo-cli install all
- 確保上述安裝的工具位于在系統(tǒng)環(huán)境變量?jī)?nèi)
$ protoc --version libprotoc 24.2 $ protoc-gen-go --version protoc-gen-go v1.31.0 $ protoc-gen-go-triple --version protoc-gen-go-triple 1.0.8
? 解決報(bào)錯(cuò):zsh: command not found: protoc-gen-go
,而其他兩個(gè)工具都能正常輸出版本號(hào)信息。
解決:運(yùn)行 brew install protoc-gen-go
直接安裝 protoc-gen-go
運(yùn)行下面命令(For mac)直接安裝 protoc-gen-go,然后再次運(yùn)行 protoc-gen-go --version
檢測(cè)正常了。
brew install protoc-gen-go
完成一次自己定義接口的RPC調(diào)用
這里使用 IDL(接口調(diào)用語言)的方式使用dubbo:創(chuàng)建一個(gè)公共的接口定義文件,服務(wù)提供者和消費(fèi)者讀取這個(gè)文件。優(yōu)點(diǎn)是跨語言。
拉起一個(gè)注冊(cè)中心-Nacos,如果有現(xiàn)成的,本步驟可忽略,這里用docker快速啟動(dòng)一個(gè)nacos
Nacos 官方文檔
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up
? 解決報(bào)錯(cuò):no matching manifest for linux/arm64/v8 in the manifest list entries
原因:如下圖,nacos默認(rèn)不支持在ARM架構(gòu)安裝。只有AMD64版本的。
解決:去 docker hub 上搜索支持ARM架構(gòu)的鏡像。
# 下載鏡像
$ docker pull nacos/nacos-server:v2.1.2-slim
# 查看下載的鏡像
$ docker images
# 創(chuàng)建 docker-compose.yml
$ vim docker-compose.yml
# 啟動(dòng)該鏡像
編寫 docker-compose $ vim docker-compose.yml
version: '2'
services:
nacos:
image: nacos/nacos-server:v2.1.2-slim # 鏡像`nacos/nacos-server:v2.1.2-slim`
container_name: nacos # 容器名為'nacos'
restart: always # 指定容器退出后的重啟策略為始終重啟
volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄
- ./data/nacos/logs:/home/nacos/logs
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MODE: standalone # 單機(jī)模式啟動(dòng)
ports: # 映射端口
- "8848:8848"
cpu_shares: 4
mem_limit: 2048M
啟動(dòng) nacos $ docker compose up
啟動(dòng)成功后,可以看到如下界面:
可以去 nacos 注冊(cè)中心看一下,訪問 http://自己服務(wù)的IP地址:8848/nacos/index.html
默認(rèn)用戶名和密碼都是 nacos
服務(wù)端實(shí)現(xiàn)
1. 創(chuàng)建一個(gè)IDC服務(wù)(服務(wù)端項(xiàng)目), dubbogo-cli newApp xxx
$ dubbogo-cli newApp IDC
$ cd IDC
2. 定義公共接口(只定義,不實(shí)現(xiàn)),api/api.proto 修改后如下:
syntax = "proto3";
package api;
option go_package = "./;api";
service Generator {
rpc GetID (GenReq) returns (GenResp) {}
}
message GenReq {
string appId = 1;
}
message GenResp {
string id = 1;
}
3. 生成代碼 api_triple.pb.go、api.pb.go (通過運(yùn)行 protoc --go_out=. --go-triple_out=. ./api.proto
)
$ cd api
$ protoc --go_out=. --go-triple_out=. ./api.proto
4. 實(shí)現(xiàn)公共接口,pkg/service/service.go 修改后的代碼如下:
type GeneratorServerImpl struct {
api.UnimplementedGeneratorServer
}
func (s *GeneratorServerImpl) GetID(ctx context.Context, in *api.GenReq) (*api.GenResp, error) {
logger.Infof("Dubbo-go GeneratorProvider AppId = %s\n", in.AppId)
uuid, err := uuid.NewV4()
if err != nil {
logger.Infof("Dubbo-go GeneratorProvider get id err = %v\n", err)
return nil, err
}
return &api.GenResp{Id: uuid.String()}, nil
}
func init() {
config.SetProviderService(&GeneratorServerImpl{})
}
5. 編寫 conf/dubbogo.yaml 配置
dubbo:
registries:
nacos:
protocol: nacos
address: 127.0.0.1:8848
protocols:
triple:
name: tri
port: 20000
provider:
services:
GeneratorServerImpl:
interface: "" # read from stub
6. 配置環(huán)境變量DUBBO_GO_CONFIG_PATH
Dubbo-go 并沒有提供直接設(shè)置配置文件路徑的函數(shù)。Dubbo-go 配置文件是通過環(huán)境變量 DUBBO_GO_CONFIG_PATH
或者在啟動(dòng)應(yīng)用程序時(shí)通過命令行參數(shù)傳遞的。
方式1:在控制臺(tái),設(shè)置 DUBBO_GO_CONFIG_PATH 環(huán)境變量
export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml
方式2:在代碼中,使用命令行參數(shù)指定配置文件路徑
將 “path/to/config.yaml” 替換為實(shí)際的配置文件路徑。這樣,你可以在運(yùn)行應(yīng)用程序時(shí)指定不同的配置文件路徑。文章來源地址http://www.zghlxwxcb.cn/news/detail-695858.html
package main
import (
"flag"
"fmt"
"os"
"dubbo.apache.org/dubbo-go/v3/config"
)
func main() {
// 使用flag包來處理命令行參數(shù),將-config參數(shù)用于指定配置文件路徑
configFile := flag.String("config", "path/to/config.yaml", "Path to Dubbo-go config file")
flag.Parse()
// 使用os.Setenv 設(shè)置 DUBBO_GO_CONFIG_PATH 環(huán)境變量
os.Setenv("DUBBO_GO_CONFIG_PATH", *configFile)
// 加載 Dubbo-go 配置
if err := config.Load(); err != nil {
panic(err)
}
// 在這里執(zhí)行你的 Dubbo-go 應(yīng)用程序邏輯
fmt.Println("Dubbo-go 應(yīng)用程序已啟動(dòng)")
}
7. 最后,啟動(dòng)服務(wù)端
go run cmd/app.go
打開nacos的控制臺(tái),可以看到服務(wù)已經(jīng)注冊(cè)
客戶端使用
1. 創(chuàng)建一個(gè)客戶端項(xiàng)目,go mod init 客戶端項(xiàng)目包名
2. 復(fù)制服務(wù)端的api文件夾給客戶端
3. 構(gòu)造客戶端項(xiàng)目,目錄如下:
這里的api 目錄與服務(wù)端的api目錄保持一致。
4. 編寫 cmd/client.go 的客戶端遠(yuǎn)程調(diào)用代碼
var grpcGeneratorImpl = new(api.GeneratorClientImpl)
func main() {
config.SetConsumerService(grpcGeneratorImpl)
if err := config.Load(); err != nil {
panic(err)
}
logger.Info("start to test dubbo")
req := &api.GenReq{
AppId: "laurence",
}
reply, err := grpcGeneratorImpl.GetID(context.Background(), req)
if err != nil {
logger.Error(err)
}
logger.Infof("get id result: %v\n", reply.Id)
}
5. 編寫 conf/dubbogo.yml 配置
dubbo:
registries:
nacos:
protocol: nacos
address: 127.0.0.1:8848
consumer:
references:
GeneratorClientImpl:
protocol: tri
interface: ""
6. 配置環(huán)境變量DUBBO_GO_CONFIG_PATH
Dubbo-go 并沒有提供直接設(shè)置配置文件路徑的函數(shù)。Dubbo-go 配置文件是通過環(huán)境變量 DUBBO_GO_CONFIG_PATH
或者在啟動(dòng)應(yīng)用程序時(shí)通過命令行參數(shù)傳遞的。文章來源:http://www.zghlxwxcb.cn/news/detail-695858.html
方式1:在控制臺(tái),設(shè)置 DUBBO_GO_CONFIG_PATH 環(huán)境變量
export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml
方式2:在代碼中,使用命令行參數(shù)指定配置文件路徑
將 “path/to/config.yaml” 替換為實(shí)際的配置文件路徑。這樣,你可以在運(yùn)行應(yīng)用程序時(shí)指定不同的配置文件路徑。
package main
import (
"flag"
"os"
)
func main() {
// 使用flag包來處理命令行參數(shù),將-config參數(shù)用于指定配置文件路徑
configFile := flag.String("config", "path/to/config.yaml", "Path to Dubbo-go config file")
flag.Parse()
// 使用os.Setenv 設(shè)置 DUBBO_GO_CONFIG_PATH 環(huán)境變量
os.Setenv("DUBBO_GO_CONFIG_PATH", *configFile)
}
7. 最后,運(yùn)行client客戶端
go run cmd/client.go
到了這里,關(guān)于介紹 dubbo-go 并在Mac上安裝,完成一次自己定義的接口RPC調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!