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

上一篇:颠覆传统!Webman高性能框架实现Nacos微服务动态配置服务的全面突破 介绍了基础和配置中心如何使用。

介绍

什么是服务注册与发现

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

服务注册

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

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

服务发现

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

服务注册与发现中的作用

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

服务注册

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

服务发现

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

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

Nacos 服务注册流程

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

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

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

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

2、服务提供者的注册

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

注册的过程一般如下:

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

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

/**
 * @desc nacos 服务注册
 * @author Tinywan(ShaoBo Wan)
 */

public function nacosRegister()
{
    $client = WorkbunnyWebmanNacosClient::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 调用服务。

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

/**
 * @desc nacos 服务发现
 * @author Tinywan(ShaoBo Wan)
 */
public function nacosService()
{
    $client = WorkbunnyWebmanNacosClient::channel();

    /**
     * 根据服务名称获取实例列表
     */
    $instanceJson = $client->instance->list('http-service', []);
    if (false === $instanceJson) {
        echo ' [x] 暂无实例列表'"n";
        return $client->instance->getMessage();
    }
    $instanceList = json_decode($instanceJsontrue);

    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($resulttrue), 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);
}

服务请求打印输出结果

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

以上就是服务注册与发现的基本概念,以及 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 来进行服务注册

创建一个简单的订单服务

declare(strict_types=1);

namespace appcontroller;

use supportRequest;
use supportResponse;

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 = WorkbunnyWebmanNacosClient::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);
}
解锁高性能!Webman框架驱动下的Nacos微服务注册与发现实践

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

  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 客户端实现对服务提供者的调用
/**
 * @desc nacos 服务发现
 * @author Tinywan(ShaoBo Wan)
 */
public function nacosService()
{
    $client = WorkbunnyWebmanNacosClient::channel();
    $instanceJson = $client->instance->list('http-webman-8781', []);
    if (false === $instanceJson) {
        echo ' [x] 暂无实例列表'"n";
        return $client->instance->getMessage();
    }
    $instanceList = json_decode($instanceJsontrue);

    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($resulttrue), JSON_UNESCAPED_UNICODE), "n";

        echo "n";
    }
}

消费者执行结果如下

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

其他

元数据格式

{
    "version""v1.0.0",
    "protocol""http",
    "name""http-service"
}

原文始发于微信公众号(开源技术小栈):解锁高性能!Webman框架驱动下的Nacos微服务注册与发现实践

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/248215.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!