前言

  • 上一章节中介绍了micro3.0  生成了user和order服务,在order服务中实现了订单查询方法,并在user服务中实现了注册和登录方法,并且在user服务中实现了查询订单详情的方法。
  • 另外解决了多个服务在部署多台服务器调用遇到的问题。
  • 本次将使用micro-web结合gin实现一个查询订单详情的api 的服务  go.micro.api.web

准备工作

   

  • etcd3.0    ip(49.232.162.254)
  • 虚拟机 (192.16.24.145)   运行order 服务 
  • 宿主机(192.16.24.12) 运行web服务
  • MySQL (49.232.162.25)  存放订单表

新建web服务

新建micro-web实现网关服务,在使用gin实现api的路由转发和服务调用

web服务

1、开始user服务,登录192.16.24.49 服务器,执行如下操作就创建了一个micro-web 服务,包名caoxiukang123456/web 包名尽量符合规范,此时代码里什么都没有。由于micro-web只用到了网关,所以不需要它来实现什么服务。

2、main.go如下

package main

import (
	"caoxiukang123456/micro-web/config"
	"caoxiukang123456/micro-web/router"
	"github.com/micro/go-micro/v2"

	"github.com/micro/go-micro/v2/registry"
	etcd "github.com/micro/go-micro/v2/registry/etcd"
	"github.com/micro/go-micro/v2/web"
)

func main() {
	config.InitConfig()

	// client连接服务
	clientService := micro.NewService(
		micro.Name(config.Data.ClientAppName),
		micro.Registry(etcd.NewRegistry(registry.Addrs(config.Data.RegisterUrl))),
	)
    clientService.Init()
	// web  主服务
	service := web.NewService(
		web.Name(config.Data.AppName),
		web.Address(config.Data.Port),
		web.Registry(etcd.NewRegistry(registry.Addrs(config.Data.RegisterUrl))),
	)
	service.Init(web.Handler(router.InitRouter(clientService.Client())))
	_ = service.Run()
}

在main函数中增加了2个服务  clientService和 service
1)clientService服务是用来在每个api中调用其他的微服务的客户端,它的主要类型是client.Client
2)service服务主要是用gin来提供api的web主服务,在服务的Init这一行传入了由gin实现的路由配置

3、router.go  在路由文件中定义了如下两个示例api

package router

import (
	"caoxiukang123456/micro-web/api"
	"caoxiukang123456/micro-web/middlewares"
	"github.com/gin-gonic/gin"
	"github.com/micro/go-micro/v2/client"
)
func InitRouter(c client.Client) *gin.Engine {
	//TODO 在此处增加微服务调用示例
	r := gin.Default()
	r.Use(middlewares.ClientMiddleware(c))
	r.GET("/", api.Index)
	r.GET("/order/info", api.GetOrderInfo)
	return r
}

传入的client客户端加入到中间件中为每个api提供了远程调用order服务的客户端,在api内可以根据需求使用。

4、middlewares.go 中间件将微服务  client 客服端加入到每个请求api中,这样在每个api中就能获取到这个client,就可以直接调用相应的微服务。

import (
	"github.com/gin-gonic/gin"
	"github.com/micro/go-micro/v2/client"
)

func ClientMiddleware(c client.Client) gin.HandlerFunc {
	// 此处传入 client
	return func(ctx *gin.Context) {
		ctx.Keys = make(map[string]interface{})
		ctx.Keys["clientService"] = c
		ctx.Next()
	}
}

5、api.go 在该文件中实现了路由文件中的获取订单方法GetOrderInfo。在这个方法中实现了远程调用订单服务的Info方法,获取到了订单详情并返回数据给接口

package api

import (
	order "caoxiukang123456/micro-order/proto"
	"caoxiukang123456/micro-web/config"
	"context"
	"encoding/json"
	"github.com/gin-gonic/gin"
	"github.com/micro/go-micro/v2/client"
	"net/http"
	"strconv"
)

func GetOrderInfo(req *gin.Context) {
	// 获取client
	idstr := req.Query("id")
	id, err := strconv.ParseInt(idstr, 10, 32)
	if err != nil {
		req.String(http.StatusOK, "Params err")
		return
	}

	// 开始请求micro-order 接口
	client := req.Keys["clientService"].(client.Client)
	var res order.InfoRequest
	res.Id = uint32(id)
	ctx := context.Background()
	orderService := order.NewOrderService(config.Data.OrderAppName, client)
	info, err := orderService.Info(ctx, &res)
	if err != nil {
		req.String(http.StatusOK, err.Error())
		return
	}
	// 转json
	body, err := json.Marshal(info)
	if err != nil {
		req.String(http.StatusOK, err.Error())
		return
	}
	req.String(http.StatusOK, string(body))
}

1)注意在使用order服务前应该要导入order服务的包才可以,这里可以参考前两章节的文章。

执行服务

1、通过上面的程序,已经就创建好micro-web服务了,此时按照下面的方式运行

  • 虚拟机 (192.16.24.145)   运行order 服务 
  • 宿主机(192.16.24.12) 运行micro-web服务

此时在etcd中可以看到注册进去的order,web两条服务信息 在服务信息里面可以看到服务的ip端口,服务名称,方法参数等细节参数

2、调用micro-web的接口 ,可以查到订单信息。

3、查看order服务的日志

通过订单服务中的日志可以看到。已经调用成功并且返回数据

总结

至此micro入门学习已经告一段落

在第一章节中学会了如何部署环境和创建第一个应用

在第二章节中学会了如何创建多个应用以及多个应用之间的相互调用,另外学会了服务注册与发现的原理以及微服务应用的部署方式

在第三章节中学会了如何通过micro-web网关对外提供restful api将我们的服务统一管理。
通过前面的学习已经了解到grpc,protocol 的基本用法和微服务的概念以及运作方式。通过深入学习以及掌握了如何将micro进行实践,在后续的日子里将继续深入micro在复杂实践环境下的用法
 

感谢  Go Micro中文文档

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐