• 8.服务调用: 使用插件、调用http api的正规姿势(初步)


    我们先启动一个server然后再去调用server api

    package main
    
    import (
        "github.com/gin-gonic/gin"
        "github.com/micro/go-micro/registry"
        "github.com/micro/go-micro/web"
        "github.com/micro/go-plugins/registry/consul"
        "go-micro/ProdService"
    )
    
    func main() {
        consulReg := consul.NewRegistry( //新建一个consul注册的地址,也就是我们consul服务启动的机器ip+端口
            registry.Addrs("localhost:8500"),
        )
        ginRouter := gin.Default()
        ginRouter.Handle("GET", "/user", func(context *gin.Context) {
            context.String(200, "user api")
        })
        ginRouter.Handle("GET", "/news", func(context *gin.Context) {
            context.String(200, "news api")
        })
    
        v1Group := ginRouter.Group("/v1")
        {
            v1Group.Handle("POST", "/prods", func(context *gin.Context) {
                rq := Helper.NewRequest()
                context.bind(rq) //使用自定义的结构体解析post表单
                context.JSON(
                    200,
                    gin.H{
                        "data": ProdService.NewProdList(2),
                    },
                )
            })
        }
    
        //其实下面这段代码的意义就是启动服务的同时把服务注册进consul中,做的是服务发现
        server := web.NewService( //go-micro很灵性的实现了注册和反注册,我们启动后直接ctrl+c退出这个server,它会自动帮我们实现反注册
            web.Name("prodservice"), //注册进consul服务中的service名字
            web.Address(":8088"), //注册进consul服务中的端口,也是这里我们gin的server地址
            web.Handler(ginRouter),  //web.Handler()返回一个Option,我们直接把ginRouter穿进去,就可以和gin完美的结合
            web.Registry(consulReg), //注册到哪个服务器伤的consul中
        )
        server.Init() //加了这句就可以使用命令行的形式去设置我们一些启动的配置
        server.Run()
    }
    

    首先先看我们在浏览器中请求server获取到的response长什么样

    可以看到返回的是一个json,那么我们在客户端通过go-micro调用的时候也有一些细节,请仔细看下面代码注释

    接下来是调用服务的代码

    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), //通过Selector方法并且按照我们之前设置的策略返回当前service的一个节点
            client.ContentType("application/json"), //因为我们要调用的/v1/prods这个api返回的是json,所以这里要先规定好数据格式json(很重要,如果是其他的会报错)
        )
        //下面这句代码封装了一个请求(未发送)
        req := myCli.NewRequest("prodservice", "/v1/prods", map[string]string{})//这里最后一个参数是body,一般用于post请求的参数,因为我们这个api没有参数,所以我随便写了map[string]string{}
        //从之前的图可以看到我们的返回值是一个json,key-val为"data":[],所以我们的response要构建一个相同结构的,方便go-micro帮我们返回响应结构体map[string]int{"Size": 4},这里的key大小写都可以,只要和request结构体该字段字母一样就行入 abcd:3 Abcd:3 ABCD:3都可以
        var resp map[string]interface{}
        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)
    }
    




  • 相关阅读:
    班服 状压DP NOIP模拟赛
    记录奥林比克/课程录制 洛谷P2255 [USACO14JAN]
    字符串的展开 vijos1379 NOIP2007 字符串 模拟
    树网的核 Vijos1362 NOIP2007 树结构 直径 暴搜
    浏览器(Web Navigation) codevs 5373 POJ 1028 简单模拟
    FPS集合 Codgic1351 动态规划 DP NOIP模拟赛
    基于VBA的Excel抽奖软件
    【CodeForces】Round #436
    【NOI OpenJudge】【1.3】编程基础之算术表达式与顺序执行
    【NOI OpenJudge】【1.2】编程基础之变量定义、赋值及转换
  • 原文地址:https://www.cnblogs.com/hualou/p/12102705.html
Copyright © 2020-2023  润新知