微服务

在传统的开发模式中,我们通常将系统的各个服务部署在单台机器。随着服务器的扩展,这种方式已经完全无法满足系统大规模的扩展需要,分布式系统由此诞生。

在分布式的基础上,进一步发展了微服务的概念。

微服务是一种架构风格,一个大型的复杂软件应用由一个或多个微服务组成。系统中的各个微服务课被独立部署,各个为微服务之间是松耦合的。

更好的微服务文章:https://www.cnblogs.com/stulzq/p/8573828.html

RPC

RPC (Remote Procedure Call,远程过程调用) 允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。简单的来说就是通过一定的协议和方法,使得调用远程计算机上的服务就像调用本地服务一样。

RPC的诞生让构建分布式应用更容易,极大地扩大了系统的可扩展性和容错性。为复杂业务逻辑的系统进行服务化改造和高可用性升级提供了可能。

回顾历史RPC分为三代

第一代

第一代的特点是实现复杂,没有统一的标准,大多来自巨头的私有实现,跨平台性不佳。

第二代

特点是使用http协议+xml来解决跨平台的问题。但是规范比较复杂。使用率不高。鉴于第二代早起RPC存在的缺点。随后出现了一批改良过的框架。

PHPRPCHproseJSON-RPCHessionThrift

这类RPC的特点是跨平台性和多语言兼容有了更大的发展,也支持动态RPC调用,但仍停留在方法的调用为主的设计上。

第三带 RPC

这一代的RPC除了提供了方法调用的传统RPC功能外,更多加入了方法治理的功能。

在PHP的swoft框架中使用微服务框架

调用端代码

先修改实例中或自己新建配置配置、客户端(调用端)。

图

uri可以定义多个。自动做负载均衡。uri配置的是服务端的ip和端口。

在app目录下的lib中定义ICourse.php文件

use Swoft\Sg\Bean\Annotation\Breaker;
use Swoft\Bean\Annotation\Value;
use Swoft\Sg\Circuit\CircuitBreaker;

/**
 * the breaker of user
 *
 * @Breaker("Course")
 */
class CourseBreaker extends CircuitBreaker

注意@Breaker(“Course”) 是下面CourseBreaker的声明。

定义Pool池用来连接RPC服务的。

namespace App\Pool;

use Swoft\Bean\Annotation\Inject;
use Swoft\Bean\Annotation\Pool;
use App\Pool\Config\UserPoolConfig;
use Swoft\Rpc\Client\Pool\ServicePool;

/**
 * the pool of user service
 *
 * @Pool(name="user")
 */
class UserServicePool extends ServicePool
{
    /**
     * @Inject()
     *
     * @var UserPoolConfig
     */
    protected $poolConfig;
}

@Pool(name=”user”) 声明这个类的连接池名字叫user。由于swoft用的是注解、那么用的时候也用这个名字,代码如下

    /**
     * @Reference("user",breaker="Course",Version="1.0");
     * @var Icourse
     */
    private $courseService;

调用代码

    /**
     * @RequestMapping(route="course/{id}")
     * @param int $id
     */
    public function getCourseInfo(int $id)
    {
        $course=$this->courseService->getCourseInfo($id);
        return $course;
    }

服务端代码

由于官网文档不太清晰、这里详细记录。

图片

服务端之实现服务代码即可

namespace App\Services;


use App\Lib\ICourse;
use Swoft\Core\ResultInterface;
use Swoft\Db\Query;
use Swoft\Rpc\Server\Bean\Annotation\Service;

/**
 * @Service(Version="1.o")
 * @method ResultInterface deferGetCourseInfo(int $id)
 */
class CourseService implements ICourse
{

    /**
     * @param int $id
     * @return mixed
     */
    public function getCourseInfo(int $id)
    {
        $data=Query::table('wk_courses')->where('id',$id)->one()
            ->getResult();
        return $data;
    }
}
Last modification:February 1, 2020
如果觉得我的文章对你有用,请随意赞赏