• 介绍 dubbo-go 并在Mac上安装,完成一次自己定义的接口RPC调用


    目录

    RPC 远程调用的说明

    作用:像调用本地方法一样调用远程方法

    和直接HTTP调用的区别:

    1. 对开发者更透明,减少了很多的沟通成本。
    2. RPC向远程服务器发送请求时,未必要使用 HTTP 协议,比如还可以用 TCP / IP,性能更高(内部服务更适用)。

    调用模型图示:

    在这里插入图片描述

    📢 注意:在整个流程中,最终的调用并不是由注册中心来完成的。虽然注册中心会提供信息,但实际上调用方需要自己进行最后的调用动作。注册中心的作用是告诉调用方提供者的地址等信息,然后调用方会根据这些信息来完成最后的调用。

    1. 为什么一定要知道注册中心的地址?
      因为服务提供者需要将自己提供的接口方法告知注册中心,所以它必须知道注册中心的地址,这样才能将自己的信息上报给注册中心,所以必须要配置注册中心。同样的道理,消费者调用方也需要知道注册中心的地址,以便将注册中心的地址配置到项目中。

    2. IDL是什么?
      IDL(接口定义语言)是一种约定俗成的语言,用于定义接口和数据结构的语法。它是一种人为约定的语言,通过这种语法,可以明确地定义接口和数据的结构,使各方在交流和协作时能够达成一致。这种约定的语言为不同的系统、平台或语言提供了一种统一的描述方式,使得不同环境下的应用程序能够理解和交互。

    Dubbo 框架说明

    Dubbo 是一个开源的高性能、轻量级的分布式服务框架,最初由阿里巴巴公司开发并开源。它提供了分布式服务治理、通信框架、智能负载均衡、容错策略等功能,用于帮助开发者构建可扩展、高性能、松耦合的分布式应用。

    Dubbo框架,是目前国内非常主流的RPC实现框架。Dubbo底层用的是Triple协议Triple协议。 —— Dubbo框架官方文档

    当前,还有其他类似的框架,比如 GRPC 和 TRPC 等等,这些都是不同的 RPC 远程调用框架,Dubbo 和 GRPC 是比较知名的。

    Dubbo 由阿里开发,而 GRPC 是由 Google 开发,TRPC 则是由腾讯开发。

    Dubbo Go 介绍

    Dubbo Go(也称为 dubbo-go)是 Dubbo 框架的 Go 语言版本,是一个基于 Go 语言开发的分布式服务框架,用于构建高性能、可扩展的分布式应用程序。它提供了与原始 Java 版本类似的功能,允许开发者使用 Go 语言构建分布式应用程序。dubbo-go 可以与 Java 版本的 Dubbo 框架无缝集成,使得在混合语言环境中开发分布式系统更加便捷。

    dubbo-go 提供了对 Dubbo 协议的支持,允许 Go 语言服务提供者和消费者之间进行通信,并利用 Dubbo 的治理能力实现服务注册、发现、负载均衡等功能。它也支持多种序列化和网络传输协议,以满足不同场景的需求。

    应用 Dubbo Go

    环境安装(Mac 系统)

    安装 Go语言环境

    go version >= go 1.15。
    【Go 语言官网下载地址】

    安装 序列化工具protoc

    1. 使用Homebrew安装protoc:
      brew install protobuf
      
      • 1
      这将会安装 protobuf 和 protoc编译器。
    2. 验证安装:
      protoc --version
      
      • 1
      如果一切正常,将显示protoc的版本信息。

    安装 dubbogo-cli 以及相关插件

    1. 执行以下指令安装dubbogo-cli 至 $GOPATH/bin (控制台输入go env 可以看到GOPATH目录所在)
      $ export GOPROXY="https://goproxy.cn"
      $ go install github.com/dubbogo/dubbogo-cli@latest
      $ dubbogo-cli
      hello
      
      • 1
      • 2
      • 3
      • 4
    2. 安装依赖的工具插件
      dubbogo-cli install all    
      
      • 1
    3. 确保上述安装的工具位于在系统环境变量内
      $ 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    ❎ 解决报错:zsh: command not found: protoc-gen-go,而其他两个工具都能正常输出版本号信息。
    解决:运行 brew install protoc-gen-go 直接安装 protoc-gen-go

    运行下面命令(For mac)直接安装 protoc-gen-go,然后再次运行 protoc-gen-go --version 检测正常了。

    brew install protoc-gen-go
    
    • 1

    完成一次自己定义接口的RPC调用

    这里使用 IDL(接口调用语言)的方式使用dubbo:创建一个公共的接口定义文件,服务提供者和消费者读取这个文件。优点是跨语言。

    拉起一个注册中心-Nacos,如果有现成的,本步骤可忽略,这里用docker快速启动一个nacos

    Nacos 官方文档

    git clone https://github.com/nacos-group/nacos-docker.git
    cd nacos-docker
    docker-compose -f example/standalone-derby.yaml up
    
    • 1
    • 2
    • 3
    ❎ 解决报错:no matching manifest for linux/arm64/v8 in the manifest list entries
    原因:如下图,nacos默认不支持在ARM架构安装。只有AMD64版本的。

    在这里插入图片描述

    解决:去 docker hub 上搜索支持ARM架构的镜像。

    在这里插入图片描述

    # 下载镜像
    $ docker pull nacos/nacos-server:v2.1.2-slim
    # 查看下载的镜像
    $ docker images
    # 创建 docker-compose.yml
    $ vim docker-compose.yml
    # 启动该镜像
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    编写 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:                                                     # 数据卷挂载路径设置,将本机目录映射到容器目录
          - ./data/nacos/logs:/home/nacos/logs
        environment:
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
          MODE: standalone # 单机模式启动
        ports:                              # 映射端口
          - "8848:8848"
        cpu_shares: 4
        mem_limit: 2048M
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    启动 nacos $ docker compose up
    启动成功后,可以看到如下界面:
    在这里插入图片描述
    可以去 nacos 注册中心看一下,访问 http://自己服务的IP地址:8848/nacos/index.html
    默认用户名和密码都是 nacos

    服务端实现

    1. 创建一个IDC服务(服务端项目), dubbogo-cli newApp xxx
    $ dubbogo-cli newApp IDC
    $ cd IDC
    
    • 1
    • 2
    2. 定义公共接口(只定义,不实现),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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    3. 生成代码 api_triple.pb.go、api.pb.go (通过运行 protoc --go_out=. --go-triple_out=. ./api.proto
    $ cd api
    $ protoc --go_out=. --go-triple_out=. ./api.proto
    
    • 1
    • 2
    4. 实现公共接口,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{})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    6. 配置环境变量DUBBO_GO_CONFIG_PATH

    Dubbo-go 并没有提供直接设置配置文件路径的函数。Dubbo-go 配置文件是通过环境变量 DUBBO_GO_CONFIG_PATH 或者在启动应用程序时通过命令行参数传递的。

    方式1:在控制台,设置 DUBBO_GO_CONFIG_PATH 环境变量
    export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml 
    
    • 1
    方式2:在代码中,使用命令行参数指定配置文件路径

    将 “path/to/config.yaml” 替换为实际的配置文件路径。这样,你可以在运行应用程序时指定不同的配置文件路径。

    package main
    
    import (
        "flag"
        "fmt"
        "os"
    
        "dubbo.apache.org/dubbo-go/v3/config"
    )
    
    func main() {
        // 使用flag包来处理命令行参数,将-config参数用于指定配置文件路径
        configFile := flag.String("config", "path/to/config.yaml", "Path to Dubbo-go config file")
        flag.Parse()
    
        // 使用os.Setenv 设置 DUBBO_GO_CONFIG_PATH 环境变量
        os.Setenv("DUBBO_GO_CONFIG_PATH", *configFile)
    
        // 加载 Dubbo-go 配置
        if err := config.Load(); err != nil {
            panic(err)
        }
    
        // 在这里执行你的 Dubbo-go 应用程序逻辑
        fmt.Println("Dubbo-go 应用程序已启动")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    7. 最后,启动服务端
    go run cmd/app.go  
    
    • 1

    打开nacos的控制台,可以看到服务已经注册
    在这里插入图片描述

    客户端使用

    1. 创建一个客户端项目,go mod init 客户端项目包名
    2. 复制服务端的api文件夹给客户端
    3. 构造客户端项目,目录如下:

    在这里插入图片描述
    这里的api 目录与服务端的api目录保持一致。

    4. 编写 cmd/client.go 的客户端远程调用代码
    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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    5. 编写 conf/dubbogo.yml 配置
    dubbo:
      registries:
        nacos:
          protocol: nacos
          address: 127.0.0.1:8848
      consumer:
        references:
          GeneratorClientImpl:
            protocol: tri
            interface: ""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    6. 配置环境变量DUBBO_GO_CONFIG_PATH

    Dubbo-go 并没有提供直接设置配置文件路径的函数。Dubbo-go 配置文件是通过环境变量 DUBBO_GO_CONFIG_PATH 或者在启动应用程序时通过命令行参数传递的。

    方式1:在控制台,设置 DUBBO_GO_CONFIG_PATH 环境变量
    export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml 
    
    • 1
    方式2:在代码中,使用命令行参数指定配置文件路径

    将 “path/to/config.yaml” 替换为实际的配置文件路径。这样,你可以在运行应用程序时指定不同的配置文件路径。

    package main
    
    import (
        "flag"
        "os"
    )
    
    func main() {
        // 使用flag包来处理命令行参数,将-config参数用于指定配置文件路径
        configFile := flag.String("config", "path/to/config.yaml", "Path to Dubbo-go config file")
        flag.Parse()
    
        // 使用os.Setenv 设置 DUBBO_GO_CONFIG_PATH 环境变量
        os.Setenv("DUBBO_GO_CONFIG_PATH", *configFile)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    7. 最后,运行client客户端
    go run cmd/client.go
    
    • 1
  • 相关阅读:
    如何将CAD的内置对话框作为当前对话框的子对话框调出
    模仿Spring注入接口的代理类全过程
    Python利用pandas获取每行最大值和最小值
    web网页设计期末课程大作业:美食餐饮文化主题网站设计——HTML+CSS+JavaScript美食餐厅网站设计与实现 11页面
    java后端研发经典面试题总结四
    Maven IntelliJ
    自定义类型转换函数operator MyInt()
    感恩节,感谢2022的转变,有在好好生活!
    spring知识巩固
    淘宝/天猫api 添加收货地址 API接口
  • 原文地址:https://blog.csdn.net/trinityleo5/article/details/132622712