golang的优点不言而喻,web开发利器,下面说下rpc框架与docker集成,并且使用rabbitmq
安装阶段 |
---|
- 安装golang,
略过… - 安装docker,
mac下安装docker比较简单:
$ brew cask install docker
注: 安装完成之后,开启在docker 最好是设置镜像地址,pull镜像的时候会快一些
- 安装micro (github),
安装micro (go get xxx/micro | go get xxx/go-micro | go get protoc-gen-micro )
完成之后,由于go get 命令会自动编译micro,下面运行的micro命令就这里安装好才能使用的 - 安装protobuf
安装protobuf 直接下载包安装即可
以上两步可以去参照 go-micro微服务框架使用–golang
要想正常能开始正常使用,micro需要到github下载很多东西,包括google/x/目录下的一些包,最好是安装好golang之后,设置好gomodules,再去下载
开发准备 |
---|
- 运行micro api
$ micro api
2019/04/12 21:00:22 Registering RPC Handler at /rpc
2019/04/12 21:00:22 Registering API Default Handler at /
2019/04/12 21:00:22 HTTP API Listening on [::]:8080
2019/04/12 21:00:22 Transport [http] Listening on [::]:49656
2019/04/12 21:00:22 Broker [http] Listening on [::]:49657
2019/04/12 21:00:22 Registering node: go.micro.api-ead1f341-725d-49e3-8122-c9c2d6ecc1a0
- 运行micro web
$ micro web
2019/04/12 21:01:43 HTTP API Listening on [::]:8082
2019/04/12 21:01:43 Transport [http] Listening on [::]:49660
2019/04/12 21:01:43 Broker [http] Listening on [::]:49661
2019/04/12 21:01:43 Registering node: go.micro.web-f3e5ad19-a8ac-4193-8adc-f7fb37d1c547
micro 安装完成之后,如果是windows系统可能需要在环境变量里面micro加进path里(golang 安装完成并已经设置好环境变量,已经path里设置过gopath,这里可以忽略)
-
运行服务(srv)
接下来可以去github/micro/examples 下载个简单例子greeter或者也可以使用micro new命令自动生成一个项目模板
一般我们会把业务写在srv里,srv是不对外开放的,但是micro client 模块可以使用srv之后互相调用,通过protobuf的规则,如果grpc也可调用,具体没有试过,外部一般是直接通过http调用,srv之间定义通过protobuf定义的.proto 文件之后,需要生成.pb| .micro.pb 两个文件. -
运行测试
打开http://localhost:8080,也可以运行 http://localhost:8082
具体访问方式:
$ curl -d 'service=go.micro.srv.greeter' \
-d 'method=Say.Hello' \
-d 'request={"name": "Bob"}' \
http://localhost:8080/rpc
这里涉及到micro架构,为什么要先运行这两个端口(对外只要一个端口就可以了,api/web),因为这是服务的入口,
,可以看下框架图示,外部http访问自己的写的微服务(srv)需要先通过暴露在外的api或web.
micro api相关文档说明 :
RPC endpoint
The /rpc endpoint let’s you bypass the main handler to speak to any service directly
Request Params
service - sets the service name
method - sets the service method
request - the request body
address - optionally specify host address to target
protobuf书写规则几点要注意的:
protobuf 3 demo :
message Person {
required string name = 1; //普通类型
required int32 id = 2; //int32对应golang就是Int32 ,对java 是int
optional string email = 3;
message PhoneNumber {
required string number = 1;
}
repeated PhoneNumber phone = 4;//repeated = 数组
}
具体类型对照在这里https://developers.google.com/protocol-buffers/docs/proto3
开发阶段 |
---|
-
书写自己对应的.proto 文件
-
使用micro-protobuf 命令生成对应的.pb | .micro.pb两个文件
-
合适go run main.go,把srv项目启动.
重要:如果报错一般情况下都上.pb文件目录引用不到才会报错,如果把项目gopath/src 目录下应该不用改任何import引用路径,也不会报错,如果项目里放在非gopath目录下,可以使用import相对路径的方式引用其它包或者.pb 文件 -
通过api访问srv服务,上面已经贴了curl命令了,通过另一个srv访问,就需要在另一个srv服务里把.proto文件并且生成.pb | .mciro.pb 两个文件,通过micro.client调用
-
micro接收命令行参数,如
go run miao.go --registry_address=xxx.xxx.xxx.xxx:8500 --mysql_addr=xxx.xxx.xxx.xxx:3306 --rabbit_addr=xxx.xxx.xxx.xxx:5672
micro默认使用consul服务发现,测试的时候可以不指定地址,mysql_addr和rabbit_addr 是自己定义的,使用方式跟golang获取命令行的方法类似
service := micro.NewService(
micro.Name("go.exa"),//这里名字会在注册中心显示,比如consul上
micro.Version("latest"),
//在加入解析命令行代码
)
// Initialise service
service.Init() //初始化
// Register Handler
example.RegisterExampleHandler(service.Server(), new(handler.Example))
//handler.Example proto文件中定义的主massage,生成proto文件之后,代码需要自己定义Example sturct,再把proto里定义的调用方法在handler包里实现之..........可以注册多个struct
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
6.完善业务代码
…
部署阶段 |
---|
本机测试部署
- mac 下已经安装docker,并运行
- 项目下配置dockerfile
FROM alpine #把项目运行在最小化linux系统上
ADD example-srv /example-srv #把已经build好的example-srv可执行文件拷贝到docker 容器内相应目录下
ENTRYPOINT [ "/example-srv" ] #直接运行 这里就是运行shell命令
CMD [ "$0" "$@"] #cmd 在没有ENTRYPOINT 的情况下可以做为执行命令的入口,但现在已经有entrypoint的情况下当做传参,
- 项目下配置docker-compose.yml
docker-compose 可以做为小型项目管理工具
compose配置需要关注的点比较多,docker镜像,网络,网段,log,还有文件挂载,下一篇文章再细写,需要把api,srv都配置上,如果需要访问micro管理页面还要把web 都配置上, - 使用docker-compose up 运行服务
也可以通过docker run -d -p 8081:8080 xxx
运行服务之后,通过docker logs -f dockerImagesId 查看日志
rabbitmq |
---|
最开始使用micro 插件的方式集成进来,但是使用由于是框架集成的存在各种疑问
1.无法返回ack.Nack()
2.一个broker无法启动多个chancel
最后使用原生方式,编码上会更自由一些.
https://www.rabbitmq.com/tutorials/tutorial-one-go.html