首頁  >  文章  >  php框架  >  關於Nacos解決laravel多環境下配置切換

關於Nacos解決laravel多環境下配置切換

藏色散人
藏色散人轉載
2021-02-19 17:03:343252瀏覽

前言對於應用程式運行的環境來說,不同的環境有不同的配置通常是很有用的。例如,你可能希望在本地使用的快取驅動不同於生產伺服器所使用的快取驅動。

痛點

.env 配置無法區分多環境(開發,測試,生產)

    .env
  • 設定共享太麻煩(團隊區域網路環境)
  • 設定無法即時管理,增刪改設定
  • 自動化部署設定
  • .env

    檔案過於繁瑣

  • Nacos 簡介

  • Nacos 是阿里巴巴最新開源的項目,核心定位是「一個更容易幫助建立雲端原生應用程式的動態服務發現、配置和服務管理平台”,專案位址:nacos.io/zh-cn/

應用程式

這裡主要使用了

Nacos

的組態管理,並沒有使用到動態服務等功能。原理也很簡單,透過介面直接修改 .env 檔案。 Nacos 服務可以直接使用使用阿里雲提供的

應用程式設定管理

,無須安裝。連結如下: acmnext.console.aliyun.com/#代碼<pre class="brush:php;toolbar:false">&lt;?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 = &amp;#39;nacos {action?}&amp;#39;; private $accessKey; private $secretKey; private $endpoint = &amp;#39;acm.aliyun.com&amp;#39;; private $namespace; private $dataId; private $group; private $port = 8080; private $client; private $serverUrl; /** * The console command description. * * @var string */ protected $description = &amp;#39;Nacos 管理工具&amp;#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-&gt;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.&quot;+&quot;;         }         $signStr = $signStr.$timeStamp;         return base64_encode(hash_hmac(             'sha1',             $signStr,             $this-&gt;secretKey,             true         ));     }}</pre>

##使用範例

註冊帳號,開通服務這些就不說了

.env 添加配置項

NACOS_ACCESS_KEY
  1. NACOS_SECRET_KEY
  2. php artisan nacos 0取得設定php artisan nacos 1 發布設定php artisan nacos 2 刪除設定
  3. ##設定項說明
  4. 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
  5. 總結

使用nacos 後,再也不用擔心.env.example 忘記加組態項,共用設定也不是件麻煩事了,自動部署也不需要頻繁的改動配置了。                        

#

以上是關於Nacos解決laravel多環境下配置切換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除