微信小程式自研業務介面的伺服器一點配置記錄整理

来源:https://www.cnblogs.com/leafinwind/archive/2023/04/25/17353148.html
-Advertisement-
Play Games

微信小程式的開發和APP的開發有些類似,但又略有不同。 App一般有很多版本,甚至要相容很多版本相容,尤其是各個小版本之間一般都是要共存的。當然如果有較大變化或者升級,尤其是底層邏輯或者資料庫結構改動,一般會強制升級。 因為要多個版本相容,互相不影響使用,那麼伺服器的介面就需要多版本共存。 一般為了 ...


微信小程式的開發和APP的開發有些類似,但又略有不同。

App一般有很多版本,甚至要相容很多版本相容,尤其是各個小版本之間一般都是要共存的。當然如果有較大變化或者升級,尤其是底層邏輯或者資料庫結構改動,一般會強制升級。

因為要多個版本相容,互相不影響使用,那麼伺服器的介面就需要多版本共存。

一般為了支持多版本共存,就需要對API做一個版本的劃分,服務端的代碼,當然也需要按版本做好不同的區分。

大致方案如下:

一、每一個版本一套完整獨立的代碼

  這種方法簡單直接,也特別號理解,簡單的說,就是每升級一次,就完全複製一套完整的代碼,比如可以利用SVN或者GIT的分支,來實現。開發完成後直接整套部署。

  優勢很明顯,簡單且完全獨立,便於獨立部署,且各個版本之間完全不影響,互相不依賴,易於維護。

  不足也明顯,就是如果版本較多,升級頻率較高則會產生大量的冗餘重覆代碼。

二、一套代碼所有版本在一起,在類(Class)或者方法(Function)上區分,做好路由選擇

  優勢也算明顯,就是代碼量少,整體就一套。

  不足略微多一點,不恰當的維護風險很高,代碼容易過於臃腫,各個版本之間依賴增加,不利於長期維護,也不支持每個版本獨立部署。

當然,實際開發中,往往會綜合考慮,會將兩種方式結合,大版本之間各自獨立,減少依賴和實現大版本獨立部署,小版本一個項目內相容,減少代碼量。

有了前邊這些鋪墊,我們看看微信小程式的特點,找出一個適合微信小程式的情況。

微信不是APP,不需要下載,正常情況只要重新啟動小程式基本就自動更新成最新的版本了。當然,微信也可以控制用戶強制刷新。

因此,介面設計或許就不需要像APP那樣搞出多個版本過於複雜,不利於維護,只要能很好的完成無感切換即可。

根據開發需要,暫定了將介面代碼分成了AB兩個版本部署,開發代碼是一套(一個項目),看看效果如何。

這樣一個項目維護絕對是便於維護,代碼也不會冗餘,維護時根本不需要考慮版本問題,每個開發人員只要將最新的功能實現即可,最後版本控制由上線部署時做好區分即可。

簡單描述下:部署時,可以在同一個WEB目錄,建立AB兩個目錄,小程式只需要傳回AB兩個不同的參數,就會知道API的選擇了,然後由nginx解析選擇即可,服務端代碼中完全不用考慮任何版本問題。

AB兩個版本,也正好可以實現,正式上線對外前,體驗版時也可以使用生產環境的一切配置和數據,相當於兩套(版本)代碼同時在生產環境,正式小程式調用A介面,體驗版調用B介面。可以很好的完成預上(模擬)線測試。

這個思路,對於服務端代碼和小程式代碼,都是非常簡單的,幾乎可以完全忽略版本問題。只要配置好nginx就可以了。

最早想到這個方案的時候,正經興奮了好一陣子,尤其是配置好nginx調試通過後,感覺完美^_^。

 

將nginx的部分配置附上

server {
    listen          80;
    listen          443 ssl http2;
    server_name     mp.abc.com;
    root            /www/wwwroot/a/public;
    index           index.php index.html index.htm;
    etag on;

    gzip on;
    gzip_vary on;
    gzip_http_version 1.0;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 2;
    gzip_disable msie6;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/xml+rss;

    client_max_body_size 110m;
    client_body_buffer_size 1024k;

    keepalive_timeout   60;

    sendfile on;
    sendfile_max_chunk 512k;
    tcp_nopush on;
    tcp_nodelay on;

    ssl_certificate   /www/server/panel/ssl/xxx.pem;
    ssl_certificate_key  /www/server/panel/ssl/xxx.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location ^~ /a {
        alias /www/wwwroot/a/public;
        if (!-e $request_filename) {
                rewrite ^ /a/index.php last;
        }

        location ~ \.php$ {
                if (!-f $request_filename) {
                        return 404;
                }
                #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
                fastcgi_pass        127.0.0.1:9000;
                fastcgi_index       index.php;
                fastcgi_param       SCRIPT_FILENAME $request_filename;
                include             fastcgi_params;
        }
    }

    location ^~ /b {
        alias /www/wwwroot/b/public;
        if (!-e $request_filename) {
                rewrite ^ /b/index.php last;
        }

        location ~ \.php$ {
                if (!-f $request_filename) {
                        return 404;
                }
                #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
                fastcgi_pass        127.0.0.1:9000;
                fastcgi_index       index.php;
                fastcgi_param       SCRIPT_FILENAME $request_filename;
                include             fastcgi_params;
        }
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
        fastcgi_pass        127.0.0.1:9000;
        fastcgi_index       index.php;
        fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include             fastcgi_params;
    }

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
}

這個段配置主要的不同就是加粗的部分,其他都是nginx的通用內容。

簡單理解就是在同一個web目錄下,建立兩個不同的目錄,然後每次上線時,將最新代碼部署到對應的AB目錄中即可。相當於介面代碼先上線,然後體驗版測試生產環境。

沒問題後,小程式直接提審即可。通過後新打開小程式的用戶自動切換到新介面,一直使用的用戶或者緩存等更新不及時一直使用原介面。當然也可以強制更新。

目前使用至今,這個方案一直沒有什麼問題。

哪位朋友有其他方法也可以分享多多交流。

整篇帖子有說錯的地方,煩請指出,十分感謝!

 

微信小程式調用介面地方的配置附上

/* 
* 針對生產環境:切換生產環境介面目錄,兩個版本交替上線使用不同的目錄 * 例如:生產版本1.0使用目錄“a”,則pre版本1.1提前修改成“b” *    下一次生產版本1.1使用的是目錄“b”,而本地pre提前修改成“a” */ const VERSION = 'a'; const STORAGE = '1.0'; // 介面各個環境的功能變數名稱配置 const MP_HOST = []; MP_HOST['dev'] = 'http://dev.abc.com'; MP_HOST['pre'] = 'https://pre.abc.com'; MP_HOST['pro'] = 'https://mp.abc.com/' + VERSION;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 功能03-優惠券秒殺02 4.功能03-優惠券秒殺 4.4一人一單 4.4.1需求分析 要求:修改秒殺業務,要求同一個優惠券,一個用戶只能下一單。 在之前的做法中,加入一個對用戶id和優惠券id的判斷,如果在優惠券下單表中已經存在,則表示該用戶對於這張優惠券已經下過單了,不允許重覆購買 4.4.2代 ...
  • 1.檢測虛擬機環境 1.1 bit檢測命令:getconf LONG_BIT(建議使用64bit做開發) 1.2 gcc環境檢測:gcc -v 如果不具備gcc環境,則使用yum -y install gcc- c++命令進行c++環境的安裝 2.開始安裝 2.1 下載redis: 進入官網找到下載 ...
  • 1、如何快速修改用戶中涉及多個表中某個欄位類型 1)方法一: SELECT 'alter table '||TABLE_NAME||' modify '||COLUMN_NAME||' VARCHAR2('||DATA_LENGTH||');' --要alter的sql ,T.* FROM dba_ ...
  • 摘要:gdb確認是否安裝,所帶來的該工具用戶資料庫實例觸發core問題後集群狀態反覆異常,對此問題及時分析根因並及時進行規避。 本文分享自華為雲社區《主動預防-DWS關鍵工具安裝確認》,作者:上官寒雨。 【關鍵工具確認】 1、gdb確認是否安裝(該工具用戶資料庫實例觸發core問題後集群狀態反覆異常 ...
  • 摘要:華為雲RDS for PostgreSQL通過插件管理功能,很好地解決了PostgreSQL版本與插件耦合的問題,幫助用戶更直觀、更快速地安裝管理資料庫插件。 本文分享自華為雲社區《PostgreSQL插件那麼多,怎樣管理最高效?》,作者:GaussDB 資料庫。 雲服務環境下,如何讓客戶更方 ...
  • 背景:在搜索的時候經常會有一種場景就是忽略大小寫,不管你輸入的是全大寫還是全小寫還是大小寫混合,希望都能夠搜索出結果。 解決思路:Elasticsearch中的lowercase normalizer將文本轉換為小寫,並將其作為規範形式存儲在索引中。這可以確保在搜索和比較文本時忽略大寫字母的差異,從 ...
  • 慢 SQL 經常會讓應用程式響應變慢,輕者影響用戶體驗,嚴重的時候可能會導致服務不可用。如果,每次遇到慢 SQL 都求助於 DBA,一方面效率很低,另一方面也會很沒面子。所以,我們一起來看看如何使用AI能力給出超越一般DBA的 SQL 優化建議。NineData( www.ninedata.clou... ...
  • Mysql資料庫的安裝對於開發者來說,是我們必然會面對的問題,它的安裝過程其實並不複雜,並且網路上的安裝教程也非常多,但是對於新手來說,各種不同形式的安裝教程,又給新手們帶來了要選擇哪種方式進行安裝的難題,而且很多時候按照教程也沒有能夠安裝成功,安裝過程出現各種各樣的錯誤。 下麵記錄了我在Linu... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...