在D:\soft;只能在 系统自带的cmd启动,不能使用cmder
consul agent -dev -advertise=127.0.0.1html
着重看node
应该要看懂:python
博客:mysql
consul memberslinux
curl 127.0.0.1:8500/v1/catalog/nodesgit
dig @127.0.0.1 -p 8600 Litao-MacBook-Pro.node.consul
这个是列出DNS服务器上的域名与IP地址对应的github
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-1", "Address": "mysql-1.node.consul","Service": {"Service": "mysql", "tags": ["master","v1"], "Port": 3306}}' http://127.0.0.1:8500/v1/catalog/registergolang
Broker定义:web
API:
相似于网关,是微服务的惟一入口;将对微服务访问的HTTP请求转换成RPC请求;
micro 套件与具体实现的服务api的关系(拿greeter举例)
先跑micro api;再跑greeter api ;micro会将 请求(http)转发(rpc协议)到 greeter 服务上去;
查看micro/example/greeter/api及 greeter readme
这个例子处理流程是这样的:
- new 一个 Say注册Handler
- 当 curl http://localhost:8080/greeter/say/hello?name=John
- 会调用Say 的hello 方法
- hello 方法再请求 go.micro.srv.greeter服务的Say 的Hello方法(greeter服务里用到了接口注册,有点绕,当心)
- postman 访问时 参数 须要 x-www-form-urlencoded
- url构成: 服务名/handler对象名/方法名
greeter web 也是相似的关系
Web:
提供一套可视化跟整个微服务交流的WEB界面; 路由/[serviceName]能够访问相应的微服务
跟micro的关系 与 api跟micro的关系同样
命令行里运行:micro web
界面上Request的是JSON,如:{"Name":"Jhon"}
能够测试微服务的各接口
Sidecar:
go-micro的http接口;经过这些接口,能够将非golang服务整合到一块儿;
Bot:
是微服务内部的机器人,外部能够经过Slack, HipChat, XMPP等与机器人交流;
CLI:
经过命令行,执行微服务及其它命令;
Registry:
服务注册
Selector:
作负载均衡;当客户端请求一个微服务A时,selector首先查询注册的服务A全部节点,让其中一个节点提供服务;目前使用的负载均衡算法有轮询、对访问来源hash后指定、黑名单
example/client/selector:演示了selector的用法;
示例是返回的服务的第一个节点:services[0].Nodes[0];没有看到 使用 random/ roundrobin算法
新建的api 项目,selector选择随机的
go-micro/selector/default.go: 是默认 defaultSelector
go-micro/client/rpc_client.go: rpcClient的Call方法里调用了 选择节点使用selector.select()、请求结束后调用 selector.mark();selector 的其它方法没有找到在哪里调用的
能够做为一种服务,专门提供筛选结点的功能; client在启动时指定 -- selector(这个没有吃透)
Broker:(用于异步通讯)
broker是一种很方便切换的发布与订阅的接口;微服务是基于事件驱动的;目前实现了消息队列系统如nats、rabbitmq 和 http(开发环境使用)
rabbitmq:MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通讯方法。
example/broker: producer调用了go-micro的broker 发送(pub)信息;consumer 接收(sub)信息w
例子应该使用的 http 来传递消息(由于我本机没有安装其它的消息队列系统),启动的时候 指定--broker=kafka
微服务会实现 订阅的方法(micro new 建立项目会自动建立subscriber)
Transport:(用于同步通讯)
是点对点发送消息的接口;目前实现了http、rabbitmq、nats;此接口能够无缝切换;
Client:
经过client发起RPC请求;client融合了注册服务、selector、broker和transport;它也包含了重试、超时、上下文的使用等等
写客户端能够参考example/client,包含了基本的所有用法
参考文章 本地环境已经搭建完成并能够编译
set GOOS=linux set GOARCH=amd64 go build -o autopackage //在工程根目录下执行;-o跟的是编译出来的名称(结果会在当前目录下面)
GOOS=windows GOARCH=386 go build -o hello.exe hello.go
GOOS=darwin GOARCH=amd64 go build hello.go
使用 docker run microhq/micro --registry_address=10.8.210.228 list services
写的具体服务部署在docker:
docker run -d --name=autopackage-service2 -p 54002:54002 autopackage --store_apk_dir=/val --registry_address=10.8.210.228 --server_advertise=10.8.210.211:54002 --server_address=:54002
go get github.com/micro/protobuf/{proto,protoc-gen-go} 生成生成protoc-gen-go 执行失败的 替换方案(go get = git clone & go install )
protoc --go_out=plugins=micro:. greeter.proto
- go_out : 输入go文件所在目录
- plugins : 指定了插件名称, protoc.exe 会在系统path目录里搜索
- greeter.proto : 最后是须要转化的proto文件
- 这种等号连写的方式尚未搞清楚
api 项目中生成proto时候,请在f:\mygo\src 路径下执行:
protoc --proto_path=F:/mygo/src --go_out=plugins=micro:. F:/mygo/src/autopackage_api/proto/task/task.proto
protobuf 中repeated表示字段 相似list
已解决: 启动时添加参数 --registry_address
在启动服务时 加上 TTL(这一招不行)
退出服务仍是得ctrl+c(已经找到了方法:example/shutdown)
go-micro/registry/consul_registry.go、consul_registry_test.go跟consul交互的方法
consul_registry.go的GetService方法:
Registry接口被consulRegistry实现
当调用selector时,registry调用具体实现的GetService方法获取全部正常的节点,获取节点的原理是:selector的registry访问consul的/v1/health/service/+serviceName接口
(若是registry是其它的,刚注意具体实现)
访问consul 以获取服务与接口信息经过 github.com/hashicorp/consul这个库
github.com/hashicorp/consul/api/catalog.go:其中写了多数跟consul交互的接口
go-micro/registry/registry.go:访问服务及节点
经过consul查看服务:http://10.8.230.15:8500/v1/health/service/kf.srv.autopackage
Micro 提供微服务开发的相关工具链
Go-Micro 是具体实现了微服务的SDK
consul接口地址+serviceId
eg:
http://localhost:8500/v1/agent/service/deregister/kf.srv.autopackage_task-913f6119-1689-11e7-b8ec-10c37b6a4139
···service := micro.NewService( micro.Name("autopackage_task"), micro.Version("latest"), micro.Context(ctx), micro.AfterStart(func() error { return handler.InitRegistry() }), micro.AfterStart(func() error { go handler.IntervalTask()//这里也要重启一个goroutine一个运行定时任务,不然会阻塞主goroutine,致使在退出服务时不会deregistry return nil }), ) ···
github.com/micro/go-micro/errors
包含的错误类型: