精华内容
下载资源
问答
  • flask高并发部署

    2021-01-20 11:26:55
    使用nginx+uwsgi+flask部署服务器半年多了,很多东西都遗忘了,现在项目需要突然需要部署新的服务器,因此重新开始学习nginx+uwsgi+flask的部署方法。 发现网上大部分关于这个的教程或博客都没把话说清楚,甚至都没...

    使用nginx+uwsgi+flask部署服务器

    现在,假设我们已经写好了flask的脚本。我给他起名叫manager.py。
    那么,我们要把自己的flask程序上传到服务器上,使用uwsgi+nginx部署,可供外网访问,我们该怎么做呢?别急,分为以下几个步骤:

    1.将脚本上传至服务器

    目录随意,自己能够找到即可,例如/home/test。需要注意千万不要放在/tmp中,否则过后你就会发现他们被当作垃圾清理掉了。

    2.安装uwsgi

    使用pip即可安装uwsgi,pip install uwsgi即可。如果报错缺少python.h,别急,先 yum install python-devel就可以,然后用pip安装一次。

    3.安装Nginx

    使用yum工具(在centos下,其他linux可以使用apt代替)。sudo yum intall -y nginx等待安装成功。

    4.确认uwsgi与nginx都已经安装成功

    开始进行后面的配置。

    5.配置uwsgi

    现在,进入刚刚上传了flask脚本的目录cd /home/test。新建一个文件,叫啥都行,例如test.ini。vi test.ini进入之后,写下下面的几行:

    [uwsgi]
    socket= 127.0.0.1:5000
    wsgi-file=/home/test/manager.py
    callable=app
    touch-reload=/home/test/
    master = true
    

    这几个参数是什么意思呢?第一个是socket,也就是这个uwsgi程序绑定的套接字(注意,不是http,不是http)这个套接字适用于和nginx反向代理通信的,后面会讲到。
    第二个参数是flask文件的路径。
    第三个参数是flask对象的名字,(就是那个app=Flask(__name__))里面那个“app”,如果你的叫别的名字,那你就换成那个名字。
    第四个参数填写的是一开始你上传到的文件夹的路径,不过不是一个重要的参数。
    第五个参数照搬就可以。
    保存。
    6. 配置Nginx。

    打开nginx服务器的配置文件nginx.conf。不会找的话,一般是在**/etc/nginx/nginx.conf**路径下。*如果不是的话,可以使用whereis nginx命令来找到nginx所在的所有目录,然后一个个看目录下是否有nginx.conf这个文件。*打开它,编辑。仅需修改server代码块重的location代码块。使之变成这样:

    location / {
               include /etc/nginx/uwsgi_params;
               uwsgi_pass 127.0.0.1:5000;
            }
    

    就可以了。其中,uwsgi_pass参数,后面跟的前面所提到的uwsgi程序的套接字,他们就是通过这个套接字进行通讯的。而大家可以看到在conf文件中的server代码块里面有一个listen 80;这个就是让nginx来监听80端口,并将请求通过127.0.0.1:5000传递给后端的uwsgi,再通过这个端口将后端返回的数据转发给请求(看不懂没关系)
    7. 运行nginx服务器。

    运行方法:nginx -c /etc/nginx/nginx.conf运行成功后用浏览器打开服务器的ip,会显示400bad request。那是因为nginx服务器已经成功开启,但是由于后端的uwsgi没有开启,因此无法将请求转发到后端的uwsgi程序。因此下面我们开启uwsgi

    8. 运行uwsgi程序

    运行方法:首先切换到test.ini所在的目录(也就是上传文件的目录)。之后,uwsgi --ini test.ini就可以了。可以看到英文显示成功绑定到127.0.0.1:5000,服务成功开启等字样。在浏览器输入服务器的ip地址,不出意外的话,就可以访问到你写的flask程序了。搞定~(tips:由于直接uwsgi --ini -tesst.ini这样会把信息打印到标准输出,建议用nohup运行)

    最后,另外提一提如何关闭服务器以及服务。
    关闭nginx:nginx -s stop
    关闭uwsgi killall -s INT /path/to/uwsgi (uwsgi的path可以通过whereis查找,若直接kill会导致uwsgi服务重启,无法关闭

    展开全文
  • 一个项目刚开始的时候是为了实现基本功能,随着版本和功能的迭代,大数据和高并发成了软件设计必须考虑的问题!本质很简单,一个是慢,一个是等。两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也...

    8398e39809c08ffea3f5bb20c2afcc14.png

    一个项目刚开始的时候是为了实现基本功能,随着版本和功能的迭代,大数据和高并发成了软件设计必须考虑的问题!

    本质很简单,一个是慢,一个是等。

    两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也就解决了等,解决了等,也就解决了慢。

    关键是如何解决慢和等?

    核心 一个是短一个是少一个是分流,最后一个是集群/横向扩张/读写分离/建立主从

    页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新。使用缓存- 第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性。

    使用储存过程-那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。

    批量读取 - 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数。

    延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据。

    使用索引 - 索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。

    1,分表 - 把本来同一张表的内容,可以按照地区,类别等分成多张表,很简单的一个思路,但是要尽量避免分出来的多表关联查询。

    2,分离活跃数据 - 例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表,这也类似与缓存啦。

    3, 分块 - 数据库层面的优化,对程序是透明的,查询大数据只用找到相应块就行;如交易模块

    分流

    1,集群 - 将并发请求分配到不同的服务器上,可以是业务应用服务器APP,也可以是数据库服务器。

    2,分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。

    3,CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。

    4,分库分表 -

    水平拆分【分表】:

    对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】

    垂直拆分【分库】:

    是根据业务耦合性,将关联度低的不同表存储在不同的数据库上,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】

    建立主从 - 读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,从数据库处理select查询,数据库复制被用于把事务性查询(增删改)导致的改变;以毫秒级的更新同步到集群中的从数据库。

    来源:https://www.cnblogs.com/wanglijun/p/10879332.html

    ·END·

    PHP开源社区进阶·提升·涨薪d0ae7d4d3f710afe7bba7f171a497ce7.png
    展开全文
  • 其利用springboot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、负载均衡、断路器、数据监控等,都可以用springboot的开发风格做到一键启动和部署。学习和了解微服务对快速熟悉和掌握不同项目...

    本文主要介绍的微服务是spring cloud,它一个服务治理框架和一系列框架的由序集合,其利用springboot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、负载均衡、断路器、数据监控等,都可以用springboot的开发风格做到一键启动和部署。学习和了解微服务对快速熟悉和掌握不同项目的服务架构大有益处

    分为以下几个部分进行介绍:

    一、微服务应用的简单业务场景

    二、Spring Cloud核心组件:Eureka

    三、Spring Cloud核心组件:Feign

    四、Spring Cloud核心组件:Ribbon

    五、Spring Cloud核心组件:Hystrix

    六、Spring Cloud核心组件:Zuul

    七、高并发场景下配置优化

    八、总结


    一、业务场景介绍

    先来给大家说一个都熟悉的支付订单的功能,大体的流程如下:

    • 用户创建一个订单并支付,需要将订单状态更新为“已支付”
    • 更新商品库存
    • 通知物流发货
    • 增加用户购物积分

    上述业务场景的流程涉及到订单服务、库存服务、物流服务、用户积分服务。其调用关系如下图:

    cb7b5a83d9410852ac08d6d1d9174aec.png

    二、Spring Cloud核心组件:Eureka

    考虑一个问题:订单服务想要调用库存服务、物流服务,或者是积分服务,怎么调用?

    • 传统方式:通过传统的ip:port的方式调用各种服务,如果订单服务依赖的其他服务地址更改了,就需要修改订单服务配置,然后重新部署。阿西吧!
    • eureka出场,eureka是微服务架构的注册中心,专门负责服务的注册和发现。Eureka有两个组件组成:Eureka server和Eureka client,一张图认识一下:
    fc3e55cb1eb8ac108a27cc8a76261741.png
    • 上面的图描述了Eureka的基本架构,有3个角色组成
    1. Eureka Server:提供服务注册和发现
    2. Service Provider:服务提供方,将自身服务注册到Eureka Server,从而使消费方能够找到
    3. Service Consumer:服务消费方,定时从Eureka获取注册服务列表,消费服务
    • 再来看一下业务场景中,这些服务上都有Eureka Client组件,Service Provider启动时将自己注册到Eureka Server上,注册的意思就是告诉Eureka Server 自己在哪台服务器,端口号等,Eureka Server 的注册表会保存这些服务的元数据信息。这个时候如果订单服务调用库存服务,Service Consumer通过Eureka Client组件Eureka Server 问一下库存服务的ip是什么,端口是什么,然后调用库存服务。订单服务调用其他服务亦是如此。
    7d8070616aa2f72e5698b07ab7070832.png
    • 千万级访问量:eureka各个服务默认每隔30秒拉取注册表,每隔30s发起一次心跳,看看Eureka是如何实现千万级别访问量
    1. 假设现在有一个大型的分布式系统,一共100个服务,每个服务部署在20台机器上,机器是4核8G的标准配置。也就是说,相当于你一共部署了100 * 20 = 2000个服务实例,有2000台机器。每台机器上的服务实例内部都有一个Eureka Client组件,它会每隔30秒请求一次Eureka Server,拉取变化的注册表。此外,每个服务实例上的Eureka Client都会每隔30秒发送一次心跳请求给Eureka Server。

    那么大家算算,Eureka Server作为一个微服务注册中心,每秒钟要被请求多少次?一天要被请求多少次?

    按标准的算法,每个服务实例每分钟请求2次拉取注册表,每分钟请求2次发送心跳

    • 这样一个服务实例每分钟会请求4次,2000个服务实例每分钟请求8000次
    • 换算到每秒,则是8000 / 60 = 133次左右,我们就大概估算为Eureka Server每秒会被请求150次
    • 那一天的话,就是8000 * 60 * 24 = 1152万,也就是每天千万级访问量

    深入原理:

    • Eureka server注册数据结构:
    bd57b3e0c6c218cad06fc4aaee8ac395.png
    • 如上图所示,图中的这个名字叫做registryCocurrentHashMap,就是注册表的核心结构。各个服务的注册、服务下线、服务故障,全部会在内存里维护和更新这个注册表。
    • 各个服务每隔30秒拉取注册表,每隔30s发起一次心跳,都在这Map数据结构中操作

    一句话概括:维护注册表、拉取注册表、更新心跳时间,全部发生在内存里!

    • 这个ConcurrentHashMap的key就是服务名称,比如“订单服务的名字是:order-service,这里就是order-service”, value则代表了一个服务的多个服务实例。Lease的类,它的泛型是一个叫做InstanceInfo,代表服务实例的具体信息,比如机器的ip地址、hostname以及端口号。而这个Lease,里面则会维护每个服务最近一次发送心跳的时间
    • Eureka Server为了避免同时读写内存数据结构造成的并发冲突问题,采用了多级缓存机制(ReadOnlyCacheMapReadWriteCacheMap)提升服务请求的响应速度。

    在拉取注册表的时候:

    1. 首先从ReadOnlyCacheMap里查缓存的注册表。
    2. 若没有,就找ReadWriteCacheMap里缓存的注册表。
    3. 如果还没有,就从内存中获取实际的注册表数据。

    在注册表发生变更的时候:

    1. 会在内存中更新变更的注册表数据,同时过期掉ReadWriteCacheMap
    2. 此过程不会影响ReadOnlyCacheMap提供人家查询注册表。
    3. 一段时间内(默认30秒),各服务拉取注册表会直接读ReadOnlyCacheMap
    4. 30秒过后,Eureka Server的后台线程发现ReadWriteCacheMap已经清空了,也会清空ReadOnlyCacheMap中的缓存
    5. 下次有服务拉取注册表,又会从内存中获取最新的数据了,同时填充各个缓存。

    总结一下:

    • Eureka Client:负责将这个服务的信息注册到Eureka Server中
    • Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

    三、Spring Cloud核心组件:Feign

    实现优雅的rpc调用:解决完服务在哪里之后,该如何去调用服务呢?难道订单服务要自己写一大堆代码,跟其他服务建立网络连接,然后构造一个复杂的请求,接着发送请求过去,最后对返回的响应结果再写一大堆代码来处理吗?想到这里是不是直想挠头,为了保住自己本来就不多的头发!来看看Feign是如何处理的吧!

    923db7559ae9b742e222f1c3217840a3.png

    看完上面的代码是不是感觉干净清爽!没有底层的建立连接、构造请求、解析响应的代码,直接就是用注解定义一个 FeignClient接口,然后调用那个接口就可以了,Feign都帮你做好了。

    Feign实现这些的原理:一个关键机制就是使用了动态代理

    • 首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
    • 接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,这是核心中的核心
    • Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址
    • 最后针对这个地址,发起请求、解析响应
    095d4ee0ca55fda624acfec3bb54cd57.png

    四、Spring Cloud核心组件:Ribbon

    服务集群部署:如果库存服务部署了3台怎么办,如下所示:

    • 192.168.10.10:7000
    • 192.168.10.11:7000
    • 192.168.10.13:7000

    问题来了,Feign怎么知道该请求哪台机器呢?这时就轮到Ribbon出马了,其提供了解决微服务负载均衡的问题。Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。它不像spring cloud服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个spring cloud 微服务中。包括feign提供的声明式服务调用也是基于该Ribbon实现的。

    • Ribbon的负载均衡默认使用的最经典的Round Robin轮询算法。如果订单服务对库存服务发起10次请求,那就先让你请求第1台机器、然后是第2台机器、第3台机器,接着再来—个循环,第1台机器、第2台机器。。。以此类推。其他常见的负载均衡策略还包括权重轮询WeightedResponseTimeRule,随机策略RandomRule,最少并发数策略BestAvailableRule等等

    此外,Ribbon是和Feign以及Eureka紧密协作,完成工作的,具体如下:

    • 首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
    • 然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
    • Feign就会针对这台机器,构造并发起请求

    对上述整个过程,再来一张图:

    2dad605cd411c7b721a4e395b8bcf0a3.png

    五、Spring Cloud核心组件:Hystrix

    断路器,旨在通过熔断机制控制服务和其依赖服务之间的延迟和故障。比如:在一个大型的微服务架构里,一个服务可能要依赖很多服务,像本文的业务场景,订单服务依赖库存服务、物流服务、积分服务三个服务。假设订单服务最多只有100个线程可以处理请求,如果库存服务挂了,一般会抛出一个异常。如果系统处于高并发的场景下,大量请求涌过来的时候,订单服务的100个线程都会卡在请求库存服务这块,这导致订单服务没有一个线程可以处理请求,服务器完全不响应任何请求。

    如上图,这么多服务互相调用,要是不做任何保护的话,某一个服务挂了,就会引起连锁反应,导致别的服务也挂。比如服务B挂了,会导致服务A的线程全部卡在请求服务B这里,没有一个线程可以工作。上面这个,就是微服务架构中恐怖的服务雪崩问题

    11a49d81c84cd4f6d07d52db002f9976.png
    • 解决方式:

    使用Hystrix。Hystrix是隔离、熔断以及降级的一个框架。Hystrix处理方式是提供很多个小小的线程池(其中一种解决方式),比如订单服务请求库存服务是一个线程池,请求物流服务是一个线程池,请求积分服务是一个线程池。每个线程池里的线程就仅仅用于请求那个服务。

    • 打个比方:现在很不幸,服务B挂了,会咋样?

    当然会导致服务A的那个用来调用服务B的线程都卡死不能工作了啊!但是由于服务A调用服务C、服务D的这两个线程池都是正常工作的,所以这两个服务不会受到任何影响。但是如果服务B都挂了,服务A每次调用都要去卡住几秒钟干啥呢?有意义吗?当然没有!所以我们直接对服务B熔断不就得了,比如在5分钟内请求积分服务直接就返回了,不要去走网络请求卡住几秒钟,这个过程,就是所谓的熔断!如果服务A知道服务B已经熔断了,可以做一些特殊的处理,比如返回一些兜底的数据或者友好的提示这个过程,就是所谓的降级。

    为帮助大家更直观的理解,接下来用一张图,梳理一下Hystrix隔离、熔断和降级的全流程:

    66e0d84ab124665456fa7e42b2ac01f1.png

    六、Spring Cloud核心组件:Zuul

    前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign和Ribbon支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散我们还是少考虑了一个问题,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务

    为什么需要微服务网关?

    在微服务架构模式下后端服务的实例数一般是动态的,动态改变的服务实例的访问地址信息很难被客户端发现。因此在基于微服务的项目中为了简化前端的调用逻辑,引入API Gateway作为轻量级网关,而且有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全,等等。

    a0d0a7232eb0d72d51df09af85d0748a.png

    七、高并发下配置优化

    • 合理的hystrix线程池大小:

    假设你的服务A,每秒钟会接收30个请求,同时会向服务B发起30个请求,然后每个请求的响应时长经验值大概在200ms,那么你的hystrix线程池需要多少个线程呢?计算公式是:30(每秒请求数量) * 0.2(每个请求的处理秒数) + 4(给点缓冲buffer) = 10(线程数量)。

    为什么10个线程可以轻松抗住每秒30个请求?

    一个线程200毫秒可以执行完一个请求,那么一个线程1秒可以执行5个请求,理论上,只要6个线程,每秒就可以执行30个请求。也就是说,线程里的10个线程中,就6个线程足以抗住每秒30个请求了。剩下4个线程都在玩儿,空闲着。那为啥要多搞4个线程呢?很简单,因为你要留一点buffer空间。万一在系统高峰期,系统性能略有下降,此时不少请求都耗费了300多毫秒才执行完,那么一个线程每秒只能处理3个请求了,10个线程刚刚好勉强可以hold住每秒30个请求。所以你必须多考虑留几个线程。

    • 合理的超时时间设置

    一个接口,理论的最佳响应速度应该在200ms以内,或者慢点的接口就几百毫秒。如果一个接口响应时间达到1秒+,建议考虑用缓存、索引、NoSQL等各种你能想到的技术手段,优化一下性能。否则你要是胡乱设置超时时间是几秒,甚至几十秒,万一下游服务偶然出了点问题响应时间长了点呢?那你这个线程池里的线程立马全部卡死!合理的超时时间设置为多少?答案应该不超过300毫秒(这个需要根据实际压测数据做些优化)为啥呢?如果你的超时时间设置成了500毫秒,想想可能会有什么后果?考虑极端情况,如果服务B响应变慢,要500毫秒才响应,你一个线程每秒最多只能处理2个请求了,10个线程只能处理20个请求。大量的线程会全部卡死,来不及处理那么多请求,最后用户会刷不出来页面。如果你的线程池大小和超时时间没有配合着设置好,很可能会导致服务B短暂的性能波动,瞬间导致服务A的线程池卡死,里面的线程要卡顿一段时间才能继续执行下一个请求。哪怕一段时间后,服务B的接口性能恢复到200毫秒以内了,服务A的线程池里卡死的状况也要好一会儿才能恢复过来。你的超时时间设置的越不合理,比如设置的越长,设置到了1秒、2秒,那么这种卡死的情况就需要越长的时间来恢复。所以说,此时你的超时时间得设置成300毫秒,保证一个请求300毫秒内执行不完,立马超时返回。这样线程池里的线程不会长时间卡死,可以有条不紊的处理多出来的请求,大不了就是300毫秒内处理不完立即超时返回,但是线程始终保持可以运行的状态。这样当服务B的接口性能恢复到200毫秒以内后,服务A的线程池里的线程很快就可以恢复。

    八、总结:

    总结一下,上述几个Spring Cloud核心组件,在微服务架构中,分别扮演的角色:

    • Eureka:各个服务在启动时,Eureka Client组件会将本服务注册到Eureka Server,集群以应用名做区分,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
    • Ribbon:微服务之间发起请求的时候,基于Ribbon做负载均衡,从服务集群中选择一台
    • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
    • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
    • Zuul:微服务路由

    当然spring cloud家族还有Spring Cloud Config、Spring Cloud Bus、Spring Cloud for Cloud Foundry、Spring Cloud Cluster、Spring Cloud Consul、Spring Cloud Security、Spring Cloud Sleuth、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Zookeeper、Spring Cloud Connectors、Spring Cloud Starters、Spring Cloud CLI等等,具体信息请查看:

    中文文档:https://springcloud.cc/

    英文文档:http://spring.io/projects/spring-cloud

    来源:网易工程师-周延旭

    有任何问题欢迎留言交流~


    整理总结不易,如果觉得这篇文章有意思的话,欢迎转发、收藏,给我一些鼓励~

    有想看的内容或者建议,敬请留言!

    最近利用空余时间整理了一些精选Java架构学习视频和大厂项目底层知识点,需要的同学欢迎私信我发给你~一起学习进步!有任何问题也欢迎交流~

    Java日记本,每日存档超实用的技术干货学习笔记,每天陪你前进一点点~

    展开全文
  • tomcat高并发部署案例

    2013-03-31 18:39:24
    近期使用springmvc搞了个小项目,整体技术应用包括:mysql 5.6数据库,springmvc+mybatis+dbcp框架,开发效率有多爽就不提了,说说部署后的并发支持情况: 1.业务服务器采用centos 6.3 64位 linux,使用tomcat7作为jee...

    近期使用springmvc搞了个小项目,整体技术应用包括:mysql 5.6数据库,springmvc+mybatis+dbcp框架,开发效率有多爽就不提了,说说部署后的并发支持情况:

    1.业务服务器采用centos 6.3 64位 linux,使用tomcat7作为jee容器,针对tomcat 调优的地方就两处,修改如下:

     <Connector port="80" 
    	protocol="org.apache.coyote.http11.Http11NioProtocol"
                   connectionTimeout="20000"
    			   enableLookups="false"

     把protocol这里改成了org.apache.coyote.http11.Http11NioProtocol,另外配置enableLookups="false"关闭了客户端dns解析查询。

     

    针对linux操作系统调优的地方有:

    在/etc/security/limits.conf文件中添加如下信息:
     * soft nofile 655360
     * hard nofile 655360

     

    别的调整就没有了,tomcat开了访问日志记录,每秒访问数据库查询页面可以达到1800次请求/秒,响应数据在5k左右,是json数据,对于json数据来讲5k就不小了。

     

    2.数据库服务器

    mysql数据库服务器独立安装,使用innodb引擎,配置maxconnetions为1000,实际工作时因为有dbcp数据库缓冲池,在1000多个并发的情况下也并不会有特别多的数据库连接产生,高并发访问的单表数据量在20万左右,cpu占用差不多在15%左右,网络io在50M/s左右,理论来讲这台mysql撑起8000次每秒的请求没有问题。

     

     

    展开全文
  • 分享一个flask高并发部署方案

    万次阅读 2019-04-28 17:27:11
    这里分享一个用flask+gunicorn+gevent来实现高并发的后台。代码只是一个功能的抽象表达,只不过刚好可以在计算机上运行而已,所以这个项目结构很多地方是可以个性化修改的,我这里只是展示了我的用法。 关键词:...
  • https://segmentfault.com/a/1190000018626163
  •  高并发下的Nginx性能优化实战、解读Nginx的核心知识、掌握nginx核心原理?通过本期课程将解答我们的疑惑。
  •  高并发下的Nginx性能优化实战、解读Nginx的核心知识、掌握nginx核心原理?通过本期课程将解答我们的疑惑。
  • 金蝶作为中大型企业信息化管理的ERP管理软件,其特点在于对于服务器配置要求较高,作为针对性的云计算服务厂商我会讲解一下K3cloud高并发如何部署在阿里云上。做项目的都知道,小客户比较关注的是成本,大客户关注的...
  • 上一篇文章讲了在wndows 7下通过 apache 部署django项目,主要用于测试环境,本文针对生产线上使用nginx部署django,达到高并发便于管理的目的。 系统:CentOS7.4_x64 python2.7.5 django1.8.18 ip: 172.16.3.1.....
  • 你如何设计一个高并发项目

    千次阅读 2019-03-25 21:26:21
    1》框架设计:对项目拆分成功能单一小项目(参考购物网站),使用分布式框架,如:dubbo框架,微服务框架。 2》数据库:数据库集群部署,主备设计,读写分离,对数据量大读写操作频繁的表进行分库分表。 3》数据量...
  • 我定义为一款完整,性能,可用的前端性能监控系统,这是未来会达到的目的,现今的架构也基本支持了可用,性能的部署。实际上还不够,在很多地方还有优化的空间,我会持续的优化和升级。 开源不易,如果你也...
  • 最近由于项目的需要,学习了一下Nginx的知识,特此记录一下
  • 一、高并发解决方案 1、动态资源和静态资源分离; 2、CDN; 3、负载均衡【nginx】; 4、分布式缓存; 5、数据库读写分离及数据切分【垂直或水平】; 6、服务分布式部署; 7、并发编程; 二、互联网...
  • 项目部署

    2019-09-26 14:09:48
    1、nginx :高并发处理的好 2、apache :稳定 LAMP :Linux、Apache、MySQL、Python/Php/Perl LNMP :Linux、Nginx、MySQL、Python/Php/Perl 3、uwsgi 是Web服务器与Web框架之间一种简单而通用的接口 2、单项目部署...
  • 一个项目刚开始的时候是为了实现基本功能,随着版本和功能的迭代,大数据和高并发成了软件设计必须考虑的问题! 本质很简单,一个是慢,一个是等。 两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢...
  • tornado项目部署

    千次阅读 2018-11-01 11:54:08
    tornado项目部署 tornado是一个为了解决高并发的web框架,所以一般部署都会采用多进程部署项目,使之发挥出最大的自身优势(高并发) 1、进程数的确定依据,一般为每个CPU核心开启一个进程 2、安装多进程管理工具...
  • 【保姆级SSM教程】高并发朋友圈点赞项目设计 项目部署方法: git clone https://github.com/JackieLing/Sell-Circle-Option.git 所用技术栈: java spring mybatis springmvc html+css+js jsp ...
  • 成员,运营可以在平台后台管理系统中管理商品,订单,会员等买买买商城项目使用Java的SSM框架处理操作,同时使用了Dubbo框架,是一个分布式支持高并发的商城项目。数据库选择MySQL可用,缓存使用Redis部署,使用Solr...
  • 处理高并发是一个历久弥新的问题。 实话说,本人水平有限,并没有完全的解决方案(实际项目中并没有100%解决过,犹如梦魇)。 查各种资料来看,大部分的讨论都是基于具体问题(如纯Java代码,或只讨论oracle中的锁...
  • django 项目部署

    2019-01-07 08:47:09
    1、nginx :高并发处理的好 2、apache :稳定 LAMP :Linux、Apache、MySQL、Python/Php/Perl LNMP :Linux、Nginx、MySQL、Python/Php/Perl 3、uwsgi 是Web服务器与Web框架之间一种简单而通用的接口 2、单项目部署...
  • 其利用springboot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、负载均衡、断路器、数据监控等,都可以用springboot的开发风格做到一键启动和部署。学习和了解微服务对快速熟悉和掌握不同项目...
  • 文章目录一、秒杀系统高并发优化分析二、redis后端缓存优化编码1、使用redis暴露地址接口三、并发优化 一、秒杀系统高并发优化分析 下图中显示的红色部分都涉及到高并发问题。 1、为什么要单独获取系统时间 系统的...
  • 增加并发量的1、是在系统架构级别,而不是业务可以处理的事情。 在增加并发方面,启用通常通过使用数据库集群、应用程序集群和负载... 如果正常的bug,可以事后处理,或者立即处理,通过热升级的方式部署到生产。百...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 962
精华内容 384
关键字:

高并发项目部署