- package main
- import (
- "context"
- "fmt"
- "github.com/go-kit/kit/endpoint"
- "github.com/go-kit/kit/log"
- "github.com/go-kit/kit/sd"
- "github.com/go-kit/kit/sd/consul"
- "github.com/go-kit/kit/sd/lb"
- httptransport "github.com/go-kit/kit/transport/http"
- consulapi "github.com/hashicorp/consul/api"
- "gomicro2/Services"
- "io"
- "net/url"
- "os"
- "time"
- )
- func main() {
- // 第一步创建 client
- {
- config := consulapi.DefaultConfig() // 初始化 consul 的配置
- config.Address = "localhost:8500" //consul 的地址
- api_client, _ := consulapi.NewClient(config) // 根据 consul 的配置初始化 client
- client := consul.NewClient(api_client) // 根据 client 创建实例
- var logger log.Logger
- {
- logger = log.NewLogfmtLogger(os.Stdout)
- var Tag = []string{"primary"}
- instancer := consul.NewInstancer(client, logger, "userservice", Tag, true) // 最后的 true 表示只有通过健康检查的服务才能被得到
- {
- factory := func(service_url string) (endpoint.Endpoint, io.Closer, error) { //factory 定义了如何获得服务端的 endpoint, 这里的 service_url 是从 consul 中读取到的 service 的 address 我这里是 192.168.3.14:8000
- tart, _ := url.Parse("http://" + service_url) //server ip +8080 真实服务的地址
- return httptransport.NewClient("GET", tart, Services.GetUserInfo_Request, Services.GetUserInfo_Response).Endpoint(), nil, nil // 我再 GetUserInfo_Request 里面定义了访问哪一个 API 把 url 拼接成了 http://192.168.3.14:8000/v1/user/{uid} 的形式
- }
- endpointer := sd.NewEndpointer(instancer, factory, logger)
- endpoints, _ := endpointer.Endpoints() // 获取所有的服务端当前 server 的所有 endpoint 函数
- fmt.Println("服务有", len(endpoints), "条")
- mylb := lb.NewRandom(endpointer, time.Now().UnixNano()) // 使用 go-kit 自带的轮询
- for {
- getUserInfo, err := mylb.Endpoint() // 写死获取第一个
- ctx := context.Background() // 第三步: 创建一个 context 上下文对象
- // 第四步: 执行
- res, err := getUserInfo(ctx, Services.UserRequest{Uid: 101})
- if err != nil {
- fmt.Println(err)
- os.Exit(1)
- }
- // 第五步: 断言, 得到响应值
- userinfo := res.(Services.UserResponse)
- fmt.Println(userinfo.Result)
- }
- }
- }
- }
- }
来自为知笔记 (Wiz) https://www.wiz.cn/i/c5b11ee0
来源: http://www.bubuko.com/infodetail-3345238.html