


Design process of configuration management system under Laravel framework (with code)
Aug 09, 2018 am 11:25 AM本篇文章給大家?guī)淼膬?nèi)容是關(guān)于Laravel框架下的配置管理系統(tǒng)的設(shè)計過程(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
項目背景
硬件架構(gòu)采用Nginx + SLB,應(yīng)用程式使用 Laravel 的 .env 進(jìn)行配置管理 ,隨著業(yè)務(wù)的迭代越來越多的配置被寫入 .env 文件,變得越來越臃腫,管理起來也不方便。
按照集群設(shè)計,支持分布式擴(kuò)展,配置中心不可用要保證不影響業(yè)務(wù),客戶端使用Redis + File的方式保存 配置 信息。
使用 supervisor 守護(hù)進(jìn)程,支持秒級獲取配置,后續(xù)可擴(kuò)展為消息訂閱。按照集群設(shè)計,支持分布式擴(kuò)展,配置中心不可用要保證不影響業(yè)務(wù),客戶端使用Redis + File的方式保存 配置 信息。
使用 supervisor 守護(hù)進(jìn)程,支持秒級獲取配置,后續(xù)可擴(kuò)展為消息訂閱。
架構(gòu)圖
基于composer開發(fā)擴(kuò)展,配置中心與客戶端通信基于RESTful,系統(tǒng)拆分為2個composer,server 包 + client 包。
server 負(fù)責(zé)配置管理,client 負(fù)責(zé)API封裝
UI界面
配置管理
數(shù)組支持用.號,支持鍵值使用json
接口數(shù)據(jù)
客戶端請求接口,最終轉(zhuǎn)被換成PHP數(shù)組。
表設(shè)計
多應(yīng)用
CREATE?TABLE?`tms_configure_client`?( ??`id`?bigint(20)?unsigned?NOT?NULL?AUTO_INCREMENT, ??`is_active`?tinyint(1)?NOT?NULL?DEFAULT?'1'?COMMENT?'狀態(tài)', ??`app_id`?varchar(32)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'APPID', ??`title`?varchar(50)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'名稱', ??`intro`?varchar(50)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'描述', ??`created_at`?timestamp?NULL?DEFAULT?NULL, ??`updated_at`?timestamp?NULL?DEFAULT?NULL, ??PRIMARY?KEY?(`id`), ??KEY?`configure_client_app_id_index`?(`app_id`) )?ENGINE=InnoDB?AUTO_INCREMENT=2?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_unicode_ci;
給每個應(yīng)用分配一個APPID是很有必要的。
配置分組
CREATE?TABLE?`tms_configure_group`?( ??`id`?bigint(20)?unsigned?NOT?NULL?AUTO_INCREMENT, ??`ip`?varchar(30)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'ip地址', ??`title`?varchar(50)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'標(biāo)題', ??`intro`?varchar(200)?COLLATE?utf8mb4_unicode_ci?NOT?NULL?COMMENT?'描述', ??`created_at`?timestamp?NULL?DEFAULT?NULL, ??`updated_at`?timestamp?NULL?DEFAULT?NULL, ??PRIMARY?KEY?(`id`) )?ENGINE=InnoDB?AUTO_INCREMENT=3?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_unicode_ci;
暫時僅支持定義到 APPID + IP 級別配置
配置節(jié)點
CREATE?TABLE?`tms_configure_node`?( ??`id`?bigint(20)?unsigned?NOT?NULL?AUTO_INCREMENT, ??`app_id`?bigint(20)?unsigned?NOT?NULL?COMMENT?'APPID', ??`is_active`?tinyint(3)?unsigned?NOT?NULL?DEFAULT?'1', ??`version_id`?varchar(20)?COLLATE?utf8mb4_unicode_ci?NOT?NULL, ??`group_id`?bigint(20)?unsigned?NOT?NULL, ??`skey`?varchar(50)?COLLATE?utf8mb4_unicode_ci?NOT?NULL, ??`svalue`?varchar(2000)?COLLATE?utf8mb4_unicode_ci?NOT?NULL, ??`remark`?varchar(50)?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL, ??`created_at`?timestamp?NULL?DEFAULT?NULL, ??`updated_at`?timestamp?NULL?DEFAULT?NULL, ??PRIMARY?KEY?(`id`), ??KEY?`idx_acitve`?(`is_active`,`group_id`), ??KEY?`idx_skey`?(`skey`), ??KEY?`configure_node_app_id_is_active_group_id_index`?(`app_id`,`is_active`,`group_id`) )?ENGINE=InnoDB?AUTO_INCREMENT=102?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_unicode_ci;
這里我們支持 mysql.port 這種采用.號key的形式,后面最終轉(zhuǎn)化為php數(shù)組。
Composer包
服務(wù)端
{ ????"name":?"xxx/xxx", ????"type":?"library", ????"keywords":?["laravel","php","configure"], ????"description":?"configure-server?module", ????"homepage":?"https://github.com/xxx", ????"license":?"MIT", ????"authors":?[ ????????{ ????????????"name":?"OkamiChen", ????????????"email":?"x25125x@126.com" ????????} ????], ????"require":?{ ????????"php":?">=7.1.0" ????}, ????"autoload":?{ ????????"psr-4":?{ ????????????"OkamiChen\\ConfigureServer\\":"src/" ????????} ????}, ????"extra":?{ ????????"laravel":?{ ????????????"providers":?[ ????????????????"OkamiChen\\ConfigureServer\\ServerServiceProvider" ????????????] ????????} ????} }
客戶端
{ ????"name":?"xxx/xxx", ????"type":?"library", ????"keywords":?["laravel","php","configure"], ????"description":?"configure-client?module", ????"homepage":?"https://github.com/xxx", ????"license":?"MIT", ????"authors":?[ ????????{ ????????????"name":?"OkamiChen", ????????????"email":?"x25125x@126.com" ????????} ????], ????"require":?{ ????????"php":?">=7.1.0" ????}, ????"autoload":?{ ????????"psr-4":?{ ????????????"OkamiChen\\ConfigureClient\\":"src/" ????????}, ????????"files":?[ ????????????"src/helper.php" ????????] ????}, ????"extra":?{ ????????"laravel":?{ ????????????"providers":?[ ????????????????"OkamiChen\\ConfigureClient\\ClientServiceProvider" ????????????] ????????} ????} }
相關(guān)文章推薦:
laravel學(xué)習(xí):主從讀寫分離配置的實現(xiàn)
Laravel的功能測試:測試驅(qū)動開發(fā)(附代碼)
The above is the detailed content of Design process of configuration management system under Laravel framework (with code). For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

std::chrono is used in C to process time, including obtaining the current time, measuring execution time, operation time point and duration, and formatting analysis time. 1. Use std::chrono::system_clock::now() to obtain the current time, which can be converted into a readable string, but the system clock may not be monotonous; 2. Use std::chrono::steady_clock to measure the execution time to ensure monotony, and convert it into milliseconds, seconds and other units through duration_cast; 3. Time point (time_point) and duration (duration) can be interoperable, but attention should be paid to unit compatibility and clock epoch (epoch)

ToaccessenvironmentvariablesinPHP,usegetenv()orthe$_ENVsuperglobal.1.getenv('VAR_NAME')retrievesaspecificvariable.2.$_ENV['VAR_NAME']accessesvariablesifvariables_orderinphp.iniincludes"E".SetvariablesviaCLIwithVAR=valuephpscript.php,inApach

PHPhasthreecommentstyles://,#forsingle-lineand/.../formulti-line.Usecommentstoexplainwhycodeexists,notwhatitdoes.MarkTODO/FIXMEitemsanddisablecodetemporarilyduringdebugging.Avoidover-commentingsimplelogic.Writeconcise,grammaticallycorrectcommentsandu

When using PHP preprocessing statements to execute queries with IN clauses, 1. Dynamically generate placeholders according to the length of the array; 2. When using PDO, you can directly pass in the array, and use array_values to ensure continuous indexes; 3. When using mysqli, you need to construct type strings and bind parameters, pay attention to the way of expanding the array and version compatibility; 4. Avoid splicing SQL, processing empty arrays, and ensuring data types match. The specific method is: first use implode and array_fill to generate placeholders, and then bind parameters according to the extended characteristics to safely execute IN queries.

There are three key ways to avoid the "undefinedindex" error: First, use isset() to check whether the array key exists and ensure that the value is not null, which is suitable for most common scenarios; second, use array_key_exists() to only determine whether the key exists, which is suitable for situations where the key does not exist and the value is null; finally, use the empty merge operator?? (PHP7) to concisely set the default value, which is recommended for modern PHP projects, and pay attention to the spelling of form field names, use extract() carefully, and check the array is not empty before traversing to further avoid risks.

LaravelSanctum is suitable for simple, lightweight API certifications such as SPA or mobile applications, while Passport is suitable for scenarios where full OAuth2 functionality is required. 1. Sanctum provides token-based authentication, suitable for first-party clients; 2. Passport supports complex processes such as authorization codes and client credentials, suitable for third-party developers to access; 3. Sanctum installation and configuration are simpler and maintenance costs are low; 4. Passport functions are comprehensive but configuration is complex, suitable for platforms that require fine permission control. When selecting, you should determine whether the OAuth2 feature is required based on the project requirements.

In PHP, you can use a variety of methods to determine whether a string starts with a specific string: 1. Use strncmp() to compare the first n characters. If 0 is returned, the beginning matches and is not case sensitive; 2. Use strpos() to check whether the substring position is 0, which is case sensitive. Stripos() can be used instead to achieve case insensitive; 3. You can encapsulate the startsWith() or str_starts_with() function to improve reusability; in addition, it is necessary to note that empty strings return true by default, encoding compatibility and performance differences, strncmp() is usually more efficient.

The key steps to install PHP on Windows include: 1. Download the appropriate PHP version and decompress it. It is recommended to use ThreadSafe version with Apache or NonThreadSafe version with Nginx; 2. Configure the php.ini file and rename php.ini-development or php.ini-production to php.ini; 3. Add the PHP path to the system environment variable Path for command line use; 4. Test whether PHP is installed successfully, execute php-v through the command line and run the built-in server to test the parsing capabilities; 5. If you use Apache, you need to configure P in httpd.conf
