12、Hyperf 3 微服务系列 - Nacos 配置中心

作者: 温新

分类: 【Hyperf 3 微服务系列】

阅读: 2208

时间: 2023-05-29 15:40:24

hi,我是温新,一名 PHPer

Hyperf 3 微服务代码已上传至 Github:https://github.com/ziruchu/hyperf3-microservice-code

何为配置中心

配置中心用于统一管理各种应用配置的基础服务组件。

大白话:就是把你某个服务需要的配置交给另外一个配置中心去管理。

为何需要配置中心

微服务部署时,一个服务提供者可能有 N 多个小模块,如果需要改动某个配置,那么这 N 个小模块都需要改。配置中心的作用就是改一个,所有的都改了。

举例说明:卖方的方式,把房子的钥匙交给中介,有人要看房的时候就去找中介拿钥匙,而不是找你。假如一天有 100 人看房,没有中介,是不是得找你 100 次。

Hyperf 3.0 中的配置中心

Hyperf 配置中心支持 Nacos、Apollo、Aliyun ACM、Etcd、Zookeeper 等。

Hyperf 3.0 使用 Nacos 配置中心

在这里,使用 192.168.31.92 这台服务器上的 note_provider_user_9605 应用进行演示。

第一步:安装 nacos 组件
composer require hyperf/config-nacos
第二步:生成配置中心文件
# 该命名会在 config/autoload 目录下生成 config_center.php 文件
php bin/hyperf.php vendor:publish hyperf/config-center
第三步:修改 config_center.php 配置文件
<?php
// config/autoload/config_center.php
declare(strict_types=1);

use Hyperf\ConfigApollo\PullMode;
use Hyperf\ConfigCenter\Mode;

return [
    'enable'  => (bool)env('CONFIG_CENTER_ENABLE', true),
    'driver'  => env('CONFIG_CENTER_DRIVER', 'nacos'),
    'mode'    => env('CONFIG_CENTER_MODE', Mode::PROCESS),
    'drivers' => [
        'nacos' => [
            'driver'          => Hyperf\ConfigNacos\NacosDriver::class,
            'merge_mode'      => Hyperf\ConfigNacos\Constants::CONFIG_MERGE_OVERWRITE,
            'interval'        => 3,
            // listener_config 下可以配置多个监听对象
            // default_key 表示默认的 key
            'default_key'     => 'hyperf_config',
            'listener_config' => [
                // dataId, group, tenant, type, content
                'hyperf_config' => [
                    'tenant'  => 'hyperf', // 命名空间id
                    'data_id' => 'hyperf-service-config', // DataID
                    'group'   => 'DEFAULT_GROUP', // 分组ID
                    'type'    => 'json' // 格式,我们一般选择 json 或者 yaml
                ],
            ],
            'client'          => [
                // nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
                // 'uri' => '',
                'host'     => '192.168.31.90',
                'port'     => 8848,
                'username' => 'nacos',
                'password' => 'nacos',
                'guzzle'   => [
                    'config' => null,
                ],
            ],
        ],
    ],
];

注意 default_key 的值,后续获取配置中心的配置会用到它。

第四步:Nacos 管理中添加配置

打开 Nacos web 管理界面,在这里添加配置。添加配置的时候注意,选择命名空间为 hyperf 的添加。

添加配置时,配置格式选择 json

添加完成后,可以在配置列表中看到添加的配置。

第五步:编写测试代码

1、添加接口方法

<?php
// app/JsonRpc/Interface/UserServiceInterface.php
public function config();

2、实现接口方法

<?php
// app/JsonRpc/Service/UserService.php
// 获取配置中心的配置
public function config()
{
    $config = ApplicationContext::getContainer()->get(ConfigInterface::class);

    return ResponseTool::success([
        'info' => $config->get('hyperf_config'),
    ]);
}
第六步:测试

测试一:使用 postman 进行测试配置是否生效

POST请求 http://192.168.31.92:9605
请求参数
{
    "jsonrpc": "2.0",
    "method": "/user/config",
    "params": {
    },
    "id": "",
    "context": []
}
返回结果
{
    "jsonrpc": "2.0",
    "id": "",
    "result": {
        "code": 200,
        "message": "success",
        "data": {
            "info": {
                "info": "测试配置中心",
                "client": {
                    "host": "192.168.31.90",
                    "port": 8848,
                    "guzzle": {
                        "config": null
                    }
                }
            }
        }
    },
    "context": []
}

测试二:配置中心修改配置,不重新启动服务,看配置是否生效

修改配置中心的内容,如下:

{
    "info": "测试配置中心",
    "webname":"自如初博客",
    "client": {
        "host": "192.168.31.90",
        "port": 8848,
        "guzzle": {
            "config": null
        }
    }
}

重新请求服务就能看到配置内容已经变成最新的内容了。

环境区分

如何区分不同的环境?如开发环境、生产环境,可以对 DataID 的值进行区分,如采用 app_name 和 app_env 组合,如下参考:

'listener_config' => [
    'hyperf_env' => [
        'tenant' => 'hyperf', // 命名空间id
        'data_id' => env('APP_NAME') . "_" . env("APP_ENV"), // DataID
        'group' => 'DEFAULT_GROUP', // 分组ID
        'type' => 'json'
    ],
],

本篇文章到此结束,我是温新。

请登录后再评论