一架梯子,一头程序猿,仰望星空!

Go Micro API网关


使用微服务架构后,后端的微服务有很多个,同一个微服务也会部署很多个实例,服务之间虽然可以通过服务发现,进而互相通信。那么如果我们想让移动app,web app调用我们的服务怎么办?这时候api网关,就提供一个后端api的统一入口,app可以通过这个api网关,访问我们的微服务接口。

Go Micro框架也提供了一个简单的api网关,这个api网关只能处理http请求,然后将请求转发给我们后端的微服务,下面通过一个例子介绍api网关的用法。

1.使用网关的应用架构

下图是一个三层架构的例子:

从左边往右边看,一共分为三层:

  • 第一层 Micro api网关
  • 第二层 聚合业务层
  • 第三层 基础服务层

下面分别介绍,将系统划分为这三层的作用。

1.1. 第一层api网关

第一层就是Go Micro api网关,移动app可以通过api网关的地址,请求后端提供的接口,这一层是不需要开发的,启动micro api就可以代理客户端的请求,后面会介绍micro api网关是如何将请求转发到具体的微服务。

1.2. 第二层聚合业务层

聚合业务层,主要负责组合各种底层的微服务提供的功能,实现业务需求。

如果上图的例子:api网关接受了一个/customer/orders的api请求(查询用户的订单),api网关将请求转发给聚合服务层的Customer api服务(用户api聚合服务),然后Customer api服务分别调用Customer Service(用户服务)和Order Service(订单服务)两个服务,最后Customer api服务将组合底层服务处理的结果返回去。

为什么要多搞一层聚合服务层,而不是直接将这些功能写到后端的某个服务里面?

  • 分层架构设计,可以有效的复用代码。
  • 确保底层基础服务的单一职责,也是为了代码复用率。
  • 扩展性,越是底层的基础服务,越稳定,我们将容易发生变化的逻辑迁移到上层,也就是聚合服务层,我们可以在聚合服务层快速组合底层的基础服务,满足业务需求。

1.3. 第三层基础服务层

基础服务,通常都负责业务最底层的数据处理,通用的业务逻辑,确保服务的单一职责。

提示:这个例子中的第二第三层,最早实现的时候都是微服务,只不过我们按照职责将微服务分为了两层,当然你可以根据自己的需求自己设计系统分层。

2.安装网关

go get github.com/micro/micro

安装成功后,会在$GOPATH/bin目录中多了一个micro命令,micro命令包含了我们需要的网关。

提示:需要将$GOPATH/bin 目录添加到环境变量PATH中,否则会提示找不到micro命令。

3.官方例子

go micro官方提供了很多demo, 下面我们直接通过官方的一个例子,介绍怎么使用网关。

3.1. 下载官方例子源码

git clone https://github.com/micro/examples

3.2. 启动greeter例子

# 切换到例子源码根目录
cd examples

# 启动基础服务
go run greeter/srv/main.go

# 新打开一个命令窗口,启动api服务,这就是我们说的聚合服务
go run greeter/api/api.go

# 新打开一个命令窗口,启动go micro api网关
micro api --handler=api

这样我们相关的服务都启动完成,默认网关的端口是8080

3.3. 测试网关api

请求上面例子的网关接口

curl "http://localhost:8080/greeter/say/hello?name=John"

输出:

{"message":"Hello John"}

URL路由说明:

通过网关请求/greeter/say/hello,这个路径,网关会将请求转发到go.micro.api.greeter服务的Say.Hello方法处理。

go.micro.api是网关的默认服务名的前缀,所以,根据/greeter/say/hello这个url可以拼接出go.micro.api.greeter这个服务名,除了greeter之外的URL路径,作为rpc接口参数。

提示:这里没有把例子代码贴出来,仅仅演示怎么使用网关,代码大家可以打开前面go run运行的源码看一下。