如何利用swoft搭建一个微服务框架

  1. 环境依赖 ,swoft首先是一个环境的问题,像普通的web服务都是lnmp,这里的swoft就充当了其中的n,其他环境具体的看网上其他攻略,下面我们来安装swoft,用composer下载就好了;

    composer create-project swoft/swoft swoft;

  2. 启动服务

php bin/swoft http:start
在这里插入图片描述
默认的不是80 端口,这里我改了./app/bean.php里面的httpServer参数.

访问网站,有绿色的swoft字体显示就表示成功了,其他表示失败

2.搭建微服务
1、首先把原来的swoft项目copy一下,作为客户端B

2、在项目A配置服务端的配置,修改./app/bean的rpcServer参数,

'rpcServer'          => [
      'class' => ServiceServer::class,
      'port' => 18308,
  ],

如果你想让一个项目在监听http请求的时候还作微服务,那么可以修改httpServer

''httpServer'         => [
       'class'    => HttpServer::class,
       'port'     => 8848,
       'listener' => [
            'rpc' => bean('rpcServer'),
           // 'tcp' => bean('tcpServer'),
       ],
       
       ******

3、写一些逻辑代码,证明我们的东西没有错
这个rpc的代码主要分两部分,一个是service(逻辑代码)还有interface(定义接口规范)。
找到./app/Rpc/lib/下面,创建自己的interface代码,这里可以去copy一下原有的UserInterface.php,然后修改里面的接口名和一些代码就好了,这里我加了一个新的接口规范

	/**
     * @return int
     */
    public function getOne(): string;

然后到./app/Rpc/Service/下面写service代码,这里也可以copy一下原有的Uservice.php他有两个,他还有一个V2,是另外一种写法

	/**
     * @return int
     */
    public function getOne(): string
    {
        $one = '这个getOne';
        return $one;
    }

最后我的目录结构是这样的在这里插入图片描述
启动服务端

php bin/swoft rpc:start

4、搭建客户端,进入刚才copy的项目B里面
修改./app/bean.php找到user和user.pool这两个配置,这是他原本项目里面的东西,主要是要告诉项目,让他知道,如果调用某个服务的时候要去哪个地方调用,我们这两个复制一下,然后改一下前面的user就好了注意:user里面的port要跟另外一个rpcServer的port配置一致

	'goods'               => [
       'class'   => ServiceClient::class,
       'host'    => '127.0.0.1',
       'port'    => 18308,
       'setting' => [
           'timeout'         => 0.5,
           'connect_timeout' => 1.0,
           'write_timeout'   => 10.0,
           'read_timeout'    => 0.5,
       ],
       'packet'  => bean('rpcClientPacket')
   ],
   'goods.pool'          => [
       'class'  => ServicePool::class,
       'client' => bean('goods'),
   ],

配置好这个的还没完,我们还需要再定义一个interface,告诉项目对应的类大致是长什么样的copy一下另一个项目的goodsInterface.php到这个项目里面,也是同样放在Prc/lib/下面

这样就可以实验一下了
找到./app/Http/Controller/RpcController.php将服务给添加上去

/**
     * @Reference(pool="goods.pool")
     *
     * @var GoodsInterface
     */
    private $goodsService;

然后写对应的http接口

/**
     * @RequestMapping("getOne")
     *
     * @return array
     */
    public function getOne(): Response
    {
        $data = $this->goodsService->getOne();
        return context()->getResponse()->withContentType(ContentType::JSON)->withContent($data);
    }

访问http://localhost/rpc/getOne就ok了,如果没有改端口号的记得添加端口号哦在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐