Dubbo Golang快速开发Rpc服务

embedded/2024/11/26 3:18:38/

开发 RPC Server & RPC Client

基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Go SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。

本示例演示了基于 Triple 协议的 RPC 通信模式,示例使用 Protocol Buffer 定义 RPC 服务,并演示了代码生成、服务发布和服务访问等过程。

前置条件

因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 protocprotoc-gen-goprotoc-gen-go-triple

  1. 安装 protoc

    查看 Protocol Buffer Compiler 安装指南

  2. 安装 protoc 插件

    接下来,我们安装插件 protoc-gen-goprotoc-gen-go-triple

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install dubbo.apache.org/dubbo-go/v3/cmd/protoc-gen-go-triple@v3.0.1
    

    确保 protoc-gen-goprotoc-gen-go-triple 在你的 PATH 中。这可以通过 which protoc-gen-go 验证,如果该命令不能正常工作的话,请执行以下命令:

    [ -n "$(go env GOBIN)" ] && export PATH="$(go env GOBIN):${PATH}"
    [ -n "$(go env GOPATH)" ] && export PATH="$(go env GOPATH)/bin:${PATH}"
    

快速运行示例

下载示例源码

我们在 apache/dubbo-go-samples 仓库维护了一系列 dubbo-go 使用示例,用来帮助用户快速学习 dubbo-go 使用方式。

你可以 下载示例zip包并解压,或者克隆仓库:

$ git clone --depth 1 https://github.com/apache/dubbo-go-samples

切换到快速开始示例目录:

$ cd dubbo-go-samples/helloworld

运行 server

在 go-server/cmd 目录:

运行以下命令,启动 server:

$ go run server.go

使用 cURL 验证 server 已经正常启动:

$ curl \--header "Content-Type: application/json" \--data '{"name": "Dubbo"}' \http://localhost:20000/greet.GreetService/GreetGreeting: Hello world

运行 client

打开一个新的 terminal,运行以下命令,在 go-client/cmd 目录运行以下命令,启动 client

$ go run client.goGreeting: Hello world

以上就是一个完整的 dubbo-go RPC 通信服务开发过程。

源码讲解

接下来,我们将对 dubbo-go-samples/helloworld 示例进行源码层面的讲解。

定义服务

示例使用 Protocol Buffer (IDL) 来定义 Dubbo 服务。

syntax = "proto3";package greet;
option go_package = "github.com/apache/dubbo-go-samples/helloworld/proto;greet";message GreetRequest {string name = 1;
}message GreetResponse {string greeting = 1;
}service GreetService {rpc Greet(GreetRequest) returns (GreetResponse) {}
}

这个文件声明了一个叫做 GreetService 的服务,为这个服务定义了 Greet 方法以及它的请求参数 GreetRequest 和返回值 GreetResponse。

生成代码

在运行 server 或者 client 之前,我们需要使用 protoc-gen-goprotoc-gen-go-triple 生成相关的代码

protoc --go_out=. --go_opt=paths=source_relative \--go-triple_out=. --go-triple_opt=paths=source_relative \./greet.proto

运行以上命令后,在目标目录中看到以下生成的文件:

 proto├── greet.pb.go├── greet.proto└── greet.triple.go

在 proto/greet/v1 包下有两部分内容:

  • greet.pb.go 是由谷歌标准的 protoc-gen-go生成,它包含 GreetRequestGreetResponse 结构体和响应的编解码规则。
  • greet.triple.go 是由 Dubbo 自定义的插件protoc-gen-go-triple成,其中关键的信息包括生成的接口 GreetService、构造器等。

实现服务

接下来我们就需要添加业务逻辑了,实现 greet.GreetService 接口即可。

type GreetTripleServer struct {
}func (srv *GreetTripleServer) Greet(ctx context.Context, req *greet.GreetRequest) (*greet.GreetResponse, error) {resp := &greet.GreetResponse{Greeting: req.Name}return resp, nil
}

启动 Server

创建一个新的 Server,把我们上一步中实现的 GreeterServer注册给它,接下来就可以直接初始化和启动 Server 了,它将在指定的端口接收请求。

func main() {srv, err := server.NewServer(server.WithServerProtocol(protocol.WithPort(20000),protocol.WithTriple(),),)if err != nil {panic(err)}if err := greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{}); err != nil {panic(err)}if err := srv.Serve(); err != nil {logger.Error(err)}
}

访问服务

最简单方式是使用 HTTP/1.1 POST 请求访问服务,参数则作以标准 JSON 格式作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例:

curl \--header "Content-Type: application/json" \--data '{"name": "Dubbo"}' \http://localhost:20000/greet.GreetService/Greet

也可以使用 Dubbo client 请求服务,我们首先需要从生成代码即 greet 包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起 RPC 调用了。

func main() {cli, err := client.NewClient(client.WithClientURL("127.0.0.1:20000"),)if err != nil {panic(err)}svc, err := greet.NewGreetService(cli)if err != nil {panic(err)}resp, err := svc.Greet(context.Background(), &greet.GreetRequest{Name: "hello world"})if err != nil {logger.Error(err)}logger.Infof("Greet response: %s", resp.Greeting)
}

以上即是 dubbo-go rpc 的基本工作原理!

 


http://www.ppmy.cn/embedded/140534.html

相关文章

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体,也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎* 描述:* # Author : geovindu,Geovin Du 涂…

数据结构哈希表-(开放地址法+二次探测法解决哈希冲突)(创建+删除+插入)+(C语言代码)

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define M 20 #define NULLDEL -1 #define DELDEY -2typedef struct {int key;int count; }HashTable;//创建和插入 void Insert(HashTable ha[], int m, int p, int key) {int i, HO, HI;HO key…

微服务系列概览

分布式和微服务的区别是什么&#xff1f; 分布式是把一个集中式系统拆分成多个系统&#xff0c;每一个系统单独对外提供部分功能&#xff0c;整个分布式系统整体对外提供一整套服务。对于访问分布式系统的用户来说&#xff0c;感知上就像访问一台计算机一样。 而分布式架构的…

Elasticsearch面试内容整理-安全与权限管理

在 Elasticsearch 中,安全与权限管理至关重要,特别是当系统处理敏感数据时。Elasticsearch 提供了一套全面的安全机制来确保数据的机密性、完整性和可用性。以下是 Elasticsearch 安全与权限管理的详细介绍。 安全组件概述 Elasticsearch 的安全功能由 Elastic Stack 提供的一…

C#开发最快的浏览器,打造极速浏览体验

在现代软件开发中&#xff0c;浏览器已成为我们日常生活中不可或缺的一部分。对于C#开发者来说&#xff0c;使用C#开发一个快速且功能齐全的浏览器是一个挑战&#xff0c;但也是一个展示技术实力的机会。本文将介绍如何使用C#和CefSharp库开发一个高性能的浏览器&#xff0c;以…

高可用系统建设指南

高可用系统建设指南 1. 容错设计 1.1 故障隔离 1.1.1 隔离层级与实战案例 a) 进程隔离 独立部署的服务进程进程级别的资源限制JVM参数优化示例&#xff1a; # JVM内存与GC配置 JAVA_OPTS"-Xms4g -Xmx4g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:HeapDumpOnOutOfMem…

修复HIve表乱码问题

修改数据库编码 # 修改已存在的hive元数据库&#xff0c;字符编码格式为utf8mb4 mysql> alter database hive character set utf8mb4; # 进入hive元数据库 mysql> use hive;# 查看元数据库字符编码格式 mysql> show variables like character_set_database; 修改…

单片机电路基本知识

单片机电路基本知识 MCU(C51) 概念&#xff1a;应用实例家用电子&#xff0c;汽车电子&#xff0c;嵌入式系统&#xff0c;低成本&#xff0c;低功耗&#xff0c;小型化&#xff0c;通常使用c语言或者汇编语言&#xff0c;用于家用电器控制&#xff0c;智能家居&#xff0c;汽…