在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
包含的錯誤類型: