>  기사  >  PHP 프레임워크  >  laravel 다중 환경에서 구성 전환을 해결하는 Nacos 정보

laravel 다중 환경에서 구성 전환을 해결하는 Nacos 정보

藏色散人
藏色散人앞으로
2021-02-19 17:03:343251검색

에서는 Laravel에서 많은 환경을 해결하기 위해 NACOS의 전환을 설정하는 방법을 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다! 머리말

애플리케이션이 실행되는 환경의 경우 환경마다 다른 구성을 사용하는 것이 유용한 경우가 많습니다. 예를 들어 프로덕션 서버에서 사용하는 것과 다른 캐시 드라이버를 로컬로 사용하려고 할 수 있습니다.

고점

.env 구성이 여러 환경(개발, 테스트, 프로덕션)을 구분할 수 없음.env 구성 공유가 너무 번거로움 (팀 LAN 환경)

    구성을 실시간으로 관리할 수 없고 구성의 추가, 삭제, 수정이 가능합니다
  • .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->secretKey = env('NACOS_SECRET_KEY');
        $this->endpoint = env('NACOS_ENDPOINT');
        $this->namespace = env('NACOS_NAMESPACE');
        $this->port = env('NACOS_PORT', $this->port);
        $this->dataId = env('NACOS_DATA_ID');
        $this->group = env('NACOS_GROUP');

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

            return;
        }

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

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

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

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

        $this->do($action);
    }

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

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

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

                break;

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

                break;
        }
    }

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

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

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

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

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

            return false;
        }

        return true;
    }

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

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

        $headers = $this->getHeaders();

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

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

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

        $headers = $this->getHeaders();

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

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

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

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

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

        $headers = $this->getHeaders();

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

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

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

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

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

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

        $response = $this->client->get($serverHost);

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

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

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

        return $headers;
    }

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

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

        $signStr = $signStr.$timeStamp;

        return base64_encode(hash_hmac(
            'sha1',
            $signStr,
            $this->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

자동 배포 구성 .env 파일이 너무 번거롭습니다🎜 🎜🎜🎜 Nacos 소개🎜🎜Nacos는 Alibaba의 최신 오픈 소스 프로젝트입니다. Nacos의 핵심 포지셔닝은 "클라우드 네이티브 애플리케이션 구축을 더 쉽게 해주는 동적 서비스 검색, 구성 및 서비스 관리 플랫폼입니다. " 프로젝트 주소 : nacos.io/zh-cn/🎜🎜 🎜🎜Application🎜🎜 주로 Nacos의 구성 관리를 사용하며, 동적 서비스 등의 기능은 사용하지 않습니다. 원리도 매우 간단합니다. 인터페이스를 통해 .env 파일을 직접 수정하면 됩니다. 나코스 서비스는 알리바바 클라우드에서 제공하는 애플리케이션 구성 관리를 이용하면 설치 없이 바로 사용할 수 있습니다. 링크는 다음과 같습니다: acmnext.console.aliyun.com/🎜🎜🎜🎜Code🎜rrreee🎜🎜🎜사용 예시🎜
    🎜계정 등록 및 서비스 활성화에 대한 자세한 내용은 다루지 않겠습니다🎜 .env code> 구성 항목 추가 <code>NACOS_ACCESS_KEY NACOS_SECRET_KEY 등🎜php artisan nacos 0 구성 가져오기🎜php artisan nacos 1 게시 구성🎜php artisan nacos 2 구성 삭제
🎜🎜🎜구성 항목 설명🎜rrreee🎜🎜🎜Summary🎜🎜nacos를 사용한 후에는 더 이상 에 대해 걱정할 필요가 없습니다. >.env.example 구성 항목 추가를 잊어버리면 공유 구성이 더 이상 번거롭지 않으며 자동 배포에서는 구성을 자주 변경할 필요가 없습니다. ~

위 내용은 laravel 다중 환경에서 구성 전환을 해결하는 Nacos 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제