## 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 |
+------------------------+----------------------+---------+--------------------------------------+----------+--------+-------+
~~~
- 欢迎使用 MixPHP
- 安装说明
- 全栈开发
- 微服务开发
- Phar 开发
- 如何部署
- 独立部署
- Nginx
- Supervisord
- 新手教程
- 命令行常识
- 进程管理
- 热更新
- 全局变量
- 调试程序
- 入门须知
- 命名空间
- 自动加载
- 入口文件
- 增改应用
- 自动补全 IDE
- 核心功能
- 配置 (manifest.php)
- 依赖注入
- 事件调度
- 验证器
- 验证器定义
- 验证规则
- 静态调用
- 日志 Monolog
- 缓存
- 协程
- 什么是协程
- 开启协程
- Runtime
- 简介
- 创建协程 xgo + Channel
- 创建协程 xgo + WaitGroup
- xgo
- xdefer
- Channel
- WaitGroup
- Timer + Ticker
- Signal
- Select
- Context
- WorkerPool
- 数据库
- Database
- Database
- Connection
- QueryBuilder
- ExecutedEvent
- Redis
- Redis
- Connection
- CalledEvent
- 命令行
- 简介
- Application
- 创建命令
- 命令参数
- 打印与颜色
- 守护进程
- 后台运行
- Web/API 应用
- 简介
- 编写一个接口
- 服务器
- 路由 FastRoute
- 中间件
- 请求
- 响应
- 文件上传
- 控制器
- 视图
- Auth
- Session
- Guzzle
- HTTP 404/500
- 安全建议
- WebSocket 应用
- 简介
- 服务器
- 客户端
- Client
- JavaScript
- Swoole
- nginx代理
- 60s无消息断线
- Micro 微服务
- 简介
- 编写一个微服务
- Mix Micro
- Go Micro
- gRPC
- JSON-RPC
- 服务注册
- 配置中心
- 熔断与降级
- 调用链追踪
- 服务限流
- Sync Invoke 同步调用
- 简介
- 服务器
- 客户端
- TCP 应用
- 简介
- 服务器
- 客户端
- Telnet
- PHP
- Swoole
- UDP 应用
- 简介
- 服务器
- 客户端
- NC
- Swoole
- 第三方接入
- EasyWeChat
- Sentry
- Doctrine Cache
- 常见问题
- 如何利用 CPU 多核
- 连接多个数据库
- 如何设置跨域
- form-data 上传文件失败
- 输出大于 2M 的文件失败