fecshop services 隔离拆分,部署到不同的的服务武器,彻底解耦的初步思路。

技术分享 · Fecmall · 于 6年前 发布 · 1918 次阅读

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部署到不同的服务器。 后面想想实现这个构思。

共收到 2 条回复
chrispoo#12年前 0 个赞

想法不错,有着手去做了吗

Fecmall#22年前 0 个赞

@chrispoo #1楼 这个是理论探究,实际上不需要这么搞

多开几个php服务器就可以了

Fecmall分布式部署

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics