suframe-think:通过think-swoole构建带服务注册及发现的微服务架构

项目地址:https://github.com/suframe/think
使用thinkphp6作为suframe服务后端的扩展库,让thinkphp6有轻量级微服务功能
本库基于https://github.com/top-think/think-swoole (v3.0.5以上版本)上进行的扩展,基本保持原有用法不变。
本系统只针对小型业务系统,大规模的微服务架构请移步到我的其他文章

开发此功能是为了完善summer体系,形成 api网关(api接口转发),中控台(带auth菜单权限的后台),服务(rpc内部接口,rest 对外api接口)的完整体系:前端访问 -> api网关 -> 后端服务api -> rest服务(服务间rcp <-> 调用服务注册发现) <- think-admin管理服务及通过rpc接口管理数据

什么是微服务

大佬就可以略过了,下面的针对对微服务比较模糊,没有尝试过的新手希望有点帮助,也只是我自己个人的见解而已。

现在微服务大行其道,各种架构层出不穷,由于使用到的工具繁多,涉及的从运维到开发技术架构都带来非常大的挑战。php在微服务一块比较弱,本身限制于语言特性。swoole的出现让php异步高性能开发有了更多的可能性,作为后端服务再合适不过。

说到微服务,就不得不提开发模式的几次改进。微服务又解决了什么问题呢。为什么有人很厌恶它,有人喜欢他呢?当然有人还可能杠一下,现在都有更先进的概念:无服务器架构Serverless 等等,这里就不去杠了,爱谁谁吧。

传统的系统,都是1个项目撸完,从管理,到前端,各种模块无限制的网上叠加。导致维护和升级都非常困难,比如想试试thinkphp6吧,以前代码不支持。业务量大了,想分布式部署吧,每台机器全部业务代码都得部署一次,而且每台机器都得是全环境。少一个都运行不了。

微服务解决了什么?把一个系统里的各个功能模块给拆分出来,独立运行,提供接口给其他模块用。 这时候出现了一个问题,服务多了,服务地址不好管理,你可以把所有服务的ip和端口记下来,每次上新服务或者下服务的时候全部去改一次。 太累了。这个时候就出现了服务注册和发现

什么是服务注册和发现呢,可以理解为,启动一个进程,所有服务上线都告知这个进程我在这个ip的这个端口有某项服务,你负责通知所有在你这里注册的服务更新下自己的服务列表,把我加进去, 然后大家就可以愉快的互相调用,整个过程是自动的。 当然完善的服务注册与发现还有很多细化的功能。 这里有点需要注意,rpc接口是对内的,不开放外网的,而且一般小系统是服务之间是直连的,大的架构是有一系列的工具解决授权限流降级等问题的,这里我们不做讨论,这个功能之针对小业务系统

内部服务的服务注册和发现有了,,这个时候问题又来了,服务都分散成小应用了,前端需要的接口,难道我前端得准备一个api地址的列表吗?一堆ip和端口,自己去找要调用的api? 这个时候 api网关成为了重要角色,api网关负责转发前端接口到后端提供的rest服务上,前端只用知道api网关的地址即可。至于后端哪些服务在提供就是完全透明的。 当然api网关还有很多的工作需要做,详细可以去了解下kong等api网关的功能,

至此完成了上面一个简易的闭环:前端访问 -> api网关 -> 后端服务api -> rest服务(服务间rcp <-> 调用服务注册发现) <- think-admin管理服务及通过rpc接口管理数据

设计

  • 通过composer create-project topthink/think创建的为一个独立项目
  • 一个项目为一个服务提供者
  • 一个服务提供者可以提供多个接口
  • 自动注册接口到注册中心
  • 有新服务注册,自动更新client列表
  • api网关代理(未完成)

本来按照以前sufame-proxy的模式基于think-swoole写了一个,但是think-swoole升级3.0.5后改动太大,无法兼容,不得已,
又重新撸了这个。 本着最简实现的原则,未改动think-swoole的原有写法,你依然可以按照他原有方式开发。

新的版本,每个服务都可以作为注册中心,当然我没开发自动剔除和选举注册中心,有兴趣的可以修改suframeProxy.php里面的注册地址
通过回调函数读取zeekooper,作为注册中心,保证实时切换,不过目前先不用考虑,我们只用一个负载不高,又常驻的作为注册中心即可,
后面集成到think-admin后,推荐think-admin作为注册中心。

教程

先来体验一下吧:

你当然也可以根据https://github.com/suframe/think中的快速体验clone demo进行体验,下面的步骤是让你一步步创建自己的服务。

一.创建1个thinkphp项目作为服务

composer create-project topthink/think server1
cd server1
composer require suframe/think:dev-master

二.复制server1命名为 server2

cp -r server1 server2

三.修改配置

1. 进入serve1目录
2. 打开config/swoole.php

修改server.port为8090
如果2个服务在2台机器的话,修改server.host为0.0.0.0
修改rpc.server.enable 为true
修改rpc.server.port 为8091
修改rpc.client => include(__DIR__ . '/suframeRpcClient.php');

3. 打开config/suframeProxy.php,

注意每个服务的path和name都是唯一的,非容器模式下,同一台服务器port和rpcPort也是唯一的

path => '/news' 为你想注册的api网关根路径,例如/news, 
name => 'news' 为你服务的名称(只能是英文字母)
registerServer => [
    'ip' => '127.0.0.1' //选一个应用作为服务注册的应用,这里就选第一个
    'port' => 8091
]
4. app下新建文件夹 rpc和 rpc/interfaces
5. 新建接口

rpc/interfaces目录下新建个服务接口 NewsInterface.php

<?php
namespace app\rpc\interfaces;

interface NewsInterface
{
   function get($name);
}
6. 新建服务文件

rpc/ 新建文件NewsService.php

<?php
namespace app\rpc;
use interfaces\NewsInterface;

class NewsService impelement NewsInterface
{
  function get($name)
  {
    return 'hello news ' . $name;
  }
}
7. 将NewsService注册到服务中去

打开config/swoole.php

rpc.server.services => [
    \app\rpc\NewsService::class,
]

启动swoole

php think swoole

8. server2同样处理,命名为goods或者你喜欢的名字,然后启动

9. server1中调用server2的服务测试

打开文件 app/controller/Index.php,增加个测试方法

 public function rpctest(\rpc\contarct\goods\GoodsInterface $goods)
    {
        return $goods->get('sever 1 call serve 2');
    }

10. 访问http://127.0.0.1:8090

ps:遇到swoole卡住无法重启的情况,
第一检测runtime目录下是否有swoole.pid,有则删除
第二:运行ps -ef | grep swoole | grep -v grep | cut -c 9-15 | xargs kill -9

标签: 无

发表评论: