微服务
在传统的开发模式中,我们通常将系统的各个服务部署在单台机器。随着服务器的扩展,这种方式已经完全无法满足系统大规模的扩展需要,分布式系统由此诞生。
在分布式的基础上,进一步发展了微服务的概念。
微服务是一种架构风格,一个大型的复杂软件应用由一个或多个微服务组成。系统中的各个微服务课被独立部署,各个为微服务之间是松耦合的。
更好的微服务文章:https://www.cnblogs.com/stulzq/p/8573828.html
RPC
RPC (Remote Procedure Call
,远程过程调用) 允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。简单的来说就是通过一定的协议和方法,使得调用远程计算机上的服务就像调用本地服务一样。
RPC的诞生让构建分布式应用更容易,极大地扩大了系统的可扩展性和容错性。为复杂业务逻辑的系统进行服务化改造和高可用性升级提供了可能。
回顾历史RPC分为三代
第一代
CORBA
DCOM (分布式组件模型)
Java RMI (Java远程调用接口)
第一代的特点是实现复杂,没有统一的标准,大多来自巨头的私有实现,跨平台性不佳。
第二代
XML-RPC
SOAP
WebService
特点是使用http协议+xml来解决跨平台的问题。但是规范比较复杂。使用率不高。鉴于第二代早起RPC存在的缺点。随后出现了一批改良过的框架。
PHPRPC
、Hprose
、JSON-RPC
、Hession
、Thrift
。
这类RPC的特点是跨平台性和多语言兼容有了更大的发展,也支持动态RPC调用,但仍停留在方法的调用为主的设计上。
第三带 RPC
dobbo
motan
ZeroC Ice
gRPC
这一代的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;
}
}