说明
在上一个记录中,把我们的RPC服务对外提供使用的方式,使用Micro 自带的网关,但是自带的网关的,使用起来不太熟悉,此时我们的可以嵌入整合我们的GIN,来作为网关。
此时具体的请求流程大概就是:
外部请求(HTTP)请求,请求GIN路由,然后处理我们的对应的GIN的handler方法。此时我们的Ginhadler中使用我们的micro 客户端调用我们的RPC服务,处理相关的请求和响应结果返回给我们的GIN。
刚好之前我也有使用过Gin写过一些服务,现在刚好派上用场了!
实践
首先是规划Gin网关目录(仅仅是演示,暂时不做太复杂):
首先我们的
- -- 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(),
})
}