上一篇讲了如何用Swoft 搭建RPC 服务
本篇介绍如何使用微服务
微服务流程
首先讲一下微服务的流程
弄清楚流程, 开发起来就行云流水
这是官方给出的目录结构
| 1 | app/ | 
当然在多个服务中使用时, 要将lib库 app/Lib移到一个公共的git仓库里,然后各个服务通过 composer 来获取使用
这里有3个目录
Lib 是接口, 也是客户端和服务端必须的, 用来规定数据结构, 一般由服务端提供
服务端还需要实现Services, 也就是相当于Model 层
客户端可以通过配置Pool 来调用对应的Services, 如同调用自身的Model 一样方便
整个流程不是很难理解, 但是官方把三个目录放在一起, 并且没有详细说明, 导致很多同学搞不清楚
下面我们来写一个例子试一下吧
定义一个接口
接口定义和普通接口完全一致,唯一不一样的是:
- 需要在类注释上定义类似 deferGetUser方法,对应类里面方法getUser且首字母大写。这种defer*方法,一般用于业务延迟收包和并发使用。
- 这些方法是不需要实现的,仅用于提供IDE提示。内部调用逻辑由框架帮你完成
在app/Lib 新建接口文件MemberInterface
定义一个getMemberByID方法, 并且根据官方提示, 在接口注释里定义一个deferGetMemberByID 方法
| 1 | 
 | 
这样就可以了, 新建的每个方法都要在接口注释里加一个同名的defer*方法, 用来做延迟收包方法
把接口文件复制到swoft-http的app/Lib里, 且之后接口文件若有变动, 都要报证相同
服务端实现Services
接口定义好了, 下面我们在Services 里实现这个接口
在app/Services 新建类文件MemberService, 实现MemberInterface 接口, 并继承其注释
| 1 | 
 | 
这里需要注意:
注解里的
@Service()默认为0, 用来区分接口的不同版本
也就是你可以建多个类来实现这个接口, @Service(version="1.0.1") 版本号不同即可
客户端配置Pool
服务端的Service实现就是这么简单
反倒是客户端的连接池实现有些麻烦
客户端连接池需要搞清两个问题:
- 连谁?
- 连什么?
app/Pool/Config 是连接池配置文件, 来解决第一个问题
同一个连接我们可以用同一个连接池, 刚才在服务端只是新增了一个接口, 并不是新建了一个RPC 服务, 所以这里不需要改动(只是我懒)
下面来解决第二个问题, 连什么?
在app/Controller 里新建一个控制器MemberController
| 1 | 
 | 
注意成员memberService 的注解
- @Reference(name="user")用来指定连接谁,- user是别名, 在- app/Lib/UserServicePool.php的- @Pool注解里命名
- @var MemberInterface用来指定连接什么, 也就是哪个接口
- version="0"用来指定该接口的某个版本, 在服务端- Services的注解里声明
测试
打开连接http://127.0.0.1:9501/member/22/5b17a847ab6441649600174a.png)
成功!