services彻底解耦
:各个services之间的访问,不再是通过函数调用的方式,而是通过api或者其他的方式访问,
如果这样拆分成功,那么,后面我就可以将各个services,一个一个的替换成go实现,最终可以将services全部改成go services
实现了上面的底层services整体替换,那么上层的controller,block调用,同样可以替换,可以改用nodejs替换,这样就可以一块一块的替换,最终完成整个脱胎换骨,完全弃用Yii2,也可以根据现状,将一部业务替换,一部分还是用yii2.
Yii::$service 是一个中央调度,fecshop的每一个services,都不是通过use class的方式直接引入,而是通过Yii::$service->serviceName->xx()的方式引入的,因此Yii::$service就是一个中间层,我们可以在这个里面做文章,将调用改成一个远程访问,而不是调用本地的方法。
这样,将fecshop的N个service分开部署到不同的服务器,services之间通过api接口来访问,这样独立解耦,
然后,就可以逐个替换。
如果拆分的彻底,那么N个services部署到N个服务器上面,但是我没有N个服务器,我想分组部署,
有N个services,我想切成M组,每组有X个serices,也就是 x = n/m
,那么每组内的services通信,通过内部的方式调用,组之间的services通过api调用。那么我需要解决下面的问题
1.将每个services发布出去,也就是可以通过api 参数的方式访问到相应的services的方法(任何一个serivces都可以通过api访问,只要我想)
2.调用发布的services,任何一个services,都可以通过api访问到,按照相应的数据格式访问api,接收端就会相应
3.如果请求services在本机,那么直接访问相应的方法,而不是通过api访问services
4.session和cache,也是独立的services,可以独立部署,各个services都可以远程调用
实现思路:
1.将services发布成可以访问的api url
1.1.需要有一个整理的services路由配置,也就是service对应的URL地址
[
'fecshop\service\Cart' => 'http://120.3.3.1/services',
'fecshop\service\Order' => 'http://120.3.3.2/services',
'fecshop\service\Product' => 'http://120.3.3.3/services',
...
]
1.2在servicesController中
post 接收参数:
类名:fecshop\service\Cart
方法名:updateCartItemsQty()
参数:
[
'item_id' => 122,
'incre_qty' => 3
]
通过上面的三个部分,找到相应的类文件,方法,传递相应的参数,执行,返回结果。
1.3发送端,也就是访问端
首先访问本地,
1.1是否存在services,如果存在,直接调取相应的services方法即可。
1.2如果不存在,则使用api调取,
通过配置,调取远程的api地址,将访问的类,方法,参数发送过去,等待返回结果。
这样,初步的各个services解耦就完成了。可以把各个services部署到不同的服务器。
后面想想实现这个构思。