一、Micro介绍
Micro是一个专注于简化分布式系统开发的微服务生态系统。它通过将微服务架构抽象成一组工具,隐藏了分布式系统的复杂性,为开发人员提供了更简洁的方式构建分布式应用。我们可以在Go环境下使用Micro来搭建分布式应用系统。
实际上,micro是一个插件化的微服务架构的框架,它默认就支持protobuf、grpc、consul等技术。micro能够帮我们完成服务注册的操作,减去用户自己手动发布服务的麻烦。
二、Micro下载和安装
$ go get -u -v github.com/go-log/log
$ go get -u -v github.com/gorilla/handlers
$ go get -u -v github.com/gorilla/mux
$ go get -u -v github.com/gorilla/websocket
$ go get -u -v github.com/mitchellh/hashstructure
$ go get -u -v github.com/nlopes/slack
$ go get -u -v github.com/pborman/uuid
$ go get -u -v github.com/pkg/errors
$ go get -u -v github.com/serenize/snaker
$ go get -u -v github.com/hashicorp/consul
$ go get -u -v github.com/miekg/dns
$ go get -u -v github.com/micro/micro
执行go get -u -v github.com/hashicorp/consul命令可能会出错。如果出错了,可以先到github上下载它的压缩包,然后再解压缩到$GOPATH/src/github.com/hashicorp目录下即可。
下载完成后,编译micro。
$ cd $GOPATH/src/github.com/micro/micro
$ go build -o micro main.go
把编译后的执行文件复制到/bin/目录下。
sudo cp micro /bin/
然后再把下面两个插件安装上即可。
# 安装protoc-gen-go和protoc-gen-micro插件
$ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
$ go get -u github.com/micro/protoc-gen-micro
# 编译后生成protoc-gen-go可执行文件
$ go build
# 将生成protoc-gen-go可执行文件拷贝到/bin目录下
$ sudo cp protoc-gen-go /bin/
三、Micro的基本演示
第一步:创建两个服务。
$ micro new --type "srv" microtest/micro/rpc/srv
$ micro new --type "web" microtest/micro/rpc/web
创建成功后,会在$GOPATH/src/microtest/micro/rpc目录下新建两个文件夹,如下图所示:
第二步:编译srv下的proto文件。
$ cd $GOPATH/src/microtest/micro/rpc/srv
$ protoc --proto_path=. --go_out=. --micro_out=. proto/example/example.proto
编译成功后如下图所示:
第三步:打开web下的main.go文件,设置web端的端口号。
如果没有设置端口号,那么启动web端的时候,系统会自动分配一个端口号,所以建议手动指派端口号。
第四步:把准备好的html覆盖web下的html文件夹。
链接:https://pan.baidu.com/s/1GBMbe-O3j_E_cUPQxRukSQ
提取码:punt
第五步:修改srv下的main.go,导入srv下proto存储目录下的所有proto文件。
同样地,修改srv/handler目录下的example.go文件,导入srv下proto存储目录下的所有proto文件。
第六步:修改web/handler目录下的handler.go文件,修改内容如下:
第七步:修改完成后,启动服务。
# 启动consul
$ cd $GOPATH/src/microtest
$ consul agent -dev -client 0.0.0.0
# 启动服务
$ cd $GOPATH/src/microtest/rpc/srv
$ go run main.go
# 启动web
$ cd $GOPATH/src/microtest/rpc/web
$ go run main.go
启动完成后,在浏览器上输入http://192.168.31.20:8080,界面如下图所示:
我们也可以通过地址http://192.168.31.20:8500查看所有服务。
四、调用服务过程分析
4.1 web服务
首先web服务接收到用户请求后,会调用handler/handler.go中的ExampleCall函数。
接着,在ExampleCall函数中创建服务对象exampleClient。创建该对象的时候指定了要调用远程服务的名字。
获取参数name,然后再通过调用exampleClient对象的Call函数执行远程调用,并把name参数发送过去。Call函数返回远程服务的结果。
如果调用成功,那么就把结果封装到一个map对象中,并把它进行加密后输出到页面上。
4.2 srv服务
执行main.go的时候,注册了一个服务,并指定服务名为“go.micro.srv.srv”。
初始化服务,然后注册处理器Example。当服务被调用时候,会自动执行该处理器的Call函数。
在Call函数中,通过example.Response对象把内容返回给服务的调用者,从而完成整个服务调用。
五、升级GRPC
micro默认使用rpc进行服务之间的通信。所以,如果要使用grpc进行通信,那么需求对micro进行改造。
5.1 环境准备
首先,从$GOPATH/src/microtest/micro文件夹复制另外一个文件夹,并且命名为grpc。
$ cd $GOPATH/src/microtest/micro
$ cp -r rpc grpc
接下来对srv和web模块进行改造。
5.2 改造srv模块
5.2.1 修改main.go文件
第一步:导入go-grpc;
第二步:使用grpc创建服务。
5.2.2 修改example.go文件
5.3 改造web模块
5.3.1 修改main.go文件
5.3.2 修改handler/handler.go文件
第一步:导入go-grpc;
第二步:创建grpc服务;
第三步:在调用服务方法的时候传入grpc服务的client对象;
5.4 测试
第一步:重新编译srv下的proto文件;
$ cd $GOPATH/src/microtest/micro/rpc/srv
$ protoc --proto_path=. --go_out=. --micro_out=. proto/example/example.proto
第二步:启动srv和web。
# 启动srv
$ cd $GOPATH/src/microtest/micro/rpc/srv
$ go run main.go
# 启动web
$ cd $GOPATH/src/microtest/micro/rpc/web
$ go run main.go
第三步:测试。