Go Micro API 网关

使用微服务架构后,后端的微服务有很多个,同一个微服务也会部署很多个实例,服务之间虽然可以通过服务发现,进而互相通信。

那么如果我们想让一个 mobile 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 Micro Web后台:Go Micro框架自带了一个 web 后台,可以通过 web 后台,查看当前注册的服务、测试服务接口等。 1. 安装go get github.com/micro/micro安装成功后,会在 $GO ...