## Go Micro 因为 Mix Micro 直接融入 go-micro 微服务生态,在 Mix 中主要使用 [Micro](https://micro.mu/docs/runtime.html) 工具包,该工具的使用非常简单,本章节会讲解,了解更多查看该文档: - [go-micro 微服务开发中文手册](https://www.kancloud.cn/linimbus/go-micro/content) ## 架构 当我们开发单体应用时,我们通常通过 url 规划不同的业务: | path | desc | | --- | --- | | /customer/100 | 消费者 | | /message/111 | 消息 | | /order/122 | 订单 | 通常我们会使用 nginx 做负载均衡来扩展性能,但是很快我们就会发现一些问题: - 由于所有 path 都编写在一个程序中,当增加一个功能时,我们不得不重启整个程序,显然其他 path 是没必要重启的。 - 每个 path 的请求负载是不一样的,例如 /message 可能访问量非常大,我们无法单独为该 path 增加资源。 - 当我们没增加一台服务器时,都需要在 nginx/slb 中手动增加负载均衡,这样显然无法满足大型系统的部署要求。 接下来我们看一下 go-micro 微服务是如何解决这些问题的: ![](https://box.kancloud.cn/ed5dd6df55c0ca6cb2745b61439ec478_741x283.png) - 首先每个 path 根据 url 分段规则拆分成独立的 API 微服务,例如:/customer/100 匹配 php.micro.api.customer 微服务,该服务 content-type 采用 json,内部代码逻辑不操作 db,而是通过 gRPC Client 调用 php.micro.grpc.customer 微服务,该服务 content-type 采用 protobuf 的 grpc 协议。 - 由于 php.micro.api.customer 与 php.micro.grpc.customer 都可能随时启动多个进程,因此 /customer/100 匹配 php.micro.api.customer 微服务或者通过 gRPC Client 调用 php.micro.grpc.customer 微服务时,如何能确定调用到具体哪个实例可用?这时候就需要服务中心了,go-micro 支持 Consul、Etcd 等多种服务中心,有了服务中心每个微服务实例启动和退出时,网关和代码中使用的 gprc client 都能实时的捕获到变化,这样就实现了动态的负载均衡。 - 这里面将 /customer/100 匹配 php.micro.api.customer 微服务的程序就是微服务网关,是一个和 Nginx 类似的 [Micro](https://micro.mu/docs/runtime.html) 服务器工具,直接使用即可,而 gRPC Client 我们只需要符合 go-micro 在服务中心设定的数据结构,同时符合 grpc 协议,我们可以用任何语言打造,因此才有了 Mix Micro 的诞生。 ## Micro 在 “安装说明” 章节已经 Micro 的安装文档,在 Mix Micro 中主要使用以下命令: - `micro api` API 网关,负责代理 json 类型的接口,Mix 的 [Mix Micro Route](https://github.com/mix-php/micro-route) 针对 Micro API 做了兼容,因此使用 Mix 开发的 API 接口可以直接使用 Micro 反向代理, [[更多 Micro API 文档]](https://www.kancloud.cn/linimbus/go-micro/529031) ~~~ $ micro --registry=etcd api --handler=http --namespace=php.micro.api ~~~ - `micro api --enable_rpc` 开启 RPC 反向代理,开启后可以使用 HTTP 接口直接请求 gRPC 微服务,[Mix gRPC](https://github.com/mix-php/grpc) 的 Server 针对 Micro API RPC 代理做了兼容处理,因此可以支持 gRPC 的反向代理,请求与响应都是 JSON 格式,无需使用 Protobuf 通信,适合内部不同子系统之间通信。 ``` curl -H 'Content-Type: application/json' -d '{"service": "php.micro.grpc.greeter", "method": "Say.Hello", "request": {"name": "Asim Aslam"}}' http://127.0.0.1:8080/rpc ``` - `micro web`: Web 代理,负责代理网页和 WebSocket,[[更多 Micro Web 文档]](https://www.kancloud.cn/linimbus/go-micro/529032) ~~~ $ micro --registry=etcd web --namespace=php.micro.web ~~~ Micro Web 还包含一个网页版管理平台 `http://127.0.0.1:8082/`,Micro V2 非常奇葩,只有将微服务名称命名为 go.micro 开头才能在网页中看到,在 Micro V1 中没有这个限制。 - `micro network`: 启动微服务网络 ~~~ $ micro --registry=etcd network ~~~ - `micro list services` 查看全部微服务名称: ~~~ $ micro --registry=etcd list services php.micro.api.greeter php.micro.grpc.greeter ~~~ - `micro list routes` 查看微服务详细节点列表,需启动 `micro network` 才可查看: ~~~ $ micro --registry=etcd list routes +------------------------+----------------------+---------+--------------------------------------+----------+--------+-------+ | SERVICE | ADDRESS | GATEWAY | ROUTER | NETWORK | METRIC | LINK | +------------------------+----------------------+---------+--------------------------------------+----------+--------+-------+ | go.micro | 192.168.31.146:8085 | | d6084fbb-b272-4daa-afd2-247689729fd6 | go.micro | 1 | local | | go.micro.network | 192.168.31.146:60265 | | d6084fbb-b272-4daa-afd2-247689729fd6 | go.micro | 1 | local | | php.micro.api.greeter | 192.168.31.146:60160 | | d6084fbb-b272-4daa-afd2-247689729fd6 | go.micro | 1 | local | | php.micro.grpc.greeter | 192.168.31.146:60146 | | d6084fbb-b272-4daa-afd2-247689729fd6 | go.micro | 1 | local | +------------------------+----------------------+---------+--------------------------------------+----------+--------+-------+ ~~~