注意:在整个流程中,最终的调用并不是由注册中心来完成的。虽然注册中心会提供信息,但实际上调用方需要自己进行最后的调用动作。注册中心的作用是告诉调用方提供者的地址等信息,然后调用方会根据这些信息来完成最后的调用。
为什么一定要知道注册中心的地址?
因为服务提供者需要将自己提供的接口方法告知注册中心,所以它必须知道注册中心的地址,这样才能将自己的信息上报给注册中心,所以必须要配置注册中心。同样的道理,消费者调用方也需要知道注册中心的地址,以便将注册中心的地址配置到项目中。
IDL是什么?
IDL(接口定义语言)是一种约定俗成的语言,用于定义接口和数据结构的语法。它是一种人为约定的语言,通过这种语法,可以明确地定义接口和数据的结构,使各方在交流和协作时能够达成一致。这种约定的语言为不同的系统、平台或语言提供了一种统一的描述方式,使得不同环境下的应用程序能够理解和交互。
Dubbo 是一个开源的高性能、轻量级的分布式服务框架,最初由阿里巴巴公司开发并开源。它提供了分布式服务治理、通信框架、智能负载均衡、容错策略等功能,用于帮助开发者构建可扩展、高性能、松耦合的分布式应用。
Dubbo框架,是目前国内非常主流的RPC实现框架。Dubbo底层用的是Triple协议:Triple协议。 —— Dubbo框架官方文档
当前,还有其他类似的框架,比如 GRPC 和 TRPC 等等,这些都是不同的 RPC 远程调用框架,Dubbo 和 GRPC 是比较知名的。
Dubbo 由阿里开发,而 GRPC 是由 Google 开发,TRPC 则是由腾讯开发。
Dubbo Go(也称为 dubbo-go)是 Dubbo 框架的 Go 语言版本,是一个基于 Go 语言开发的分布式服务框架,用于构建高性能、可扩展的分布式应用程序。它提供了与原始 Java 版本类似的功能,允许开发者使用 Go 语言构建分布式应用程序。dubbo-go 可以与 Java 版本的 Dubbo 框架无缝集成,使得在混合语言环境中开发分布式系统更加便捷。
dubbo-go 提供了对 Dubbo 协议的支持,允许 Go 语言服务提供者和消费者之间进行通信,并利用 Dubbo 的治理能力实现服务注册、发现、负载均衡等功能。它也支持多种序列化和网络传输协议,以满足不同场景的需求。
go version >= go 1.15。
【Go 语言官网下载地址】
brew install protobuf
这将会安装 protobuf 和 protoc编译器。protoc --version
如果一切正常,将显示protoc的版本信息。go env
可以看到GOPATH目录所在)$ export GOPROXY="https://goproxy.cn"
$ go install github.com/dubbogo/dubbogo-cli@latest
$ dubbogo-cli
hello
dubbogo-cli install all
$ 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
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
这里使用 IDL(接口调用语言)的方式使用dubbo:创建一个公共的接口定义文件,服务提供者和消费者读取这个文件。优点是跨语言。
Nacos 官方文档
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up
no matching manifest for linux/arm64/v8 in the manifest list entries
# 下载镜像
$ docker pull nacos/nacos-server:v2.1.2-slim
# 查看下载的镜像
$ docker images
# 创建 docker-compose.yml
$ vim docker-compose.yml
# 启动该镜像
编写 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
启动 nacos $ docker compose up
启动成功后,可以看到如下界面:
可以去 nacos 注册中心看一下,访问 http://自己服务的IP地址:8848/nacos/index.html
默认用户名和密码都是 nacos
dubbogo-cli newApp xxx
$ dubbogo-cli newApp IDC
$ cd IDC
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;
}
protoc --go_out=. --go-triple_out=. ./api.proto
)$ cd api
$ protoc --go_out=. --go-triple_out=. ./api.proto
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{})
}
dubbo:
registries:
nacos:
protocol: nacos
address: 127.0.0.1:8848
protocols:
triple:
name: tri
port: 20000
provider:
services:
GeneratorServerImpl:
interface: "" # read from stub
DUBBO_GO_CONFIG_PATH
Dubbo-go 并没有提供直接设置配置文件路径的函数。Dubbo-go 配置文件是通过环境变量 DUBBO_GO_CONFIG_PATH
或者在启动应用程序时通过命令行参数传递的。
export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml
将 “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 应用程序已启动")
}
go run cmd/app.go
go mod init 客户端项目包名
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)
}
dubbo:
registries:
nacos:
protocol: nacos
address: 127.0.0.1:8848
consumer:
references:
GeneratorClientImpl:
protocol: tri
interface: ""
DUBBO_GO_CONFIG_PATH
Dubbo-go 并没有提供直接设置配置文件路径的函数。Dubbo-go 配置文件是通过环境变量 DUBBO_GO_CONFIG_PATH
或者在启动应用程序时通过命令行参数传递的。
export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml
将 “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)
}
go run cmd/client.go