go-micro集成docker部署--golang,rabbitmq,protobuf

golang的优点不言而喻,web开发利器,下面说下rpc框架与docker集成,并且使用rabbitmq

安装阶段
  1. 安装golang,
    略过…
  2. 安装docker,
    mac下安装docker比较简单:
	$ brew cask install docker 

注: 安装完成之后,开启在docker 最好是设置镜像地址,pull镜像的时候会快一些

  1. 安装micro (github),
    安装micro (go get xxx/micro | go get xxx/go-micro | go get protoc-gen-micro )
    完成之后,由于go get 命令会自动编译micro,下面运行的micro命令就这里安装好才能使用的
  2. 安装protobuf
    安装protobuf 直接下载包安装即可

以上两步可以去参照 go-micro微服务框架使用–golang
要想正常能开始正常使用,micro需要到github下载很多东西,包括google/x/目录下的一些包,最好是安装好golang之后,设置好gomodules,再去下载

开发准备
  1. 运行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
  1. 运行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,这里可以忽略)

  1. 运行服务(srv)
    接下来可以去github/micro/examples 下载个简单例子greeter或者也可以使用micro new命令自动生成一个项目模板
    一般我们会把业务写在srv里,srv是不对外开放的,但是micro client 模块可以使用srv之后互相调用,通过protobuf的规则,如果grpc也可调用,具体没有试过,外部一般是直接通过http调用,srv之间定义通过protobuf定义的.proto 文件之后,需要生成.pb| .micro.pb 两个文件.

  2. 运行测试
    打开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),因为这是服务的入口,
micro架构
,可以看下框架图示,外部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

开发阶段
  1. 书写自己对应的.proto 文件

  2. 使用micro-protobuf 命令生成对应的.pb | .micro.pb两个文件

  3. 合适go run main.go,把srv项目启动.
    重要:如果报错一般情况下都上.pb文件目录引用不到才会报错,如果把项目gopath/src 目录下应该不用改任何import引用路径,也不会报错,如果项目里放在非gopath目录下,可以使用import相对路径的方式引用其它包或者.pb 文件

  4. 通过api访问srv服务,上面已经贴了curl命令了,通过另一个srv访问,就需要在另一个srv服务里把.proto文件并且生成.pb | .mciro.pb 两个文件,通过micro.client调用

  5. 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.完善业务代码

部署阶段

本机测试部署

  1. mac 下已经安装docker,并运行
  2. 项目下配置dockerfile
	FROM alpine			#把项目运行在最小化linux系统上
	ADD example-srv /example-srv #把已经build好的example-srv可执行文件拷贝到docker 容器内相应目录下
	ENTRYPOINT [ "/example-srv" ]   #直接运行 这里就是运行shell命令  
	CMD [ "$0" "$@"]	#cmd 在没有ENTRYPOINT 的情况下可以做为执行命令的入口,但现在已经有entrypoint的情况下当做传参,
  1. 项目下配置docker-compose.yml
    docker-compose 可以做为小型项目管理工具
    compose配置需要关注的点比较多,docker镜像,网络,网段,log,还有文件挂载,下一篇文章再细写,需要把api,srv都配置上,如果需要访问micro管理页面还要把web 都配置上,
  2. 使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值