微服務筆記

微服務筆記

consul 啓動:

在D:\soft;只能在 系統自帶的cmd啓動,不能使用cmder
consul agent -dev -advertise=127.0.0.1html

consul 資料:

着重看node

應該要看懂:python

博客:mysql

查當作員:

consul memberslinux

查看節點:

curl 127.0.0.1:8500/v1/catalog/nodesgit

使用DNS協議查看節點信息:

dig @127.0.0.1 -p 8600 Litao-MacBook-Pro.node.consul
這個是列出DNS服務器上的域名與IP地址對應的github

consul WEB管理端:http://127.0.0.1:8500

註冊服務

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

go-micro 在示例 serivce 運行: 看一下此示例的readme 能夠知道好多具體的用法

繼續看定義

Broker定義:web

Micro Docs:算法

微服務套件

  • 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:

    經過命令行,執行微服務及其它命令;

Micro example

  • flags: 能夠自定義命令行參數
  • shutdown: 服務退出
  • micro/cli/readme: micro的使用命令說明(這個不是example下面)
  • greeter/cli/python: python語言調用微服務的實例
  • flags: 自定義命令行參數
  • broker: 消息發佈與訂閱
  • 初始默認值: go-micro/cmd/cmd.go

Go Micro組成

  • 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,包含了基本的所有用法

  • Server:server 提供實現微服務的接口;響應RPC請求;

consul分佈式跑起來

  • consul agent -dev -client=10.8.230.15 //監聽10.8.230.15
  • ./consul agent -advertise=10.8.230.17 -client=10.8.230.17 -data-dir=/tmp -bind=10.8.230.17 -bootstrap -server
  • srv --registry_address=10.8.230.15 //服務註冊
  • micro --registry_address=10.8.230.15 list services //查詢全部服務
  • client --registry_address=10.8.230.15
  • srv --server_address=:54001 //服務啓動時指定監聽的IP與端口(這樣寫法是:默認IP+指定端口)

go交叉編譯

參考文章 本地環境已經搭建完成並能夠編譯

  • build.bat在Go根目錄下的src,運行也要在此目錄
  • 接下來執行的命令
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 pull microhq/micro 已下載好

使用 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

生成protoc-gen-go 與 proto.go

go get github.com/micro/protobuf/{proto,protoc-gen-go} 生成生成protoc-gen-go 執行失敗的 替換方案(go get = git clone & go install )

  • go build github.com/micro/protobuf/proto
  • go build github.com/micro/protobuf/protoc-gen-go(會在當前目錄下生成protoc-gen-go.exe)
  • proto.exe 與 protoc-gen-go.exe 放於同一目錄下面
  • protoc --go_out=plugins=micro:. greeter.proto

    • go_out : 輸入go文件所在目錄
    • plugins : 指定了插件名稱, protoc.exe 會在系統path目錄裏搜索
    • greeter.proto : 最後是須要轉化的proto文件
    • 這種等號連寫的方式尚未搞清楚
  • protoc -IPath: path是 import的搜索路徑,也能夠是--protoc_path=Path
  • api項目中生成protoc時,要使用默認namespace go.micro,不然會報api.Request沒有定義 (api.Request是在引入的protoc中定義的)
  • 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

分析了實例(micro/example) 瞭解清楚了broker selector

沒有解決的問題:client 如何找到服務,由於註冊的地址不一樣;

已解決: 啓動時添加參數 --registry_address

服務已經退出了,可是consul裏還顯示存在

在啓動服務時 加上 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的關係

Micro 提供微服務開發的相關工具鏈

Go-Micro 是具體實現了微服務的SDK

服務退出 刪除服務節點

consul接口地址+serviceId
eg:
http://localhost:8500/v1/agent/service/deregister/kf.srv.autopackage_task-913f6119-1689-11e7-b8ec-10c37b6a4139

Go-Micro 定時任務

···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
    }),
    )
    ···

Go-Micro的errors庫

github.com/micro/go-micro/errors
包含的錯誤類型:

  • BadRequest 對應http 錯誤的400
  • Unauthorized 對應http 錯誤401
  • Forbidden 對應http 錯誤403
  • NotFound 對應http 錯誤404
  • InternalServerError 對應http 錯誤500

micro 的go-web模塊

  • 使用方法跟go-micro相似
  • 輕量的web框架
  • 用micro new 生成的項目實例中 handler請求是訪問的其它服務
  • 不能像go-micro同樣自定義參數
相關文章
相關標籤/搜索