微信小程序的开发和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;
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现