第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离
1.性能监控
1.1.JVM架构
运行时数据区:
-
方法区:最重要的内存区域,多线程共享,保存了类的信息(名称、成员、接口、父类),反射机制是重要的组成部分,动态进行类操作的实现;
-
堆内存(Heap):保存对象的真实信息,该内存牵扯到释放问题(GC);
-
栈内存(Stack):线程的私有空间,在每一次进行方法调用的时候都会存在有栈帧,采用先进后出的设计原则;
1、本地变量表;局部参数或形参,允许保存有32位的插槽(Solt),如果超过了32位的长度就
需要开辟两个连续性的插槽(long、double)—— volatile关键字问题;
2、操作数栈:执行所有得方法计算操作;
3、常量池引用:String类实例、Integer类实例
4、返回地址:方法执行完毕后的恢复执行的点; -
程序计数器:执行指令的一个顺序编码,该区域的所占比率几乎可以忽略;
-
本地方法栈:与栈内存功能类似,区别在于是为本地方法服务的;
1.2.堆
所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被称为 GC堆 ,是优化最多考虑的地方。
堆可以细分为:
-
新生代
1、Eden 空间
2、From Survivor 空间(S0)
3、To Survivor 空间(S1) -
老年代
-
永久代/元空间
JDK8以前永久代,受JVM管理,JDK8以后元空间,直接使用物理内存。因此默认情况下,元空间的大小仅受本地内存限制。
1.3.GC
1.3.1.GC流程
Oracle官网:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
1.3.2.GC收集器比较
- JDK8默认:Parallel Scavenge
- JDK9默认:G1
1.4.jconsole与jvisualvm
JDK的两个小工具jconsole、jvisualvm(升级版的jconsole),通过命令行启动,可监控本地和远程应用。
1.4.1.jvisualvm能干什么
监控内存泄漏,跟踪垃圾回收,执行时内存、CPU分析,线程分析…
线程状态:
- 运行:正在运行的
- 休眠:sleep方法
- 等待:wait方法
- 驻留:线程池里面的空闲线程
- 监视:阻塞的线程,正在等待锁
1.4.2.安装插件方便查看gc
工具 -> 插件 -> 可用插件->Visual GC
插件中心对应的URL:http://visualvm.github.io/pluginscenters.html
1.5.监控指标
1.5.1.中间件指标
Nginx
docker stats
每秒会动态刷新下面的监控数据
添加Nginx访问取样器
压测
Gateway
添加取样器
压测
1.5.2.数据库指标
- SQL耗时越小越好,一般情况下微妙级别
- 命中率越高越好,一般情况下不能低于95%
- 锁等待次数越低越好,等待时间越短越好
1.5.3.JMeter压测报告分析
中间件越多,性能损失越大,大多都损失在网络交互了;
业务逻辑:
- 数据库(MySQL优化,上线关闭SQL日志)
- 模板的渲染速度(开发环境是关闭缓存的,生产环境开启缓存)
- 静态资源(Nginx动静分离)
线上OOM演示(服务崩溃)
- 将应用 VM options调整为 -Xmx100m
- 使用JMeter,设置200个线程进行压测
- 应用后台抛出 OOM 异常,系统不能正常访问
优化
- 调整vm参数:-Xmx1024m -Xms1024m -Xmn512m
- 修改业务实现代码,减少数据库访问次数
1.6.JVM分析与调优
1.6.1.几个常用工具
- Arthas:https://arthas.aliyun.com/zh-cn/
- GCeasy:https://gceasy.io/
1.6.2.命令示例
JDK监控和故障处理命令有
- jps
- jstat
- jmap
- jhat
- jstack
- jinfo
1.6.3.jmap生成dump
jps
# pid:通过jps可以查看到进程id
jmap -dump:live,format=b,file=c:\test.dump <pid>
分析:使用jvisualvm导入dump文件进行分析
1.6.4.JVM调优项
常用 JVM 参数:
- -Xms :初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调 整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
- -Xmx :最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM 会减少堆直到 -Xms的最小限制
- -Xmn :新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap - heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保
证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的3/8。- -XX:SurvivorRatio :新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个 Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
- -Xss :每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小 为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能
生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值 在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使
用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类
似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named
ThreadStackSize”一般设置这个值就可以了。
Spring Boot 部署运行方案:
使用默认JVM配置运行
- 前台运行,关闭窗口后退出:java -jar /jar包路径
- 后台运行:nohup java -jar /jar包路径
- #后台运行,指定启动日志记录文件:nohub java -jar /jar包路径 > /指定日志文件路径
配置JVM参数运行
- 前台运行
java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m - Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar /jar包路径 - 后台运行
nohup java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar /jar包路径
JVM参数说明:
- -XX:MetaspaceSize=128m (元空间默认大小)
- -XX:MaxMetaspaceSize=128m (元空间最大大小)
- -Xms1024m (初始化堆大小)
- -Xmx1024m (最大堆大小)
- -Xmn256m (新生代大小)
- -Xss256k (栈最大深度大小)
- -XX:SurvivorRatio=8 (新生代分区比例 8:2)
- -XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
知识点:
JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是-XX:MetaspaceSize=128m (元空间默认大小)-XX:MaxMetaspaceSize=128m (元空间最大大小)
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
使用本地化的内存有什么好处呢?
最直接的表现就是java.lang.OutOfMemoryError: PermGen空间问题将不复存在,因为默认的类的 元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多
大(貌似容量还与操作系统的虚拟内存有关),这解决了空间不足的问题。不过,让Metaspace变
得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参
数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大 小。
2.压力测试
压力测试考察当前硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性维持在一个标准范围之内,做到心中有数。
使用压力测试,我们有希望找到很多种用其它测试方法更难发现的错误。有两种错误类型是:内存泄漏,并发与同步。
有效的压力测试系统将应用以下这些关键条件:重复,并发,量级,随机变化。
2.1.性能指标
响应时间(Response Time:RT)
响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器返回的响应结束,整个过程所耗费的时间。
HPS(Hits Per Second)每秒点击次数,单位是次/秒
TPS(Transaction Per Seconde)系统每秒处理交易数,单位是笔/秒
QPS(Query Per Second)系统每秒处理查询次数,单位是次/秒
对于互联网业务中,如果某些业务有且仅有一个请求连接,那么TPS=QPS=HPS,一般情况下使用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单机请求。
无论TPD、QPS、HPS,这些指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:
金融行业:1000TPS ~ 50000TPS,不包括互联网化的活动(比如秒杀,营销活动等)
保险行业:100TPS ~100000TPS,不包括互联网化的活动(比如秒杀,营销活动等)
制造行业:10TPS ~ 5000TPS
电商网站:10000TPS ~1000000TPS
中型网站:1000TPS ~ 50000TPS
小型网站:500TPS ~ 10000TPS
最大响应时间(Max Response Time)指用户发出请求或者指令到系统做出反应(响应)的最大时间
最少响应时间(Mininum Response Time)指用户发出请求或者指令到系统做出反应(响应)的最少时间
90%响应时间(90% Response Time)指所有用户的响应时间进行排序,第90%的响应时间
从外部看,性能测试主要关注如下三个指标
吞吐量:每秒系统能够处理的请求数、任务数
响应时间:服务处理一个请求或一个任务的耗时
错误率:一批请求中结果出错的请求所占比例
影响性能考虑点包括:
- 数据库、应用程序、中间件(Tomcat、Nginx等)、网络和操作系统等方面
- 首先考虑自己的应用属于CPU密集型还是IO密集型
2.2、性能测试工具
常用的性能测试工具有很多,在这里列举几个比较实用的。对于开发人员来说,首选是一些开源免费的性能(压力)测试软件,例如ab(ApacheBench)、JMeter 等;对于专业的测试团队来说,付费版的LoadRunner 是首选。当然,也有很多公司是自行开发了一套量身定做的性能测试软件,优点是定制化强,缺点则是通用性差。
3.JMeter
3.1.JMeter安装
- 官网下载:https://jmeter.apache.org/download_jmeter.cgi
- 解压安装,运行 jmeter.bat
3.2、JMeter基本使用
3.2.1.新建测试计划
3.2.2.添加线程组
3.2.3.添加取样器
3.2.4.添加监听器
3.2.5.启动压测&查看分析
3.3.Address Already in use 错误解决
原因:windows本身提供的端口访问机制的问题,windows提供给 TCP/IP 连接的端口为 1024 - 5000,并且要四分钟来循环回收,就导致我们在短时间内跑大量的请求时将端口占满了。
解决方案:
-
Win+R打开运行窗口,输入 regedit 命令打开注册表
-
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
下,1、右击Parameters,添加一个新的DWORD,名字为 MaxUserPort,双击 MaxUserPort,输入数值数据为 65534,基数选择十进制(若分布式运行,控制机器和负载机器都需要这样操作)
2、右击Parameters,添加一个新的DWORD,名字为 TCPTimedWaitDelay,双击
TCPTimedWaitDelay,输入数值数据为 30,基数选择十进制(若分布式运行,控制机器和负载机器都需要这样操作) -
修改配置完毕后需要重启机器才会生效
4.Nginx动静分离
4.1.架构
- 将所有项目的静态资源都需放在nginx里面
- 规则:/nginx/html/static/**
- 所有静态资源请求都统一由nginx直接返回
4.2.静态资源迁移
- 将 gmall-product\resources\static\index 整个文件夹上传到
/mydata/nginx/html/static - 删除 gmall-product\resources\static\index 整个文件夹
4.3.修改index.html模板页面
在所有模板页面用到的静态资源统一加上 /static/ 前置路径
4.4.Nginx配置
gmall.conf
location /static/ {root /usr/share/nginx/html;
}
重启nginx容器
docker restart nginx
4.5.首页全量数据获取压测
即使提高压测线程数,也不会造成JMeter卡死情况
5.三级分类数据获取优化
5.1.优化代码实现逻辑
优化业务实现的代码逻辑:将数据库的多次查询变为一次
/*** 查询首页展示分类列表* @return*/
@Override
public Map<String, List<Catalog2VO>> getCatalogJson() {// 查询出所有的分类数据List<CategoryEntity> entities = list(null);// 查询所有一级分类List<CategoryEntity> level1Categories = getParents(entities, 0L);// 封装数据Map<String, List<Catalog2VO>> map = level1Categories.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {// 查询当前一级分类的所有二级分类,封装成voList<CategoryEntity> level2Categories = getParents(entities, v.getCatId());List<Catalog2VO> catalog2VOS = null;if (level2Categories != null) {catalog2VOS = level2Categories.stream().map(category2 -> {Catalog2VO catalog2VO = new Catalog2VO(v.getCatId().toString(),null,category2.getCatId().toString(),category2.getName());// 查询当前二级分类的所有三级分类,封装为voList<CategoryEntity> level3Categories = getParents(entities, category2.getCatId());if (level3Categories != null) {List<Catalog2VO.Catalog3VO> catalog3VOS = level3Categories.stream().map(catalog3 -> {Catalog2VO.Catalog3VO catalog3VO = new Catalog2VO.Catalog3VO(category2.getCatId().toString(),catalog3.getCatId().toString(),catalog3.getName());return catalog3VO;}).collect(Collectors.toList());catalog2VO.setCatalog3List(catalog3VOS);}return catalog2VO;}).collect(Collectors.toList());}return catalog2VOS;}));return map;
}/*** 根据分类父id查找所有的子分类* @param categories 所有分类数据* @param parentId 分类父id* @return*/
private List<CategoryEntity> getParents(List<CategoryEntity> categories, Long parentId) {List<CategoryEntity> entities = categories.stream().filter(categoryEntity -> categoryEntity.getParentCid().equals(parentId)).collect(Collectors.toList());return entities;
}
5.2.JMeter压测结果对比
- 未加索引和代码逻辑未优化
QPS:5/s - pms_category 表给 parent_cid 字段加索引
QPS:25/s - 优化代码逻辑
QPS:395/s
相关文章:
第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离
1.性能监控 1.1.JVM架构 运行时数据区: 方法区:最重要的内存区域,多线程共享,保存了类的信息(名称、成员、接口、父类),反射机制是重要的组成部分,动态进行类操作的实现;…...
【python 基础篇 十一】python的函数-------函数的偏函数 高阶函数 返回函数 匿名函数 闭包
目录1.偏函数2.高阶函数3.返回函数4.匿名函数5.闭包1.偏函数 概念 当我们写一个参数比较多的函数时,如果有些参数,大部分场景下都是某一个固定值,那么为了简化使用,就可以创建一个新函数,指定我们要使用的函数的某个…...
妇女节到了,祝福所有女神 Happy Women‘s Day!
在每年3月8日人们庆祝妇女节 Womens Day is cllebrated on March 8 every year.国际妇女节(IWD),中国内地称“三八”国际劳动妇女节或国际劳动妇女节。是在每年的3月8日为庆祝妇女在经济、政治和社会等领域作出的重要贡献和取得的…...
etcd集群通过 Leader 写入数据,为什么K8s HA集群中讲每个 kube-apiserver 只和本机的 ETCD 通信
写在前面 对这个我不太明白,所有在 stackOverflow 的请教了大佬这里分享给小伙伴理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整…...
HTML 表单
HTML 表单和输入 HTML 表单用于收集不同类型的用户输入。 在线实例 创建文本字段 (Text field) 本例演示如何在 HTML 页面创建文本域。用户可以在文本域中写入文本。 创建密码字段 本例演示如何创建 HTML 的密码域。 (在本页底端可以找到更多实例。) …...
HTML、CSS学习笔记5(移动端基础知识、Flex布局)
一、移动端基础知识 1.PC端和移动端区别 移动端:手机版网页,手机屏幕小,网页宽度多数为100%,没有版心 PC端:电脑版网页,屏幕大,网页固定版心 PC端和移动端不是同一个网页 2.如何在电脑里面…...
【Java学习笔记】2.Java 开发环境配置
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境。 window系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK,下载地址:https://www.oracle.com/java/technologies/downloads/,在下载页面中根据自己的系统选…...
MyBatis——进阶操作(2)
标签 if标签 当提交的表单中有些为非必填项,用户并没有上传这些属性的值,那么程序可以上传NUll,也可以用if标签判断用户有没有上传这个值 <if test"参数!null">操作 </if>其中test中填写一条语句,如果得…...
循环结构
循环结构循环结构一、课前问答二、while循环三、do-while循环四、for循环五、流程控制5.1 break5.2 continue循环结构 一、课前问答 1、switch支持的数据类型。 2、switch中break的作用。 3、多重if如果多个条件都成立,执行方式。 二、while循环 语法: …...
漫谈数据库表设计及索引设计
一.数据库表设计 在数据库表设计上有个很重要的设计准则,称为范式设计。 什么是范式设计? 范式来自英文Normal Form,简称NF。MySQL是关系型数据库,但是要想设计—个好的关系,必须使关系满足一定的约束条件,…...
【JavaWeb】CSS基础知识:引入方式 + 选择器
CSS引入 CSS的引入有三种,三种的优缺点各不相同。 行内样式表 <!-- 行内样式表 --><!-- 相当于标签的一个属性 --><!-- 只对当前标签生效 --><!-- 优先级较高,会覆盖其他样式 --><p style"color: blue;">这是…...
02-前端-javaScript
文章目录JavaScript1,JavaScript简介2,JavaScript引入方式2.1 内部脚本2.2 外部脚本3,JavaScript基础语法3.1 书写语法3.2 输出语句3.3 变量3.3.1 全局变量var3.3.2 局部变量let3.3.3 常量const3.4 数据类型3.5 运算符3.5.1 \和区别 ▲3.5.2 …...
对链表学习的总结一
一,单链表结构定义 C/C++ 数组:一组具有相同类型数据的集合。结构体:不同类型数据的集合。 // Definition for singly-linked list. struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next...
toSring()还有个高级用法好用
Object.prototype.toString()能够很好的判断数据的类型及内置对象 typeof xxx:能判断出number,string,undefined,boolean,object,function(null是object)Object.prototype.toString.call(xxx):能判断出大部分类型Array.isArray(xxx):判断是否为数组var test= Object.…...
Linux--多线程(3)
目录1. POSIX信号量1.1 概念2. 基于环形队列的生产消费者模型2.1 环形队列的基本原理2.2 基本实现思想3. 多生产多消费1. POSIX信号量 1.1 概念 信号量本质是一个计数器,申请了信号量以后,可以达到预定临界资源的效果。 POSIX信号量和SystemV信号量相同…...
【spring】事务
概述 1、什么事务 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败 2、事务四个特性(ACID) (1)原子性 (2)一致性 (3…...
博通仍然是美股市场最好的芯片半导体股
来源:猛兽财经 作者:猛兽财经 博通(AVGO)是一家快速增长的半导体公司,并且有很高的股息分红,目前其股息收益率已经高出了平均水平3.2%,而且估值非常合理,仅为预期净利润的14倍。 虽然博通也受到了经济衰退影…...
java开发手册之异常日志
文章目录异常日志异常处理日志规约异常日志 异常处理 1.Java 类库中定义的一类 RuntimeException可以通过预先检查进行规避,而不应该通过 catch 来处理 比如:IndexOutOfBoundsException,NullPointerException 等等。 说明:无法通…...
P6专题:关于P6 EPPM和PPM的区别及选型
目录 引言 什么是 Primavera P6 项目管理? Primavera P6 PPM 关键点 Primavera P6 PPM 是独立工具还是企业工具? 什么是 Primavera P6 企业项目组合管理? 那么EPPM的windows-tool呢? P6 EPPM 适合谁? 更多对比…...
亿万级海量数据去重软方法
文章目录原理案例一需求:方法案例二需求:方法:参考原理 在大数据分布式计算框架生态下,提升计算效率的方法是尽可能的把计算分布式话、并行化,避免单节点计算过载,把计算分摊到各个节点。这样解释小白能够…...
记录--手摸手带你撸一个拖拽效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近看见一个拖拽效果的视频(抖音:艾恩小灰灰),看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然…...
python高德地图+58租房网站平台源码
wx供重浩:创享日记 对话框发送:python地图 免费获取完整源码源文件说明文档配置教程等 在PyCharm中运行《高德地图58租房》即可进入如图1所示的高德地图网页。 具体的操作步骤如下: (1)打开地图网页后,在编…...
ubuntu 将jupyter-lab保存为桌面快捷方式和favourites
ubuntu: 将jupyter-lab保存为桌面快捷方式和favourites desktop shortcut 建立一个新的desktop文件 cd ~/Desktop touch Jupyter-lab.desktop将文件修改成如下: [Desktop Entry] Version1.0 NameJupyterlab CommentBack up your data with one click Exec/home/cjb/…...
Java 类和对象简介
类是对象的抽象,是一组具有相同特性(属性,事物的状态信息)和行为(事物能做什么)的事物的集合,可以看做一类事物的模板。 对象是类的实例化,是具体的事物。 比如:人类和…...
时间复杂度的计算
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 文章目录123456789时间复杂度(就是一个函数)的计算,…...
站内信箱系统的设计与实现
技术:Java、JSP等摘要:在经济全球化和信息技术成为发展迅速的今时今日,人们通过电子邮件收发进行信息传递已经成为主流。随着互联网和网络办公的发展,电子邮件正在被广泛应用在人们的日常生活中。跟据调查研究统计,在全…...
systemV共享内存
systemV共享内存 共享内存区是最快的IPC形式。共享内存的大小一般是4KB的整数倍,因为系统分配共享内存是以4KB为单位的(Page)!4KB也是划分内存块的基本单位。 之前学的管道,是通过文件系统来实现让不同的进程看到同一…...
Python基础之if逻辑判断
在学习if语句之前,我们先学习一种数据类型,布尔类型(bool),在if语句中,我们需要通过判断条件是否为真或者假,才进入下面的语句块执行。 一、布尔类型(bool) 布尔类型&a…...
实现pdf文件预览
前言 工作上接到的一个任务,实现pdf的在线预览,其实uniapp中已经有对应的api:uni.openDocument(OBJECT)(新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。)**实现了相关功能…...
【java】alibaba Fastjson --全解史上最快的JSON解析库
文章目录前序Fastjson 简介Fastjson 的优点速度快使用广泛测试完备使用简单功能完备下载和使用将 Java 对象转换为 JSON 格式JSONField创建 JSON 对象JSON 字符串转换为 Java 对象使用 ContextValueFilter 配置 JSON 转换使用 NameFilter 和 SerializeConfigFastjson 处理日期F…...
用数据库做新闻网站系统/榆林seo
1. 访问DDR3我们使用名为DDR3-test.c的PetaLinux应用访问DDR3存储器。该应用经过精心设计,可向DDR存储器位置写入数据并从这里读取数据。DDR3是双列直插式存储器模块,可提供用于存储用户代码和数据的SDRAM。如上文所述,用户需要知道DDR存储器…...
专业设计网站公司/官网建站多少钱
OO设计真得不能够解决在Motive中提到得例子吗?我认为AOP也是OO,或者至少是OO得延续。OO不只有inheritance and polymorphism。在设计模式中Module Method 就可以解决这个问题,难道设计模式不是为OO准备得?看到后面, 我…...
网站制作:网推宝|百度/互联网营销推广
使用plugin生成groovy脚本,或者参考已有的groovy脚本。 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciandcd 1. 使用插件来写groovy脚本 常用的功能,可以安装对应的插件,然后…...
奇艺广州网站建设熊掌号/西安seo外包平台
是不是所有的项目都这么赶?我原先在福州的公司上班时每天加到12点多,有时候到3点半都有。现在在厦门的公司也是要天天加班,双休日几乎都没的休息了。听说后天如果不能全部走通就要通宵啦! 为什么项目都要这么赶呢?是…...
西部数码网站管理助手/上海专业网络推广公司
1.执行whereis mysql会有如下打印:mysql: /usr/bin/mysql /usr/lib64/mysql /usr/include/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz2.cd /usr/share/mysql目录下查看存在mysql.server文件3.复制mysql.server文件 到 /etc/init.d/下,命名为…...
设计网站需要多少钱/雅虎搜索引擎入口
一、正向代理与反向代理 核心区别: 正向代理:代理对象【客户端】,隐藏客户端。 反向代理:代理对象【服务器 】,隐藏服务器。 正向代理 client想访问server网站,但是不知道在哪,proxy知道在…...