31.总结

1.gin里面的中间件如果出错,不可以直接return,这样会把错误消息返回给客户端,应该使用ctx.Abort()方法,才会中断业务代码运行

2.gin结合go-micro的具体步骤是

服务端:创建proto文件,生成对应的pb文件,根据proto编写的规则编写service的具体实现逻辑,启动micro服务并注册到etcd或者consul中,使用micro api添加网关,或者使用第三方工具生成pb的时候就加入 网关服务,然后启动网关服务

客户端:

1.浏览器,postman之类的,如果添加了api网关服务我们就可以直接通过http请求访问rpc服务

2.代码客户端,将服务端proto文件拷贝以和服务端同样的方式生成pb文件创建调用客户端,根据pb文件中的入参和出参创建rpc 请求(未发送),发送请求并根据pb中的响应结构体去解析服务端的响应

package main

import (
    "context"
    "fmt"
    "github.com/micro/go-micro/client"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    myhttp "github.com/micro/go-plugins/client/http"
    "github.com/micro/go-plugins/registry/consul"
    "log"
)

func callAPI(s selector.Selector) {
    myCli := myhttp.NewClient(
        client.Selector(s),
        client.ContentType("application/json"),
    )
    req := myCli.NewRequest("prodservice", "/v1/prods", map[string]int{"SIZE":3}) //使用生成的pb文件中的结构体作为参数封装到请求体中

    var resp Models.ProdListResponse //这里使用生成的response对象,这样就避免了我们在传递时候参数类型的不灵活,也就解决了上节课的问题
    err := myCli.Call(context.Background(), req, &resp)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}

func main() {
    consulReg := consul.NewRegistry(
        registry.Addrs("localhost:8500"),
    )
    mySelector := selector.NewSelector(
        selector.Registry(consulReg),
        selector.SetStrategy(selector.RoundRobin), //设置查询策略,这里是轮询
    )
    callAPI(mySelector)
}




posted @ 2020-01-03 21:33  离地最远的星  阅读(275)  评论(0编辑  收藏  举报