开发微服务
本示例演示了使用 dubbo-go 开发微服务应用,为应用增加包括服务发现、负载均衡、流量管控等微服务核心能力。
前置条件
本示例我们继续使用 Protobuf 开发微服务应用,请参考 开发 rpc server 和 rpc client 了解如何安装 protoc、protoc-gen-go-triple 等必须插件。
快速运行示例
下载示例源码
我们在 apache/dubbo-go-samples 仓库维护了一系列 dubbo-go 使用示例,用来帮助用户快速学习 dubbo-go 使用方式。
你可以 下载示例zip包并解压,或者克隆仓库:
$ git clone --depth 1 https://github.com/apache/dubbo-go-samples
切换到快速开始示例目录:
$ cd dubbo-go-samples/registry/nacos
启动 Nacos
由于示例应用中启用了服务发现能力且使用 Nacos 作为注册中心,在运行示例之前需要先启动注册中心。请参考 Nacos 本地安装 了解如何快速安装和启动 Nacos。
运行 server
在 go-server/cmd
示例目录:
运行以下命令,启动 server:
$ go run server.go
使用 cURL
验证 server 正常启动:
$ curl \
--header "Content-Type: application/json" \
--data '{"name": "Dubbo"}' \
http://localhost:50051/greet.v1.GreetService/Greet
Greeting: Hello world
运行 client
打开一个新的 terminal,运行以下命令,启动 client
$ go run client.go
Greeting: Hello world
以上就是一个完整的 dubbo-go 微服务应用工作流程。
源码讲解
关于 dubbo-go-samples/registry/nacos
示例源码,包括服务定义、代码生成、server/client 启动等均与上一篇 rpc server & rpc client 类似,请点击以上链接查看具体解读。
开发微服务最大的不同点在于:应用中增加了关于注册中心的配置,如下所示(以 server.go 为例):
func main() {
ins, err := dubbo.NewInstance(
dubbo.WithName("dubbo_registry_nacos_server"),
dubbo.WithRegistry(
registry.WithNacos(),
registry.WithAddress("127.0.0.1:8848"),
),
dubbo.WithProtocol(
protocol.WithTriple(),
protocol.WithPort(20000),
),
)
srv, _ := ins.NewServer()
greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{})
if err := srv.Serve(); err != nil {
logger.Error(err)
}
}
相比于开发 rpc 服务时我们直接声明 server.NewServer(...)
,这里我们使用 dubbo.newInstance(...)
初始化了一些全局共享的微服务核心组件,包括应用名、注册中心、协议等:
ins, err := dubbo.NewInstance(
dubbo.WithName("dubbo_registry_nacos_server"),
dubbo.WithRegistry(
registry.WithNacos(),
registry.WithAddress("127.0.0.1:8848"),
),
dubbo.WithProtocol(
protocol.WithTriple(),
protocol.WithPort(20000),
),
)
然后,才是创建 ins.NewServer()
并为 server 实例注册服务 greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{})
,最后通过 srv.Serve()
启动进程。
关于 dubbo.Insance 说明
- 在开发 dubbo 微服务应用时,我们推荐使用
dubbo.Instance
来设置一些全局性的服务治理能力,如注册中心、协议、应用名、tracing、配置中心等。ins.NewServer()
可以创建多个,通常当你需要在多个端口 发布多个协议 时才需要这么做。