服务注册与发现是微服务架构中的核心概念,它可以使服务提供者和消费者能相互发现和交互。
服务注册是指服务提供者在启动时,将自己的服务信息注册到注册中心。服务信息可能包括服务的 IP 地址、端口号、接口信息等。
注册成功后,服务提供者会定期向注册中心发送心跳,告知其依然处于活动状态。这种机制可以帮助服务消费者知道哪些服务是可用的,从而实现动态的服务调用。
服务发现是指服务消费者从注册中心获取服务提供者的信息,并根据这些信息调用服务提供者的过程。服务发现的过程中会考虑多种因素,如网络延迟、服务的负载情况等,从而实现负载均衡和高可用。这种机制极大地提高了系统的伸缩性和灵活性。
Nacos 是一种开源的、动态服务发现、配置和服务管理平台,它在服务注册与发现方面提供了强大的支持
Nacos 提供了一种简单、灵活的方式来注册服务,支持多种注册方式,例如 HTTP、Dubbo、Spring Cloud 等。Nacos 的注册中心能够有效处理服务的注册和注销,保证注册中心的数据准确性。
Nacos 提供了丰富的服务发现机制,支持基于权重的负载均衡、健康检查等。它能够实时感知服务提供者的变化,如服务的上下线、健康状态的变化等,从而为服务消费者提供最新的服务列表。
注册中心是微服务架构中的关键组件之一,它用于存储和维护服务的元信息,如服务的地址、端口、版本、健康状态等。当服务提供者启动时,它会将自身的元信息注册到注册中心,同时服务消费者可以从注册中心获取服务的元信息,以便找到并调用服务。此外,注册中心还负责处理服务的上下线、健康检查、负载均衡等任务。
在微服务架构中,使用注册中心的优点是:
当服务提供者启动时,它会自动向 Nacos 注册中心注册自己的元信息,包括服务名、IP 地址、端口号等。
注册的过程一般如下:
在 webman 中,可以通过简单的来注册服务:
/**
* @desc nacos 服务注册
* @author Tinywan(ShaoBo Wan)
*/
public function nacosRegister()
{
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->instance->register('127.0.0.1', 80, 'http-service-8000', [
'groupName' => 'DEFAULT_GROUP',
'namespaceId' => '',
'enabled' => true,
'ephemeral' => 'false',
'metadata' => [
'version' => '1.0.1',
'grant_type' =>'client_credentials',
'app_key' =>'5f5kz4s08wk4ws',
'app_secret' =>'4s08wk4c444os',
'id' => 10000
],
]);
if (false === $response) {
var_dump($client->instance->getMessage());
}
var_dump($response);
}
服务消费者通过向 Nacos 发送查询请求,来发现并获取服务的元信息。然后,服务消费者就可以根据这些信息来调用服务。
发现的过程一般如下:
服务消费者可以通过以下方式发现服务:
/**
* @desc nacos 服务发现
* @author Tinywan(ShaoBo Wan)
*/
public function nacosService()
{
$client = \Workbunny\WebmanNacos\Client::channel();
/**
* 根据服务名称获取实例列表
*/
$instanceJson = $client->instance->list('http-service', []);
if (false === $instanceJson) {
echo ' [x] 暂无实例列表', "\n";
return $client->instance->getMessage();
}
$instanceList = json_decode($instanceJson, true);
foreach ($instanceList['hosts'] as $instance) {
/**
* 服务元数据进行业务处理
*/
$_metadata = $instance['metadata'];
echo ' [x] [远程接口] [服务元数据] :'. json_encode($_metadata, JSON_UNESCAPED_UNICODE), "\n";
/**
* 程接口服务调用
*/
$_url = 'http://' . $instance['ip'] . ':' . $instance['port'] . '/nacos/v1/auth/users/login';
echo ' [x] [远程接口] [服务请求] :'. $_url, "\n";
// 服务消费者根据返回的元信息,通过 HTTP 或 RPC 调用服务。
$result = $this->curl_get($_url);
echo ' [x] [远程接口] [服务响应] :'. json_encode(json_decode($result, true), JSON_UNESCAPED_UNICODE), "\n";
echo "\n";
}
}
/**
* @desc HTTP服务调用
* @param $url
* @return bool|string
* @author Tinywan(ShaoBo Wan)
*/
public function curl_get($url)
{
$info = curl_init();
curl_setopt($info, CURLOPT_RETURNTRANSFER, true);
curl_setopt($info, CURLOPT_HEADER, 0);
curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($info, CURLOPT_URL, $url);
return curl_exec($info);
}
服务请求打印输出结果
以上就是服务注册与发现的基本概念,以及 Nacos 在其中的作用。
Nacos 注册中心的数据通常保存在内存中,以实现高效的查询。但为了防止数据丢失,Nacos 也会将数据持久化到磁盘中。
此外,如果使用了 Nacos 集群,则每个 Nacos 实例都会持有一份数据的副本。当一个 Nacos 实例接收到服务的注册或注销请求时,它会将数据变更同步到其他所有的 Nacos 实例,以保证数据的一致性。
以上就是 Nacos 服务注册流程的详细介绍,从服务提供者的注册到服务消费者的发现,以及数据的持久化和同步,Nacos 都提供了一套完整的解决方案。在下一节中,我们将通过一个实例来演示 Nacos 的服务注册与发现功能。
以下是使用 webman 构建服务
提供者
的步骤
workbunny/webman-nacos
插件依赖plugin/workbunny/webman-nacos/app.php
文件中配置 Nacos 的服务地址config/server.php
文件中监听端口地址'listen' => 'http://0.0.0.0:8781'
$client->instance->register
来进行服务注册创建一个简单的订单服务
declare(strict_types=1);
namespace app\controller;
use support\Request;
use support\Response;
class OrderController
{
/**
* @desc detail
* @param Request $request
* @param int $id
* @return Response
* @author Tinywan(ShaoBo Wan)
*/
public function detail(Request $request, int $id): Response
{
return json(['code' => 0, 'msg' => $id . ' order detail']);
}
}
服务请求访问地址:http://127.0.0.1:8781/order/detail/10086
{
"code": 0,
"msg": "10086 order detail"
}
/**
* @desc nacos 服务注册
* @author Tinywan(ShaoBo Wan)
*/
public function nacosRegister()
{
$client = \Workbunny\WebmanNacos\Client::channel();
$response = $client->instance->register('192.168.3.88', 8781, 'http-webman-8781', [
'groupName' => 'DEFAULT_GROUP',
'namespaceId' => '',
'enabled' => true,
'ephemeral' => 'false'
]);
if (false === $response) {
var_dump($client->instance->getMessage());
}
var_dump($response);
}
以下是服务提供者注册参数
192.168.3.88
8781
http-webman-8781
以下是使用 webman 构建服务
消费者
的步骤
workbunny/webman-nacos
插件依赖plugin/workbunny/webman-nacos/app.php
文件中配置 Nacos 的服务地址config/server.php
文件中监听端口地址'listen' => 'http://0.0.0.0:8782'
/**
* @desc nacos 服务发现
* @author Tinywan(ShaoBo Wan)
*/
public function nacosService()
{
$client = \Workbunny\WebmanNacos\Client::channel();
$instanceJson = $client->instance->list('http-webman-8781', []);
if (false === $instanceJson) {
echo ' [x] 暂无实例列表', "\n";
return $client->instance->getMessage();
}
$instanceList = json_decode($instanceJson, true);
foreach ($instanceList['hosts'] as $instance) {
$_url = 'http://' . $instance['ip'] . ':' . $instance['port'] . '/order/detail/10086';
echo ' [x] [远程接口] [服务请求] :'. $_url, "\n";
$result = $this->curl_get($_url);
echo ' [x] [远程接口] [服务响应] :'. json_encode(json_decode($result, true), JSON_UNESCAPED_UNICODE), "\n";
echo "\n";
}
}
消费者执行结果如下
{
"version": "v1.0.0",
"protocol": "http",
"name": "http-service"
}