登录  /  注册
首页 > php框架 > Laravel > 正文

关于Nacos解决laravel多环境下配置切换

藏色散人
发布: 2021-02-19 17:03:34
转载
3022人浏览过

下面由Laravel教程栏目给大家介绍Nacos 解决 laravel 多环境下配置切换的方法 ,希望对需要的朋友有所帮助!

前言

对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。例如,你可能希望在本地使用的缓存驱动不同于生产服务器所使用的缓存驱动。

痛点

  • .env 配置不能区分多环境(开发,测试,生产)
  • .env 配置共享太麻烦(团队局域网环境)
  • 配置不能实时管理,增删改配置

  • 自动化部署配置 .env 文件过于繁琐

Nacos 简介

Nacos 是阿里巴巴最新开源的项目,核心定位是 “一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”,项目地址:nacos.io/zh-cn/

应用

这里主要使用了 Nacos 的配置管理,并没有使用到动态服务等功能。原理也很简单,通过接口直接修改 .env 文件。Nacos 服务可以直接使用使用阿里云提供的 应用配置管理,无须安装。链接如下: acmnext.console.aliyun.com/

代码

<?php namespace App\Console\Commands;use GuzzleHttp\Client;use Illuminate\Console\Command;use Illuminate\Support\Facades\Artisan;use Illuminate\Support\Facades\Validator;class NacosTools extends Command{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = &#39;nacos {action?}&#39;;

    private $accessKey;
    private $secretKey;
    private $endpoint = &#39;acm.aliyun.com&#39;;
    private $namespace;
    private $dataId;
    private $group;
    private $port = 8080;
    private $client;

    private $serverUrl;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;Nacos 管理工具&#39;;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     * @throws \Exception
     */
    public function handle()
    {
        $this->accessKey = env('NACOS_ACCESS_KEY');
        $this-&gt;secretKey = env('NACOS_SECRET_KEY');
        $this-&gt;endpoint = env('NACOS_ENDPOINT');
        $this-&gt;namespace = env('NACOS_NAMESPACE');
        $this-&gt;port = env('NACOS_PORT', $this-&gt;port);
        $this-&gt;dataId = env('NACOS_DATA_ID');
        $this-&gt;group = env('NACOS_GROUP');

        if (!$this-&gt;validate()) {
            $this-&gt;error('请检查配置参数');

            return;
        }

        $this-&gt;client = new Client(['verify' =&gt; false]);

        $this-&gt;info('Nacos 配置工具');

        $actions = [
            '获取配置',
            '发布配置',
            '删除配置',
        ];

        if (is_null($this-&gt;argument('action'))) {
            $action = $this-&gt;choice('请选择操作',
                $actions,
                $actions[0]);
        } else {
            if (in_array($this-&gt;argument('action'), array_keys($actions))) {
                $action = $actions[$this-&gt;argument('action')];
            } else {
                $action = $this-&gt;choice('请选择操作',
                    $actions,
                    $actions[0]);
            }
        }

        $this-&gt;do($action);
    }

    public function do($action = '获取配置')
    {
        switch ($action) {
            default:
            case '获取配置':
                $config = $this-&gt;getConfig();

                if ($config) {
                    file_put_contents('.env', $config);
                    $this-&gt;info('获取配置成功');
                } else {
                    $this-&gt;error('获取配置失败');
                }

                break;
            case '发布配置':
                if ($this-&gt;publishConfig()) {
                    $this-&gt;info('发布配置成功');
                } else {
                    $this-&gt;error('发布配置失败');
                }

                break;

            case '删除配置':
                if ($this-&gt;removeConfig()) {
                    $this-&gt;info('删除配置成功');
                } else {
                    $this-&gt;error('删除配置失败');
                }

                break;
        }
    }

    /**
     * 验证配置参数
     *
     * Date: 2020/6/10
     * @return bool
     */
    private function validate()
    {
        $data = [
            'accessKey' =&gt; $this-&gt;accessKey,
            'secretKey' =&gt; $this-&gt;secretKey,
            'endpoint'  =&gt; $this-&gt;endpoint,
            'namespace' =&gt; $this-&gt;namespace,
            'dataId'    =&gt; $this-&gt;dataId,
            'group'     =&gt; $this-&gt;group,
        ];

        $rules = [
            'accessKey' =&gt; 'required',
            'secretKey' =&gt; 'required',
            'endpoint'  =&gt; 'required',
            'namespace' =&gt; 'required',
            'dataId'    =&gt; 'required',
            'group'     =&gt; 'required',
        ];

        $messages = [
            'accessKey.required' =&gt; '请填写`.env`配置 NACOS_ACCESS_KEY',
            'secretKey.required' =&gt; '请填写`.env`配置 NACOS_SECRET_KEY',
            'endpoint.required'  =&gt; '请填写`.env`配置 NACOS_ENDPOINT',
            'namespace.required' =&gt; '请填写`.env`配置 NACOS_NAMESPACE',
            'dataId.required'    =&gt; '请填写`.env`配置 NACOS_DATA_ID',
            'group.required'     =&gt; '请填写`.env`配置 NACOS_GROUP',
        ];

        $validator = Validator::make($data, $rules, $messages);

        if ($validator-&gt;fails()) {
            foreach ($validator-&gt;getMessageBag()-&gt;toArray() as $item) {
                foreach ($item as $value) {
                    $this-&gt;error($value);
                }
            }

            return false;
        }

        return true;
    }

    /**
     * 获取配置
     *
     * Date: 2020/6/10
     * @return bool
     */
    private function getConfig()
    {
        $acmHost = str_replace(['host', 'port'], [$this-&gt;getServer(), $this-&gt;port],
            'http://host:port/diamond-server/config.co');

        $query = [
            'dataId' =&gt; urlencode($this-&gt;dataId),
            'group'  =&gt; urlencode($this-&gt;group),
            'tenant' =&gt; urlencode($this-&gt;namespace),
        ];

        $headers = $this-&gt;getHeaders();

        $response = $this-&gt;client-&gt;get($acmHost, [
            'headers' =&gt; $headers,
            'query'   =&gt; $query,
        ]);

        if ($response-&gt;getReasonPhrase() == 'OK') {
            return $response-&gt;getBody()-&gt;getContents();
        } else {
            return false;
        }
    }

    /**
     * 发布配置
     *
     * Date: 2020/6/10
     * @return bool
     */
    public function publishConfig()
    {
        $acmHost = str_replace(
            ['host', 'port'],
            [$this-&gt;getServer(), $this-&gt;port],
            'http://host:port/diamond-server/basestone.do?method=syncUpdateAll');

        $headers = $this-&gt;getHeaders();

        $formParams = [
            'dataId'  =&gt; urlencode($this-&gt;dataId),
            'group'   =&gt; urlencode($this-&gt;group),
            'tenant'  =&gt; urlencode($this-&gt;namespace),
            'content' =&gt; file_get_contents('.env'),
        ];

        $response = $this-&gt;client-&gt;post($acmHost, [
            'headers'     =&gt; $headers,
            'form_params' =&gt; $formParams,
        ]);

        $result = json_decode($response-&gt;getBody()-&gt;getContents(), 1);

        return $result['message'] == 'OK';
    }

    public function removeConfig()
    {
        $acmHost = str_replace(['host', 'port'], [$this-&gt;getServer(), $this-&gt;port],
            'http://host:port/diamond-server//datum.do?method=deleteAllDatums');

        $headers = $this-&gt;getHeaders();

        $formParams = [
            'dataId' =&gt; urlencode($this-&gt;dataId),
            'group'  =&gt; urlencode($this-&gt;group),
            'tenant' =&gt; urlencode($this-&gt;namespace),
        ];

        $response = $this-&gt;client-&gt;post($acmHost, [
            'headers'     =&gt; $headers,
            'form_params' =&gt; $formParams,
        ]);

        $result = json_decode($response-&gt;getBody()-&gt;getContents(), 1);

        return $result['message'] == 'OK';
    }

    /**
     * 获取配置服务器地址
     *
     * Date: 2020/6/10
     * @return string
     */
    private function getServer()
    {
        if ($this-&gt;serverUrl) {
            return $this-&gt;serverUrl;
        }

        $serverHost = str_replace(
            ['host', 'port'],
            [$this-&gt;endpoint, $this-&gt;port],
            'http://host:port/diamond-server/diamond');

        $response = $this-&gt;client-&gt;get($serverHost);

        return $this-&gt;serverUrl = rtrim($response-&gt;getBody()-&gt;getContents(), PHP_EOL);
    }

    /**
     * 获取请求头
     *
     * Date: 2020/6/10
     * @return array
     */
    private function getHeaders()
    {
        $headers = [
            'Diamond-Client-AppName' =&gt; 'ACM-SDK-PHP',
            'Client-Version'         =&gt; '0.0.1',
            'Content-Type'           =&gt; 'application/x-www-form-urlencoded; charset=utf-8',
            'exConfigInfo'           =&gt; 'true',
            'Spas-AccessKey'         =&gt; $this-&gt;accessKey,
            'timeStamp'              =&gt; round(microtime(true) * 1000),
        ];

        $headers['Spas-Signature'] = $this-&gt;getSign($headers['timeStamp']);

        return $headers;
    }

    /**
     * 获取签名
     *
     * @param $timeStamp
     * Date: 2020/6/10
     * @return string
     */
    private function getSign($timeStamp)
    {
        $signStr = $this-&gt;namespace.'+';

        if (is_string($this-&gt;group)) {
            $signStr .= $this-&gt;group."+";
        }

        $signStr = $signStr.$timeStamp;

        return base64_encode(hash_hmac(
            'sha1',
            $signStr,
            $this-&gt;secretKey,
            true
        ));
    }}
登录后复制

使用示例

  1. 注册账号,开通服务这些就不说了
  2. .env 添加配置项 NACOS_ACCESS_KEY NACOS_SECRET_KEY
  3. php artisan nacos 0 获取配置
  4. php artisan nacos 1 发布配置
  5. php artisan nacos 2 删除配置

配置项说明

NACOS_ENDPOINT= #nacos节点 如使用阿里云服务 即:acm.aliyun.comNACOS_DATA_ID= #项目ID 可以填项目名NACOS_GROUP= #分组ID 这里可以用于区分环境 建议 local production test 等值NACOS_NAMESPACE= # 命名空间 建议用来区分服务器 server-A server-BNACOS_ACCESS_KEY= #阿里云access_key 建议使用子账号access_keyNACOS_SECRET_KEY= #阿里云secret_key 建议使用子账号secret_key
登录后复制

总结

使用 nacos 后,再也不用担心 .env.example 忘记加配置项,共享配置也不是件麻烦事了,自动部署也不需要频繁的改动配置了。                        

以上就是关于Nacos解决laravel多环境下配置切换的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:learnku网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号