Laravel 複数環境での構成切り替えを解決する Nacos について

藏色散人
リリース: 2021-02-19 17:03:34
転載
3245 人が閲覧しました

次のコラムでは、Laravelチュートリアルコラムから、Nacosによる複数環境でのlaravelの設定切り替えを解決する方法を紹介します。必要!

まえがき

アプリケーションが実行される環境では、環境ごとに異なる構成を使用すると便利なことがよくあります。たとえば、運用サーバーで使用されているキャッシュ ドライバーとは異なるキャッシュ ドライバーをローカルで使用したい場合があります。

#問題点

  • .env構成で複数の環境 (開発、テスト、運用) を区別できない
  • .env設定の共有が面倒(チームLAN環境)
  • リアルタイムに設定管理ができず、設定の追加、削除、変更が必要

  • 自動展開構成

    .envファイルは面倒すぎます

Nacos の紹介

Nacos は Alibaba の最新製品ですオープン ソース プロジェクト。その中心的な位置づけは「クラウド ネイティブ アプリケーション向けの動的なサービス検出、構成、およびサービス管理プラットフォームの構築を容易にする」、プロジェクト アドレス: nacos.io/zh-cn/

Application

主にここで使用する

Nacosの構成管理を行い、動的サービスなどの機能は使用しません。原理も非常に単純で、インターフェイスを通じて.envファイルを直接変更します。 Nacos サービスは、Alibaba Cloud が提供するApplication Configuration Managementを使用して、インストールせずに直接使用できます。リンクは次のとおりです: acmnext.console.aliyun.com/

コード
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. .env設定項目を追加しますNACOS_ACCESS_KEYNACOS_SECRET_KEYなど
  2. php 職人 nacos 0 設定の取得
  3. php 職人 nacos 1 設定の公開
  4. ##php 職人 nacos 2 設定の削除
  5. ##設定項目の説明
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について心配する必要はなくなりました。設定項目の追加を忘れると、共有設定が反映されなくなります。トラブルが発生し、自動展開が行われないため、頻繁に構成を変更する必要があります。

以上がLaravel 複数環境での構成切り替えを解決する Nacos についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!