关于Nacos解决laravel多环境下配置切换-Laravel-PHP中文网


本站和网页 https://www.php.cn/phpkj/laravel/470607.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

关于Nacos解决laravel多环境下配置切换-Laravel-PHP中文网首页视频教程 视频课程直播课程精品课学习路径 入门教程独孤九贱玉女心经天龙八部趣味闯关PHP培训资源下载 源码市场商城源码工具下载在线工具手册下载电子课件js特效网站源码网站素材类库下载技术文章 头条前端开发后端开发数据库php框架每日编程社区 问答博客文章APP下载源码市场编程词典APP下载登录注册新课上线千万级数据并发解决方案9块特价自己动手写MVC框架Laravel9Laravel9教程,想学不会都难!限时特价开通VIP会员免费学习热门搜索Laraval9HTML5CSS3JavaScriptjQueryVue.jsLayui入门PHP基础首页 >php框架 >Laravel > 正文关于Nacos解决laravel多环境下配置切换转载2021-02-19 17:03:342435 + 加入Laravel讨论小组
下面由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 = 'nacos {action?}';
private $accessKey;
private $secretKey;
private $endpoint = 'acm.aliyun.com';
private $namespace;
private $dataId;
private $group;
private $port = 8080;
private $client;
private $serverUrl;
/**
* The console command description.
* @var string
*/
protected $description = 'Nacos 管理工具';
/**
* 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
));
}}登录后复制使用示例注册账号,开通服务这些就不说了.env 添加配置项 NACOS_ACCESS_KEY NACOS_SECRET_KEY 等php artisan nacos 0 获取配置php artisan nacos 1 发布配置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中文网其它相关文章!微信分享声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除相关标签:laravel nacos程序员必备接口测试调试工具:点击使用Apipost = Postman + Swagger + Mock + JmeterApi设计、调试、文档、自动化测试工具网页生成APP,用做网站的技术去做APP:立即创建手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包上一篇:详解Laravel之路由请求方式、路由传参下一篇:关于 Laravel 项目 伪静态分页处理相关文章相关视频解决laravel上传图片之后目录有图片,但访问不...详解Laravel项目中实现Ajax上传用户头像的...关于laravel自定义模板指令-tojs分享个人推荐的laravel或其它框架的编程规范详解Laravel之路由请求方式、路由传参关于Nacos解决laravel多环境下配置切换Laravel5.7模型的原理与创建方法Laravel5.7模型查询与实战Laravel5.7模型的新增/更新/删除操作Laravel5.7模型中的访问器与修改器方法视频教程分类php视频教程html视频教程css视频教程JS视频教程jQuery视频教程mysql视频教程Linux视频教程Python视频教程Laravel视频教程Vue视频教程专题推荐独孤九贱-php全栈开发教程全栈 170W+主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门玉女心经-web前端开发教程入门 80W+主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门天龙八部-实战开发教程实战 120W+主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习Laravel 9 学习正当时—保姆级教程,想学不会都难!实战 21317次学习主讲:博愿 全栈工程师,拼命探索,不计后果千万级数据并发解决方案(理论+实战)实战 55750次学习主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习共22门课程,总价3725元,开通VIP会员免费学 实战 55750次学习主讲:Peter-Zhu、西门大官人、灭绝师太、欧阳克官方公众号php中文网课程
扫码关注官方公众号回复“phpcn01”领取php学习资料课程
全套工具、电子书、脑图、内部课程等发表技术文章推荐视频教程开通VIP会员课 0元学推荐会员免费非会员课新课折扣VUE3学习,零基础开始,工程化开发,死磕VUE3!限时3折¥ 980¥ 3199限时折扣信息系统项目管理师(软考高级)一站式通关课程限时8折,仅剩5小时¥ 799¥ 999限时折扣时间管理,自律给我自由限时0.9折,仅剩5小时¥ 9¥ 99VIP¥ 8限时折扣PHP Workerman 基础与实战:即时通讯聊天系统(ThinkPHP6)限时4.7折,仅剩5小时¥ 189¥ 399VIP¥ 119限时折扣Laravel 9 学习正当时—保姆级教程,想学不会都难!限时6折,仅剩5小时¥ 168¥ 279VIP¥ 139限时折扣自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)限时3折,仅剩5小时¥ 59¥ 199会员免费基于workerman仿百度商桥IM即时通讯(Laravel实战四)¥ 299会员免费tp6+adminlte搭建通用后台¥ 198会员免费Uniapp180分钟快速入门¥ 168会员免费vue-cli4商城项目案例¥ 198会员免费限时折扣时间管理,自律给我自由限时0.9折,仅剩5小时¥ 9¥ 99VIP¥ 8限时折扣信息系统项目管理师(软考高级)一站式通关课程限时8折,仅剩5小时¥ 799¥ 999使用Go语言搭建家庭相册系统¥ 199限时折扣PHP Workerman 基础与实战:即时通讯聊天系统(ThinkPHP6)限时4.7折,仅剩5小时¥ 189¥ 399VIP¥ 119限时折扣Laravel 9 学习正当时—保姆级教程,想学不会都难!限时6折,仅剩5小时¥ 168¥ 279VIP¥ 139最新文章热门排行❤️‍🔥如何利用业余时间发展副业,做做兼职?!网上购物商城系统-B2B2C多用户商城系统聊聊Laravel中模型事件怎么使用详解Laravel中怎么找到最慢查询【整理分享】Laravel8优化数据库查询的18 个 小技巧分享Laravel邮件SPF检查器:Mail SPF Checker聊聊怎么在大型Laravel项目中组织路由一文详解Laravel中的事件溯源Laravel如何进行自动化测试?PHPUnit和PEST的示例分享laravel怎么修改.env共22门课程,总价3725元,开通VIP会员免费学习!如何在Laravel5中清除缓存Laravel框架学习之新手教程laravel框架模型model的创建与使用方法终于知道Laravel指定表名的重要性了laravel与thinkphp区别是什么Laravel使用JWT实现API用户授权的详细步骤Laravel处理session(会话)的方法详解Laravel关联模型中has和with区别(详细介绍)热门推荐网站首页 PHP视频PHP实战PHP代码PHP手册词条手记编程词典php培训php中文网:公益在线php培训,帮助PHP学习者快速成长!Copyright 2014-2021 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1关于我们免责申明赞助与捐赠广告合作
目录 发布文章赚赏钱PHP培训活动PHP进阶特惠前端培训新课VIP免费学讲师入驻源码市场广告投放源码入驻APP下载 扫码下载官方APP返回顶部