精华内容
下载资源
问答
  • java项目怎么部署到生产环境,请注意是Java Project项目(带main方法的),而不是Web项目 之前学习的时候,只学习了java普通项目的写和在eclipse下运行(找到带main方法的类,直接右键 run as -- Java Application),但没教...
  • Python是一门非常友好的语言,学习成本很低,这也是我很喜欢写Python的原因之一,在与应用端或者是业务端整合的时候我们经常会将模型或者是数据分析的应用成可以被直接调用的web服务来提供外部的访问,在web服务...

         Python是一门非常友好的语言,学习成本很低,这也是我很喜欢写Python的原因之一,在与应用端或者是业务端做整合的时候我们经常会将模型或者是数据分析的应用做成可以被直接调用的web服务来提供外部的访问,在web服务搭建这一块,有很多的第三方库可以完成这一任务,这里列举出来我了解的web框架,欢迎补充:

    Django: Python Web应用开发框架
    Diesel:基于Greenlet的事件I/O框架
    Flask:一个用Python编写的轻量级Web应用框架
    Cubes:轻量级Python OLAP框架
    Kartograph.py:创造矢量地图的轻量级Python框架
    Web2py:全栈式Web框架
    Pulsar:Python的事件驱动并发框架
    Falcon:构建云API和网络应用后端的高性能Python框架
    Bottle: 微型Python Web框架
    Tornado:异步非阻塞IO的Python Web框架
    webpy: 轻量级的Python Web框架

           对于我个人而言,Flask是我搭建web服务的首选,很轻量级,使用起来也很方便,简单的应用几乎是没有什么学习成本的,相信使用过的人对于下面这句话都不会陌生: 

          很简单的依据启动命令就可以将我们自己的应用或者是模块暴露成可被访问、调用的web服务了,很神奇的吧。

         说了Flask的很多好处,但是这是否意味着它是完美的了呢?其实并不是,很大程度上需要取决于你的应用复杂程度,今天遇上一个问题就是需要在生产环境里面部署Flask应用服务,之前这个问题我并没有去过多考虑,因为觉得开发环境和生产环境的部署方式是一样的,所以一直也就这么做着项目走过来了后面发现并不是这个样子的,我们来看一个简单的例子:

          上图是在windows下面我启动了本地的一个web服务,终端输出的提示信息以及警告信息,之前一直都忽略了这一行信息,其实这里的警告信息很简单就是说:不要使用这种方式在生产环境里面部署你的web服务,如果仅仅是用来开发、测试或者是调试什么的则就无所谓了,那么这是为什么呢?是因为:flask直接用于生产环境无论是处理高并发还是鲁棒性都有所欠缺,一般会配合WGSI容器来进行生产环境的部署

        所以这里就需要针对生产环境的部署去做一套方案了。我是参考了这里的方案,截图如下所示:

          我们参考的是【自主部署选项】这里的内容,截图如下所示:

         这里文档讲的比较简单,不过也大概看懂了使用的过程是比较简单。

         这里自己的实践思路就是【gunicorn+gevent】,首先来简单熟悉一下gevent:

    官方解释 greenlet 是轻量级的并行编程,gevent 就是利用 greenlet 实现的基于协程(coroutine)的 python 的网络 library,通过使用greenlet提供了一个在libev事件循环顶部的高级别并发API。即 gevent 是对 greenlet 的高级封装。

          下面是从廖老师网站里面拿来的介绍:

         上面的内容理解了我们差不多就知道gevent是干什么的了。接下来就需要来了解一下gunicorn了,在了解和介绍gunicorn之前,我们先来看看WSGI是什么,下面是摘自百度百科的介绍:

    WSGI介绍:
    PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
    WSGI标准在 PEP333中定义并被许多框架实现,其中包括现广泛使用的django、flask框架。
    
    
    诞生背景:
    以前如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题,这是因为,一般而言,Web应用框架的选择将限制可用的Web服务器的选择,反之亦然。那时的Python应用程序通常是为CGI,FastCGI,mod_python中的一个而设计,甚至是为特定Web服务器的自定义的API接口而设计的。WSGI(有时发音作'wiz-gee')是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。
    

          看了好多gunicorn介绍的资料,下面总结的一段话感觉是比较贴切的了:

    Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。gunicorn是支持wsgi协议的http服务器,gevent只是它支持的模式之一,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。自带的webserver更多的是测试用途,线上发布时,最好使用高性能的wsgi server或者是联合nginx做uwsgi。

         毕竟是第一次接触到的东西,所以必要的背景内容和相关的介绍说明学习是很重要的对于我来说是这样的。初步熟悉和了解之后就可以开始实践了,首选是环境的搭建:

    pip install gunicorn
    pip install gevent

          完成了环境的搭建后,下面是一个简单的实例【myApp.py】:

    #!usr/bin/env python
    #encoding:utf-8
    from __future__ import division
    
    
    '''
    __Author__:沂水寒城
    功能: gunicorn+flask Demo
    '''
    
    
    from flask import *
    #过滤掉警示信息
    import warnings
    warnings.filterwarnings("ignore")
    
    
    
    
    
    app=Flask(__name__)
    
    
    
    
    @app.route("/")
    def init():
        '''
        初始化启动接口
        http://localhost:5000/
        '''
        return u"gunicorn+flask web服务正常启动........"
    
    
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0',port=5000)
    
    
    
    

          启动命令如下所示:

    gunicorn -w 10 -b 0.0.0.0:5000 myApp:app

        在Linux终端执行上面的命令后就可以看到相应的输出了,这里就不进行展示了,后面会有具体的实例。

        下午了解到的启动方式主要有两种,上面的直接命令行启动是第一种方式,第二种方式是基于配置文件的启动,这里就需要编写一个config.py的配置文件来对gunicorn的配置项进行配置了,我们在终端可以简单地通过下面的命令来查看gunicorn所有的配置选项:

    gunicorn -h

          下面是所有的可选配置项信息:

    usage: gunicorn [OPTIONS] [APP_MODULE]
    
    optional arguments:
      -h, --help            show this help message and exit
      -v, --version         show program's version number and exit
      -m INT, --umask INT   A bit mask for the file mode on files written by
                            Gunicorn. [0]
      --worker-connections INT
                            The maximum number of simultaneous clients. [1000]
      --max-requests INT    The maximum number of requests a worker will process
                            before restarting. [0]
      --graceful-timeout INT
                            Timeout for graceful workers restart. [30]
      --access-logfile FILE
                            The Access log file to write to. [None]
      --reload-engine STRING
                            The implementation that should be used to power
                            :ref:`reload`. [auto]
      --preload             Load application code before the worker processes are
                            forked. [False]
      -D, --daemon          Daemonize the Gunicorn process. [False]
      --strip-header-spaces
                            Strip spaces present between the header name and the
                            the ``:``. [False]
      --certfile FILE       SSL certificate file [None]
      --log-syslog-to SYSLOG_ADDR
                            Address to send syslog messages. [udp://localhost:514]
      --statsd-prefix STATSD_PREFIX
                            Prefix to use when emitting statsd metrics (a trailing
                            ``.`` is added, []
      -w INT, --workers INT
                            The number of worker processes for handling requests.
                            [1]
      --max-requests-jitter INT
                            The maximum jitter to add to the *max_requests*
                            setting. [0]
      --no-sendfile         Disables the use of ``sendfile()``. [None]
      --reuse-port          Set the ``SO_REUSEPORT`` flag on the listening socket.
                            [False]
      --worker-tmp-dir DIR  A directory to use for the worker heartbeat temporary
                            file. [None]
      -u USER, --user USER  Switch worker processes to run as this user. [0]
      --reload              Restart workers when code changes. [False]
      --chdir CHDIR         Chdir to specified directory before apps loading.
                            [/root/cgb/demo]
      --access-logformat STRING
                            The access log format. [%(h)s %(l)s %(u)s %(t)s
                            "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"]
      --limit-request-fields INT
                            Limit the number of HTTP headers fields in a request.
                            [100]
      --ca-certs FILE       CA certificates file [None]
      --spew                Install a trace function that spews every line
                            executed by the server. [False]
      --forwarded-allow-ips STRING
                            Front-end's IPs from which allowed to handle set
                            secure headers. [127.0.0.1]
      --do-handshake-on-connect
                            Whether to perform SSL handshake on socket connect
                            (see stdlib ssl module's) [False]
      -R, --enable-stdio-inheritance
                            Enable stdio inheritance. [False]
      --paste STRING, --paster STRING
                            Load a PasteDeploy config file. The argument may
                            contain a ``#`` [None]
      --proxy-allow-from PROXY_ALLOW_IPS
                            Front-end's IPs from which allowed accept proxy
                            requests (comma separate). [127.0.0.1]
      --logger-class STRING
                            The logger you want to use to log events in Gunicorn.
                            [gunicorn.glogging.Logger]
      --keep-alive INT      The number of seconds to wait for requests on a Keep-
                            Alive connection. [2]
      -c CONFIG, --config CONFIG
                            The Gunicorn config file. [None]
      --log-level LEVEL     The granularity of Error log outputs. [info]
      --paste-global CONF   Set a PasteDeploy global config variable in
                            ``key=value`` form. [[]]
      --pythonpath STRING   A comma-separated list of directories to add to the
                            Python path. [None]
      --reload-extra-file FILES
                            Extends :ref:`reload` option to also watch and reload
                            on additional files [[]]
      --capture-output      Redirect stdout/stderr to specified file in
                            :ref:`errorlog`. [False]
      --ciphers CIPHERS     SSL Cipher suite to use, in the format of an OpenSSL
                            cipher list. [None]
      --keyfile FILE        SSL key file [None]
      -k STRING, --worker-class STRING
                            The type of workers to use. [sync]
      --log-config-dict LOGCONFIG_DICT
                            The log config dictionary to use, using the standard
                            Python [{}]
      --log-syslog-prefix SYSLOG_PREFIX
                            Makes Gunicorn use the parameter as program-name in
                            the syslog entries. [None]
      --backlog INT         The maximum number of pending connections. [2048]
      --limit-request-line INT
                            The maximum size of HTTP request line in bytes. [4094]
      -p FILE, --pid FILE   A filename to use for the PID file. [None]
      -b ADDRESS, --bind ADDRESS
                            The socket to bind. [['127.0.0.1:8000']]
      --disable-redirect-access-to-syslog
                            Disable redirect access logs to syslog. [False]
      --limit-request-field_size INT
                            Limit the allowed size of an HTTP request header
                            field. [8190]
      -n STRING, --name STRING
                            A base to use with setproctitle for process naming.
                            [None]
      --error-logfile FILE, --log-file FILE
                            The Error log file to write to. [-]
      --ssl-version SSL_VERSION
                            SSL version to use. [_SSLMethod.PROTOCOL_SSLv23]
      --cert-reqs CERT_REQS
                            Whether client certificate is required (see stdlib ssl
                            module's) [0]
      -g GROUP, --group GROUP
                            Switch worker process to run as this group. [0]
      --proxy-protocol      Enable detect PROXY protocol (PROXY mode). [False]
      --threads INT         The number of worker threads for handling requests.
                            [1]
      -t INT, --timeout INT
                            Workers silent for more than this many seconds are
                            killed and restarted. [30]
      --dogstatsd-tags DOGSTATSD_TAGS
                            A comma-delimited list of datadog statsd (dogstatsd)
                            tags to append to statsd metrics. []
      --suppress-ragged-eofs
                            Suppress ragged EOFs (see stdlib ssl module's) [True]
      --log-config FILE     The log config file to use. [None]
      --initgroups          If true, set the worker process's group access list
                            with all of the [False]
      --check-config        Check the configuration. [False]
      --log-syslog          Send *Gunicorn* logs to syslog. [False]
      --log-syslog-facility SYSLOG_FACILITY
                            Syslog facility name [user]
      --statsd-host STATSD_ADDR
                            ``host:port`` of the statsd server to log to. [None]
      -e ENV, --env ENV     Set environment variable (key=value). [[]]

         感觉有很多很多,不过不是说所有的都是需要去手动配置的,我们只需要配置最常使用到的几个就行了,下面是我编写的一个配置文件:

    #!usr/bin/env python
    #encoding:utf-8
    
    
    import os
    import gevent.monkey
    gevent.monkey.patch_all()
    import multiprocessing
    
    
    #开发环境可以打开,生产环境可以
    #debug = True  
    
    #用于控制errorlog的信息级别,可以设置为debug、info、warning、error、critical
    loglevel = 'debug'
    
    #监听地址+端口
    bind = "0.0.0.0:5000"
    
    #定义日志存储
    if not os.path.exists('log/'):
        os.makedirs('log/')
    pidfile = "log/gunicorn.pid"
    #访问日志
    accesslog = "log/access.log"
    #错误日志
    errorlog = "log/debug.log"
    
    #开启后台运行,默认值为False
    daemon = True
    
    #启动的进程数,推荐值为:CPU核数*2+1
    workers = multiprocessing.cpu_count()*2+1
    
    #指开启的每个工作进程的模式类型,默认为sync模式,也可使用gevent模式
    worker_class = 'gevent'
    x_forwarded_for_header = 'X-FORWARDED-FOR'

            个人感觉写得是很清晰的了,相应的配置项都已经写上了注释说明了方便具体的改动处理。我们使用第一种启动方式启动,下面是具体的输出截图:

    命令:  

    gunicorn -w 4 -b 172.19.6.213:5000 myApp:app

         启动命令中,我们设置了4个进程,从结果来看一共有4个不同的pid编号说明启动了4个不同的进程。关闭可以使用【Ctrl+C】的方式,截图如下所示:

          接下来使用第二种启动方式执行,命名如下:

    gunicorn --config=config.py API:app

          结果截图如下所示:

        第二种方式是基于配置文件的启动方式,这里我们启动的同时还生成了日志文件:

        首先来看debug.log的内容,因为内容比较多,这里只看最后几行:

        然后是看gunicorn.pid的内容:

        细心的你是不是发现了什么呢?57523这个pid是不是。

        最后看access.log的内容,这是访问日志存储文件,因为我们没有访问接口,所以文件就是空的。

         到这里整个的生产环境部署实践差不多就结束了,感觉也是收获很多,学海无涯啊!

    展开全文
  • 生产环境下到底该如何部署Tomcat?

    千次阅读 2019-06-02 13:32:20
    小伙伴们在网上看到的很多文章,是对Tomcat的一些介绍,什么配置啊,怎么启动。其实在生产环境中怎么部署,和网上介绍的有很大区别! 这篇文章老顾就带着大家分享一些如何在生产环境下部署。这里不介绍Tomcat的...

    作者:享学课堂老顾

    微信公众号: 享学课堂online
    在这里插入图片描述

    一、前言

    小伙伴们在网上看到的很多文章,都是对Tomcat的一些介绍,什么配置啊,怎么启动。其实在生产环境中怎么部署,和网上介绍的有很大区别!

    这篇文章老顾就带着大家分享一些如何在生产环境下部署。这里不介绍Tomcat的一些线程数的配置了,网上一大堆,核心介绍网上没有的。

    另外,每个公司的业务场景不一样,Tomcat的部署方案可能有所不能,所以请大家轻喷!

    二、Tomcat组件

    我们先回顾一下Tomcat有哪些组件:
    在这里插入图片描述

    Tomcat请求流程:

    1、对外接收请求是Connector连接器组件,可以支持不同协议,Connector组件中可设置端口,所以我们请求的时候需要输入端口号。可以把Connector当作接待员。

    2、Connector组件接收到请求后,转发给处理Engine(catalina引擎)组件去处理。

    3、根据请求的域名,分配到对应的Host主机。

    4、在根据path分配context组件

    **区分项目有2个核心组件,一个是Host,一个是Context。**根据域名和path分配不同的项目。其实还少了一个就是启动参数的配置,也就是不同项目的启动参数也可以不一样,如端口号,线程数啊。

    推荐阅读:《让面试官颤抖的Tomcat系统架构系列!

    三、部署目录

    我们先看一下Tomcat目录结构:

    在这里插入图片描述

    我们要部署一个web应用,只要把应用的war包放到webapps就可以了。网上一般也是这么讲的。小伙伴们觉得有什么问题吗?

    我们看一下,如果我们要部署两个web应用Web-A和Web-B,把他放到webapps中。我们到bin目录下运行startup.sh启动,这样web-A和web-B就可以访问了。

    如果现在业务上需要把web-B先暂停,那我们改怎么办?还有就是Tomcat启动是会有启动参数设置,如最大线程数,最小线程数等配置。那web-A和web-B怎么配置不一样的启动参数呢?

    其实还有一个问题,如果我们要把Tomcat版本升级,怎么办?把Tomcat直接覆盖?那些web应用重新部署?

    小伙伴们,应该怎么办呢?

    四、目录规划

    Tomcat软链接

    我们先把Tomcat应用放到/usr/local目录下:
    在这里插入图片描述

    上面我们是应用了Tomcat8.5版本,如果我们需要升级到9.x版本的话,那关于Tomcat目录的路径就需要重新修改,这就太不方便了,所以我们可以用软链接的方式解决这个问题
    在这里插入图片描述

    这样以后用Tomcat应用路径,就直接使用Tomcat这个软链接,即使将来Tomcat升级只要修改一些软链接就行了,其他就不需要改。

    五、目录分离

    我们应该要把Tomcat和web应用目录分离出来,即使Tomcat升级也跟web应用没有关系。那分离出来,怎么启动呢?

    我们要利用启动参数中的CATALINA_HOME和CATALINA_BASE,来指定Tomcat程序应用和web应用;通过CATALINA_BASE就可以实现web应用分离出去,我们来看一些Tomcat一共有哪些启动参数

    在这里插入图片描述

    我们先在/usr/local目录下新建一个web-apps目录,此目录就放web应用

    在这里插入图片描述

    在web-apps目录下,新建web-a和web-b目录,这两个目录就是web-A和web-b的web应用目录。
    在这里插入图片描述

    把Tomcat程序中的conf目录拷贝到web-a和web-b里面,这样各个web应用都有各自的配置文件。
    在这里插入图片描述

    再在web-a和web-b目录下,新建webapps和logs目录,webapps存放web应用,logs存放日志文件。

    到此目录分离开了,但还缺少一个启动脚本!

    六、启动脚本

    此启动脚本,老顾引用了网上的一个脚本改造了一下,命名为tomcat.sh
    在这里插入图片描述

    脚本比较简单,核心就是启动参数,只要注意CATALINA_BASE="pwd"的意思是,执行脚本的路径,也就是代表web应用路径是脚本执行的路径;

    再把tomcat.sh设置一些启动权限 # chmod +x tomcat.sh

    修改conf下的server.xml
    在这里插入图片描述

    修改了红色字体部分,host中的appBase是相对CATALINA_BASE的路径,就是web应用的路径,context中的path是请求url,docBase也是相对路径,相对于appBase的,当然也可以设置绝对路径。在web-a下创建index.html文件

    到现在为止的web-a的目录下

    在这里插入图片描述

    启动tomcat.sh
    在这里插入图片描述

    访问 http://192.168.31.150:8080/就ok了,直接返回了index.html里面的内容。

    需要说明的是,在web-a执行tomcat.sh,里面的启动参数CATALINA_BASE是web应用路径,那tomcat.sh脚本中的$CATALINA_HOME/bin/catalina.sh 这个脚本执行所采用的conf配置文件是web-a目录下的,跟Tomcat程序的conf没有任务关系,也跟web-b目录下的conf也没有任何关系,这样就达到了应用之间的配置分离。

    补充一下,在配置context和host时,很多公司不会在server.xml配置,而是通过conf/Catalina目录下,新建host和context,这个知识点,网上很多,小伙伴们可自行查看,因为我们已经单应用分离出来了,那样的配置好处不大。

    七、总结

    上面老顾介绍了Tomcat在生产环境的部署要点,其实还缺少一个环节,就是我们war包或jar包是按照什么流程以及方式上传到生产环境的?这个可以使用自动化集成工具Jenkins

    我们一般在学习中,一些介绍的资料都是浅层次的,虽然能够运行起来,但在真实使用过程中需要考虑别的因素(维护的方便性,隔离性等),所以在我们学习到的基础上面会有很大的不一样。希望小伙伴通过自己学习的,一定要结合公司或者前辈们分享的生产实战经验,去理解真正的使用。

    热门内容:

    1、系统又出Bug?这几个调优攻略,帮你解决大部分问题!

    2、神级代码注释鉴赏,喜欢就拿去用!

    3、开源的13个Spring Boot 优秀学习项目!超53K星,一网打尽!

    4、华为海思总裁致员工信:不再有换胎机会,必当科技自立!

    5、不了解这12个语法糖,别说你会Java!

    6、小小的分页问题引发的加班血案!

    7、1万属性,100亿数据,每秒10万吞吐,架构如何设计?

    8、为啥程序会有Bug?

    在这里插入图片描述

    【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork)回复:1024,即可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!

    展开全文
  • asp.net webapi网站部署到生产环境时,有时我们不希望别人能够看到这些接口列表等信息,如何隐藏这些页面呢?

    预备知识:

    asp.net下的webapi网站项目的一定了解

    程序开发中条件编译的概念 以及 Visual Studio项目中条件编译的用法

    理解这两个基本知识即可。


    问题描述:

    现在我们有一个webapi站点(简单点,就拿VS自带的框架生成一个默认的),显然地,运行此webapi站点,会得到这样的一个网站,此时网站首页如图1,help页如图2,图3.

    这几个页面的含义应该不用太多介绍,总之就是列出接口名称、参数形式、返回值形式、请求示例这样的,便于开发者参考而已。





    至于真实的接口地址,则是类似于 http://xxx.com/api/MemberBusinessModel/method1?key={key} 这样的形式。

    以上是基本常识,都很容易理解。


    现在问题来了,在开发时,我们当然希望如上3图中的信息能够看到,这样在开发中可以省去很多不必要的沟通,调用者直接看帮助页列出的接口列表,然后直接调用即可。

    但是当要部署到生产环境时,有时我们不希望别人能够看到这些接口列表等信息,希望访问帮助页的时候服务器能够区分,然后直接重定向到404页面等。

    这要怎么办呢?


    -----------

    为了解决这个问题,想过几种方法,简单描述:

    1. 写一套验证授权机制(此方法成本最大,也最蠢)。

    访问这些页面时有登录等行为,用户名和密码测试环境的我们自己知道。线上别人访问的话就不知道,也就无法登录,也就无法看到接口列表等信息。

    具体实现不说了,意义不大。

    2. 投机一点,行之有效,简单粗暴的办法(最容易理解,最容易实现)

    将如下图所示的Areas文件夹右键选中,排除出项目,然后编译。这里面是帮助页相关的信息,与api接口调用并无关系,因此不会出问题。

    但当试图访问帮助页时,显然都是看不到的,能看到的只是一个粗暴的报错页。

    当然,如果觉得这个页面太不友好,那就发挥编码精神,将这样的错误页在web.config页面中,甚至在Controller中的Method的return view的时候指定到自己想要指定的页面,如自己写的404.html页面。

    这样最容易理解,但问题就是测试环境和生产环境的代码其实已经不同的,至少有help中的HelpController.cs文件、HomeController.cs文件,.csproj文件等几处不同,总感觉有些不太好。

    而且如果发布的时候用的依然是这份代码,难道还要再用vs打开,然后排除出项目,然后编译?这多麻烦。

    结论:简单粗暴,易于理解,但测试环境与生产环境代码不一致,不是很好。



    3. 通过条件编译的思路实现,稍有门槛,一劳永逸。

    这也就是本文犹抱琵琶半遮面的内容。

    1. 重写http过滤器/拦截器什么的,拦截每一个发来的请求,如对api接口的请求,对help页面的访问请求等所有的
    2. 将此过滤器应用到HomeController的class或method上,应用到help页面的class上。
    3. 指定条件编译内容
    4. 从此即可保持代码一致。

    以下是细节实现:

    1. 重写一个拦截器,随便放项目的什么地方,
    using System.Web.Mvc;
    
    namespace webApi.Util
    {
        public class CustomAuthorizeAttribute : AuthorizeAttribute
        {
    
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
           //如果是在!testV条件下,则将一切请求(指的是应用了CustomAuthorize的控制器class或method)直接重定向到404页面;反之,执行默认行为
    #if !testV 
                filterContext.Result = new RedirectResult("~/404.html");
    #endif
            }
        }
    }

         2.分别将此拦截器应用到HomeController.cs上和HelpControlle.cs上。


    using System.Web.Mvc;
    using webApi.Util;
    
    namespace webApi.Controllers
    {
        /// <summary>
        /// 
        /// </summary>
        public class HomeController : Controller
        {
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
      	[CustomAuthorize]
            public ActionResult Index()
            {
                return View();
            }
        }
    }
    

    using System;
    using System.Web.Http;
    using System.Web.Mvc;
    using webApi.Areas.HelpPage.Models;
    using webApi.Util;
    
    namespace webApi.Areas.HelpPage.Controllers
    {
    
    
    
        /// <summary>
        /// The controller that will handle requests for the help page.
        /// </summary>
    
        [CustomAuthorize]
        public class HelpController : Controller
        {
           //略
        }
    }

    3.如果help页面不需要了,则bundile.cs里的很多文件处理也不需要了的,也应该处理一下。

    BundleConfig.cs

    using System.Web;
    using System.Web.Optimization;
    
    namespace webApi
    {
        public class BundleConfig
        {
            // 有关 Bundling 的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=254725
            public static void RegisterBundles(BundleCollection bundles)
            {
    
               //如果是在testV条件下,则执行这些bundles行为;如果不是testV,则相当于这部分代码就不存在
    #if testV
                bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/OriginalJs/jquery-{version}.js"));
    
                bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include("~/Scripts/OriginalJs/jquery-ui-{version}.js"));
    
                bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/OriginalJs/jquery.unobtrusive*", "~/Scripts/OriginalJs/jquery.validate*"));
    
                // 略           
    #endif
            }
        }
    }


    4.执行条件编译即可。

    如下图,显然地,testV适用于测试环境,没有testV适用于生产环境。




    如上图即完美完成。


    展开全文
  • 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于好奇,本人搜集了自己所了解的一些知识分享给各位,如果有不齐全的地方,请在评论...

     

            项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?
            最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于好奇,本人搜集了自己所了解的一些知识分享给各位,如果有不齐全的地方,请在评论下方留言!
            一、开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告。通俗的讲,项目尚且在编码阶段,我们的代码一般在开发环境中,不会在生产环境中,生产环境组成:操作系统 ,web服务器 ,语言环境。
             
            二、测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。通常指项目测试,修改bug阶段。
             
            三、生产环境:是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这个为基础,然后根据客户的个性化需求来做调整或者修改。通俗的讲,项目数据前端后台已经跑通,部署在服务器上之后,有客户使用,访问,就是网站正式运行了。
             
            三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。
            执行步骤:开发完成,测试环境测试,保证程序没有问题后,再上传到生产环境中。
             
            四、UAT环境:UAT,(User Acceptance Test),用户接受度测试 即验收测试,所以UAT环境主要是用来作为客户体验的环境。
             
            五、仿真环境:顾名思义,是和真正使用的环境一样的环境(即已经出售给客户的系统所在环境,也成为商用环境),所有的配置,页面展示等都应该和商家正在使用的一样,差别只在环境的性能方面。
             
            系统内部集成测试(System Integration Testing) :SIT
            用户验收测试(User Acceptance Testing) :UAT
            SIT在前,UAT在后,UAT测完才可以上线。
            SIT是集成测试,UAT是验收测试。从时间上看,UAT要在SIT后面,UAT测试要在系统测试完成后才开始。从测试人员看,SIT由公司的测试员来测试,而UAT一般是由用户来测试。
            

    展开全文
  • Gradle web 项目环境打包配置

    千次阅读 2019-09-10 14:36:18
    filters 存储的是不同环境的配置信息 2、build.gradle 核心代码如下 import org.apache.tools.ant.filters.ReplaceTokens group 'com.ai' version '1.0-SNAPSHOT' // gradle 环境分离配置 打包参数-Dprofile=...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非局限于游戏吧,RES、SRC资源有,在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
  • 简历—项目经验范例

    万次阅读 多人点赞 2019-05-29 12:36:25
    看着比较专业的一份项目经验样板~
  • 1.问题:公司项目开发过程中主要三种环境: ...每次由部署到生产环境之前需要改一堆的参数配置包括: * 数据库连接配置参数 * zookeeper连接地址配置 * 其他对接公司的参数包括代理商号,签名key,请求地址...
  • java Web项目 我们为什么要弃用jsp

    千次阅读 多人点赞 2018-08-29 15:26:48
    随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情,正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精。   大中型公司...
  • docker部署php环境运行web项目

    万次阅读 热门讨论 2019-01-12 22:02:23
    写这篇文章的目的一个是自己个笔记,以防以后忘记,再一个网上关于运行php容器到部署web项目的资料实在是少,是互相复制一下,无法真正运用到实际生产环境中。 为什么要用docker,docker基本的一些命令不再本...
  • maven项目web配置文件多环境配置

    千次阅读 2017-01-31 16:58:13
    web.xml配置 servlet> servlet-name>appServletservlet-name> servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> init-param> param-name>contextConfigLocationparam
  • 简单记录java项目什么都没有开始,到部署到服务器上让所有人能够访问.
  • 提供:ZStack云计算 Tutorial Series本教程为生产环境构建指南:Web应用系列六篇中的第五篇。内容介绍现在我们已经拥有了一套生产应用服务器设置、一项恢复规划以及备份,下面思考如何利用监控机制掌握服务器与服务...
  • 2019工程伦理慕课答案(2019秋)习题及期末答案

    万次阅读 多人点赞 2019-11-08 18:19:53
    工程的()价值具有非道德性质,这决定了工程的最终价值取决于工程应用于什么目的,即工程的实际价值取决于社会的要求和社会环境。 工具价值 内在价值 伦理价值 社会价值 多选题 (1/1 point) ...
  • 一套代码部署多套环境---由开发同事配置多个含有参数的配置文件,名称如下:dev.env.jsprod.env.js test.env.js,我们将分成:dev--开发环境,prod--生产环境,test--测试环境,由此我们即配置环境变量 先在服务器...
  • 项目运维实施人员很多时候需要在win或者Linux环境下部署war包,即web工程,war包是开发人员将javaEE web项目打包成的一个文件。这其中涉及到了Oracle数据库链接的配置以及jdk,系统等各方面的配置。本套课程将完整的...
  • windows7下Django项目生产环境搭建及踩过的坑Apache是有名的web server,所以我们采用windows64环境下的Apache web server来搭建Django项目的部署环境。但是windows下搭建会遇到各种各样奇怪的问题,以下是本文搭建...
  • Java框架总结

    万次阅读 多人点赞 2020-01-17 14:14:13
    本系列用来记录常用java框架的基本概念、区别及...SSH框架是JAVA EE中三种框架所集成,分别是Struts,Spring,Hibernate框架所组成,是当前比较流行的java web开源框架。 集成SSH框架的系统从职责上分为(Struts2--...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    举例而言,如挂载下列5个设备,其执行指令可能如下 (假设是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ===>mount -t ext2 /dev/fd0 /mnt/floppy cdrom ===>mount -t iso9660 /dev/hdc /mnt/...
  • 微信小程序测试方案

    千次阅读 2019-05-19 15:13:42
    开发版访问测试环境,体验版访问测试环境或者预发布环境,正式版访问生产环境。 小程序的测试5大方面 小程序虽然是微信推出的新形态产品,但是在测试思路上跟其他客户端测试在模式上也有类似之处。小程序的测试...
  • 测试开发需要学习的知识结构

    万次阅读 多人点赞 2018-04-12 10:40:58
    努力成为一个优秀的测试开发从业者,加油!... - 假装在测试的回答 - 知乎白盒与黑盒测试什么区分1、黑盒测试 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检...
  • 这篇博文主要说的就是我今天遇到的问题,而且在经过我的询问,好多人在打包部署的时候遇到了一些问题,下面就来说下,如何将Vue项目放置在服务器上,这里以Tomcat为例。 必须配置的就是/config/index.js ...
  • 这一节我们介绍 Maven 的 Web 项目使用 war 插件针对不同环境打包。这是我在 BAE 部署自己的博客应用的时候整理的一种方案,供大家参考。最最重要的思路其实就一条:打包之前替换...但是到了生产环境部署的时候, MySQL
  • 目前web前端工程师日均岗位缺口已经超过50000,随着互联网+的深入发展,html5作为前端展示技术,市场人才需求量将呈直线上涨。...现如今,Web前端工程师已经成为各大互联网公司不可或缺的热门职位,从业者队伍日渐...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    ★软件测试的目的、意义:(怎么好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统测试之后) 11 回归测试: 11 4.测试过程...
  • springboot面试题十题

    万次阅读 2018-08-18 09:10:09
    1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。   如果必须启动一个...
  • Docker - 部署Java Web 项目

    千次阅读 2018-09-12 14:21:34
    后面换服务器,方便项目部署,而不用在新的服务器上重新搭建相关环境。 之前简单的了解过Docker。并且之前通过docker搭建gogs,也体会到了docker的强大和方便。这次,正好借这个机会,好好阅读一下官方文档,通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,751
精华内容 53,500
关键字:

web项目生产环境都要做什么