前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解锁高性能!Webman框架驱动下的Nacos微服务注册与发现实践

解锁高性能!Webman框架驱动下的Nacos微服务注册与发现实践

作者头像
Tinywan
发布2023-10-31 15:56:30
5810
发布2023-10-31 15:56:30
举报
文章被收录于专栏:开源技术小栈

介绍

什么是服务注册与发现

服务注册与发现是微服务架构中的核心概念,它可以使服务提供者和消费者能相互发现和交互。

服务注册

服务注册是指服务提供者在启动时,将自己的服务信息注册到注册中心。服务信息可能包括服务的 IP 地址、端口号、接口信息等。

注册成功后,服务提供者会定期向注册中心发送心跳,告知其依然处于活动状态。这种机制可以帮助服务消费者知道哪些服务是可用的,从而实现动态的服务调用。

服务发现

服务发现是指服务消费者从注册中心获取服务提供者的信息,并根据这些信息调用服务提供者的过程。服务发现的过程中会考虑多种因素,如网络延迟、服务的负载情况等,从而实现负载均衡和高可用。这种机制极大地提高了系统的伸缩性和灵活性。

服务注册与发现中的作用

Nacos 是一种开源的、动态服务发现、配置和服务管理平台,它在服务注册与发现方面提供了强大的支持

服务注册

Nacos 提供了一种简单、灵活的方式来注册服务,支持多种注册方式,例如 HTTP、Dubbo、Spring Cloud 等。Nacos 的注册中心能够有效处理服务的注册和注销,保证注册中心的数据准确性。

服务发现

Nacos 提供了丰富的服务发现机制,支持基于权重的负载均衡、健康检查等。它能够实时感知服务提供者的变化,如服务的上下线、健康状态的变化等,从而为服务消费者提供最新的服务列表。

Nacos 服务注册流程

1、注册中心的概念和作用

注册中心是微服务架构中的关键组件之一,它用于存储和维护服务的元信息,如服务的地址、端口、版本、健康状态等。当服务提供者启动时,它会将自身的元信息注册到注册中心,同时服务消费者可以从注册中心获取服务的元信息,以便找到并调用服务。此外,注册中心还负责处理服务的上下线、健康检查、负载均衡等任务。

在微服务架构中,使用注册中心的优点是:

  1. 实现服务的动态发现和调用,提高系统的灵活性和伸缩性。
  2. 简化服务间的通信,降低系统的耦合度。
  3. 提供服务的健康检查和负载均衡功能,增强系统的可用性。

2、服务提供者的注册

当服务提供者启动时,它会自动向 Nacos 注册中心注册自己的元信息,包括服务名、IP 地址、端口号等。

注册的过程一般如下:

  1. 服务提供者启动后,会向 Nacos 发送注册请求,请求中包含服务的元信息。
  2. Nacos 接收到请求后,会将服务的元信息存储在内存数据库中。
  3. 服务提供者会定期向 Nacos 发送心跳,告知其依然处于活动状态。

在 webman 中,可以通过简单的来注册服务:

代码语言:javascript
复制
/**
 * @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);
}

3、服务消费者的发现

服务消费者通过向 Nacos 发送查询请求,来发现并获取服务的元信息。然后,服务消费者就可以根据这些信息来调用服务。

发现的过程一般如下:

  1. 服务消费者向 Nacos 发送查询请求,请求中包含需要调用的服务名。
  2. Nacos 根据服务名返回服务的元信息,包括 IP 地址、端口号等。
  3. 服务消费者根据返回的元信息,通过 HTTP 或 RPC 调用服务。

服务消费者可以通过以下方式发现服务:

代码语言:javascript
复制
/**
 * @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 在其中的作用。

4、持久化和同步

Nacos 注册中心的数据通常保存在内存中,以实现高效的查询。但为了防止数据丢失,Nacos 也会将数据持久化到磁盘中。

此外,如果使用了 Nacos 集群,则每个 Nacos 实例都会持有一份数据的副本。当一个 Nacos 实例接收到服务的注册或注销请求时,它会将数据变更同步到其他所有的 Nacos 实例,以保证数据的一致性。

以上就是 Nacos 服务注册流程的详细介绍,从服务提供者的注册到服务消费者的发现,以及数据的持久化和同步,Nacos 都提供了一套完整的解决方案。在下一节中,我们将通过一个实例来演示 Nacos 的服务注册与发现功能。

服务注册与发现实践

服务提供者的实现

以下是使用 webman 构建服务提供者的步骤

  1. 创建项目: 创建一个 webman 项目,并使用composer引入 workbunny/webman-nacos 插件依赖
  2. 配置 Nacos: 在 plugin/workbunny/webman-nacos/app.php 文件中配置 Nacos 的服务地址
  3. 配置项目端口: 在 config/server.php 文件中监听端口地址'listen' => 'http://0.0.0.0:8781'
  4. 创建服务接口: 实现一个 RESTful API,该接口将被其他服务调用
  5. 注册服务: 使用 $client->instance->register 来进行服务注册

创建一个简单的订单服务

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "code": 0,
  "msg": "10086 order detail"
}

服务注册

代码语言:javascript
复制
/**
 * @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);
}

以下是服务提供者注册参数

  1. 服务ip:192.168.3.88
  2. 服务端口:8781
  3. 服务名称:http-webman-8781

服务消费者的实现

以下是使用 webman 构建服务消费者的步骤

  1. 创建项目: 创建一个 webman 项目,并使用composer引入 workbunny/webman-nacos 插件依赖
  2. 配置 Nacos: 在 plugin/workbunny/webman-nacos/app.php 文件中配置 Nacos 的服务地址
  3. 配置项目端口: 在 config/server.php 文件中监听端口地址'listen' => 'http://0.0.0.0:8782'
  4. 实现调用: 通过前面创建的 HTTP 客户端实现对服务提供者的调用
代码语言:javascript
复制
/**
 * @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";
    }
}

消费者执行结果如下

其他

元数据格式

代码语言:javascript
复制
{
    "version": "v1.0.0",
    "protocol": "http",
    "name": "http-service"
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 什么是服务注册与发现
      • 服务注册
      • 服务发现
    • 服务注册与发现中的作用
      • 服务注册
      • 服务发现
  • Nacos 服务注册流程
    • 1、注册中心的概念和作用
      • 2、服务提供者的注册
        • 3、服务消费者的发现
          • 4、持久化和同步
          • 服务注册与发现实践
            • 服务提供者的实现
              • 服务注册
                • 服务消费者的实现
                • 其他
                  • 元数据格式
                  相关产品与服务
                  微服务引擎 TSE
                  微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档