美文网首页
GO 微服务GO-Micro(12)-纯个人学习笔记记录:使用G

GO 微服务GO-Micro(12)-纯个人学习笔记记录:使用G

作者: 小钟钟同学 | 来源:发表于2021-01-27 14:36 被阅读0次

    说明

    在上一个记录中,把我们的RPC服务对外提供使用的方式,使用Micro 自带的网关,但是自带的网关的,使用起来不太熟悉,此时我们的可以嵌入整合我们的GIN,来作为网关。

    此时具体的请求流程大概就是:
    外部请求(HTTP)请求,请求GIN路由,然后处理我们的对应的GIN的handler方法。此时我们的Ginhadler中使用我们的micro 客户端调用我们的RPC服务,处理相关的请求和响应结果返回给我们的GIN。


    image.png

    刚好之前我也有使用过Gin写过一些服务,现在刚好派上用场了!

    实践

    首先是规划Gin网关目录(仅仅是演示,暂时不做太复杂):

    image.png

    首先我们的

    • -- greeter是我们的微服务生成的相关的文件,可以拷贝到这个地方,方便当前项目的应用。
    • -- handlers 是gin路由的处理函数
    • -- main 启动gin网关路由入口
    1 : 首先定义我们的main和我们的请求地址:
    package main
    
    import (
        "github.com/gin-gonic/gin"
        "src/api_gin_gateway/handlers"
    )
    
    func main()  {
        r := gin.Default()
        greeter := r.Group("v1")
        //业务调用
        //匹配路由进行返回回调进入到CallGreeter方法里面处理
        greeter.GET("/callsay",handlers.CallGreeter)
    
        if err := r.Run(); err!=nil{
            panic(err)
        }
    
    }
    
    
    2 : 定义我们的handler,再handler里面使用我们的GRCP的客户单对象去调用我们的服务端之后,再返回结果给Gin
    package handlers
    
    import (
        "context"
        "github.com/gin-gonic/gin"
        "github.com/micro/go-micro/v2"
        "github.com/micro/go-micro/v2/registry"
        "github.com/micro/go-micro/v2/registry/etcd"
        "log"
        "net/http"
        greeter "src/api_gin_gateway/greeter/proto/greeter"
    
    )
    
    
    
    
    //具体的请求回调函数
    func CallGreeter(ctx *gin.Context) {
        // 进行request的绑定,拿到一个结构,然后传递给我们的微服务
        //greeter.Request{} 是我们的编辑的GRPC里面结果提,我们定义的请求对象
        request := greeter.Request{Name: "sadasdas"}
        // 然后从我们的gin接收相关的传递过来的参数信息
        ctx.ShouldBindQuery(&request)
    
        //定义注册中心的对象
        reg := etcd.NewRegistry(registry.Addrs("192.168.219.130:2379"))
        // 注册到我们的ectd上
        service := micro.NewService(
            micro.Registry(reg),
        )
        //创建客户端对象
        helloService := greeter.NewGreeterService("go.micro.service.greeter", service.Client())
    
        //context.Background():可以简单理解我们知道这个上下文要去干什么
        //context.TODO():可以简单理解我们不清楚要使用哪个上下文、或者还没有可用的上下文
        // 默认生成的hello服务中自带三个接口: Call() Stream() PingPong(),分别对应参数调用、流传输和心跳
        resp, err := helloService.Call(context.Background(), &greeter.Request{
            Name: "xiao xie",
        })
    
        //// 然后像我们的微服务提交请求
        //res, err := serviser.greeterClient.Call(context.TODO(), &request)
        if err != nil {
            log.Print(err.Error())
            ctx.JSON(http.StatusInternalServerError, gin.H{
                "code":    -2,
                "message": "server error",
            })
            return
        }
        ctx.JSON(http.StatusOK,gin.H{
            "jieguo": resp.GetMsg(),
        })
    }
    
    
    3 : 启动Gin服务,访问我们的定义的接口http://localhost:8080/v1/callsay
    image.png

    相关文章

      网友评论

          本文标题:GO 微服务GO-Micro(12)-纯个人学习笔记记录:使用G

          本文链接:https://www.haomeiwen.com/subject/pfnozktx.html