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

2021-01-27  本文已影响0人  小钟钟同学

说明

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

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


image.png

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

实践

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

image.png

首先我们的

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
上一篇下一篇

猜你喜欢

热点阅读