Vue 跨域

Vue 跨域 缘起 最近实验课上需要重构以前写过的一个项目 (垃圾堆) ,需要添加发生邮件提醒的功能,记得以前写过一个PHP版的实现,所以想把PHP写的功能整理成一个服务,然后在前端调用。但是这个项目是JavaWeb,也就是说我需要面对跨域的问题。不过本篇文章,讲的并不是如何解决这样的跨域问题,而是我在找如何解决这个问题的路上遇到的坑。 其实,在前端工程化大行其道的现在,前后端已经分离开来,前端为了提高工作流效率往往自己开一个小型的服务器,就比如webpack.devServer。这样在前端调用后端接口的时候必然会面临跨域的问题, 如题,Vue-cli 3.x + axios 跨域方案 就是解决这里的跨域问题。这里的跨域是基于webpack的devServer的代理功能 (proxy) 来实现开发环境中的跨域,也就是说本篇所讨论的并不能解决生产环境下的跨域问题,因为webpack.devServer是DevDependencies,一旦打包上线,这个proxy代理就会失效。但是这并不妨碍我们开发中使用跨域来提高开发效率和体验。 开始填坑 其实这个问题解决起来很简单,网上也是很多教程,为了文章完整性,我这里也做一个尽量完备的展示,介绍如何配置Vue-cli 3.x来实现跨域 。 vue.config.js中devServer.proxy 的配置解析 Vue-cli3.x比Vue-cli2.x构建的项目要简化很多,根目录下只有./src和./public文件夹,所以网上很多教程说config目录下的vue.config.js是说的vue-cli 2.x版本。那么对于Vue-cli 3.x版本,构建也很简单,直接在根目录里建一个vue.config.js配置文件就可以了,我们直接看devServer.proxy里的代码: 我这里devServer的地址是: localhost:8080/,需要代理的地址是: localhost/index/phpinfo.php (我自己写的一个测试跨域用的php,返回一个’ok') 下面是根据上面的地址需要配置的proxy对象 module.exports = { devServer: { proxy: { '/api': { target: 'http://192.168.80.2:38081', ws: true, changeOrigin: true, pathRewrite: { '^/api': '' } } } } } # main.ts axios.defaults.baseURL = '/api' 大部分教程到这里就停止了,但是我在这里做一个扩展,为了让读者理解这里的配置是如何起作用的 (以下内容整理自http-proxy-middleware的npm描述里,http-proxy-middleware是一个npm模块,是proxy的底层原理实现) 。 foo://example.com:8042/over/there?name=ferret#nose _/ ______________/_________/ _________/ __/ | | | | | scheme authority path query fragment 复制代码 以我上面的配置为例,'/index'这个key在http-proxy-middleware中被称为context——用来决定哪些请求需要被target对应的主机地址 (这里是http://localhost/index) 代理,它可以是 字符串,含有通配符的字符串,或是一个数组,分别对应于path matching(路径匹配)wildcard path matching(通配符路径匹配)multiple path matching(多路径匹配),而这里的path指的就是上图所标识的path段。 ...

2020-05-22 · 1 min · 191 words · -

内联样式

“内联样式” CSS 样式代码插入的形式来看基本可以分为以下3种: 内联式、嵌入式和外部式三种。 内联式css样式表就是把css代码直接写在现有的HTML标签中,如下面代码: 这里文字是红色。 注意要写在元素的开始标签里,下面这种写法是错误的: 这里文字是红色。 并且css样式代码要写在style=““双引号中,如果有多条css样式代码设置可以写在一起,中间用分号隔开。如下代码: 这里文字是红色。 作者: LvyCode 链接: https://www.jianshu.com/p/16b40c7a479a 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-05-21 · 1 min · 17 words · -

Lodash

“Lodash” Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。简单的说就是,很多方法lodash已经帮你写好了,直接调用就行,不用自己费尽心思去写了,而且可以统一方法的一致性。Lodash使用了一个简单的 _ 符号,就像Jquery的 $ 一样,十分简洁。 类似的还有Underscore.js和Lazy.js 作者: 戈德斯文 链接: https://www.jianshu.com/p/d46abfa4ddc9 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-05-21 · 1 min · 14 words · -

lerna

“lerna” 什么是lerna?为什么要使用lerna? lerna到底是什么呢?lerna官网上是这样描述的。 A tool for managing JavaScript projects with multiple packages. 这个介绍可以说很清晰了,引入lerna后,上面提到的问题不仅迎刃而解,更为开发人员提供了一种管理多packages javascript项目的方式。 自动解决packages之间的依赖关系 通过git 检测文件改动,自动发布 根据git 提交记录,自动生成CHANGELOG 使用lerna的基本工作流 环境配置 Git 在一个lerna工程里,是通过git来进行代码管理的。所以你首先要确保本地有正确的git环境。 如果需要多人协作开发,请先创建正确的git中心仓库的链接。 因此需要你了解基本的git操作,在此不再赘述。 npm仓库 无论你管理的package是要发布到官网还是公司的私有服务器上,都需要正确的仓库地址和用户名。 你可运行下方的命令来检查,本地的npm registry地址是否正确。 npm config ls 复制代码 lerna 你需要全局安装lerna工具。 npm install lerna -g 复制代码 初始化一个lerna工程 在这个例子中,我将在我本地d:/ 根目录下初始化一个lerna工程。 在d:/ 下创建一个空的文件夹,命名为lerna-demo mkdir lerna-demo 复制代码 初始化 通过cmd进入相关目录,进行初始化 cd d:/lerna-demo lerna init 复制代码 执行成功后,目录下将会生成这样的目录结构。 - packages(目录) - lerna.json(配置文件) - package.json(工程描述文件) 复制代码 添加一个测试package 默认情况下,package是放在packages目录下的。 // 进入packages目录 cd d:/lerna-demo/packages // 创建一个packge目录 mkdir module-1 // 进入module-1 package目录 cd module-1 // 初始化一个package npm init -y 复制代码 执行完毕,工程下的目录结构如下 ...

2020-05-16 · 2 min · 245 words · -

vue basic

vue basic vue3 npm init vue@latest JSX JSX 的全称是 Javascript and XML,React 发明了 JSX,它是一种可以在 JS 中编写 XML 的语言。 安装vue sudo pacman -S nodejs sudo pacman -S yarn npm install -g @vue/cli yarn global add vue yarn global remove vue-cli yarn global add @vue/cli 用vue cli 创建一个项目, vue create 会创建一个目录 “hello-world” vue create hello-world 或者 使用图形界面 vue ui unit test Jest E2E test Cypress run yarn serve ...

2020-05-16 · 4 min · 728 words · -

OkHttp

“OkHttp” https://github.com/square/okhttp RequestBody body = RequestBody.create(MediaTypeJson, jsonStr0); Request request = new Request.Builder() .url(url0) .post(body) .build(); String resp = null; try (Response response = client.newCall(request).execute()) { resp = response.body().string(); } catch (IOException e) { e.printStackTrace(); } proxy static Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8899)); static OkHttpClient client = new OkHttpClient.Builder().proxy(proxy).build(); 1. 历史上Http请求库优缺点 在讲述OkHttp之前, 我们看下没有OkHttp的时代, 我们是如何完成http请求的. 在没有OkHttp的日子, 我们使用HttpURLConnection或者HttpClient. 那么这两者都有什么优缺点呢? 为什么不在继续使用下去呢? HttpClient是Apache基金会的一个开源网络库, 功能十分强大, API数量众多, 但是正是由于庞大的API数量使得我们很难在不破坏兼容性的情况下对它进行升级和扩展, 所以Android团队在提升和优化HttpClient方面的工作态度并不积极. HttpURLConnection是一种多用途, 轻量极的HTTP客户端, 提供的API比较简单, 可以容易地去使用和扩展. 不过在Android 2.2版本之前, HttpURLConnection一直存在着一些令人厌烦的bug. 比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能: ...

2020-05-15 · 1 min · 134 words · W10N

hugo 搜索

“hugo 搜索” Algolia https://www.algolia.com/ https://www.qikqiak.com/post/hugo-integrated-algolia-search/ https://github.com/actions/setup-node https://github.com/replicatedhq/hugo-algolia

2020-05-13 · 1 min · 7 words · W10N

Linux性能测试工具

Linux性能测试工具 uptime uptime命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况。 uptime的输出包含一项内容是load average,显示了最近1,5,15分钟的负荷情况。它的值代表等待CPU处理的进程数,如果CPU没有时间处理这些进程,load average值会升高;反之则会降低。 load average的最佳值是1,说明每个进程都可以马上处理并且没有CPU cycles被丢失。对于单CPU的机器,1或者2是可以接受的值;对于多路CPU的机器,load average值可能在8到10之间。 也可以使用uptime命令来判断网络性能。例如,某个网络应用性能很低,通过运行uptime查看服务器的负荷是否很高,如果不是,那么问题应该是网络方面造成的。 dmesg dmesg命令主要用来显示内核信息。使用dmesg可以有效诊断机器硬件故障或者添加硬件出现的问题。 另外,使用dmesg可以确定您的服务器安装了那些硬件。每次系统重启,系统都会检查所有硬件并将信息记录下来。执行/bin/dmesg命令可以查看该记录。 top top命令显示处理器的活动状况。缺省情况下,显示占用CPU最多的任务,并且每隔5秒钟做一次刷新。 Process priority的数值决定了CPU处理进程的顺序。LIUNX内核会根据需要调整该数值的大小。nice value局限于priority。priority的值不能低于nice value (nice value值越低,优先级越高) 。您不可以直接修改Process priority的值,但是可以通过调整nice level值来间接地改变Process priority值,然而这一方法并不是所有时候都可用。如果某个进程运行异常的慢,可以通过降低nice level为该进程分配更多的CPU。 iostat iostat由Red Hat Enterprise Linux AS发布。同时iostat也是Sysstat的一部分,可以下载到,网址是http://perso.wanadoo.fr/sebastien.godard/ 执行iostat命令可以从系统启动之后的CPU平均时间,类似于uptime。除此之外,iostat还对创建一个服务器磁盘子系统的活动报告。该报告包含两部分: CPU使用情况和磁盘使用情况。 vmstat vmstat提供了processes, memory, paging, block I/O, traps和CPU的活动状况 sar sar是Red Hat Enterprise Linux AS发行的一个工具,同时也是Sysstat工具集的命令之一,可以从以下网址下载: http://perso.wanadoo.fr/sebastien.godard/ sar用于收集、报告或者保存系统活动信息。sar由三个应用组成: sar显示数据、sar1和sar2用于收集和保存数据。 使用sar1和sar2,系统能够配置成自动抓取信息和日志,以备分析使用。配置举例: 在/etc/crontab中添加如下几行内容 同样的,你也可以在命令行方式下使用sar运行实时报告。如图所示: 从收集的信息中,可以得到详细的CPU使用情况(%user, %nice, %system, %idle)、内存页面调度、网络I/O、进程活动、块设备活动、以及interrupts/second KDE System Guard KDE System Guard (KSysguard) 是KDE图形方式的任务管理和性能监视工具。监视本地及远程客户端/服务器架构体系的中的主机。 free /bin/free命令显示所有空闲的和使用的内存数量,包括swap。同时也包含内核使用的缓存。 Traffic-vis Traffic-vis是一套测定哪些主机在IP网进行通信、通信的目标主机以及传输的数据量。并输出纯文本、HTML或者GIF格式的报告。 注: Traffic-vis仅仅适用于SUSE LINUX ENTERPRISE SERVER。 ...

2020-05-10 · 1 min · 78 words · W10N

macvlan

“macvlan” https://cizixs.com/2017/02/14/network-virtualization-macvlan/ macvlan 是 linux kernel 比较新的特性,可以通过以下方法判断当前系统是否支持: modprobe macvlan lsmod | grep macvlan macvlan 19046 0 macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 mac 地址,也可以配置上 ip 地址进行通信。macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。macvlan 和 bridge 比较相似,但因为它省去了 bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,macvlan 自身也完美支持 VLAN。 四种模式 private mode: 过滤掉所有来自其他 macvlan 接口的报文,因此不同 macvlan 接口之间无法互相通信 vepa(Virtual Ethernet Port Aggregator) mode: 需要主接口连接的交换机支持 VEPA/802.1Qbg 特性。所有发送出去的报文都会经过交换机,交换机作为再发送到对应的目标地址 (即使目标地址就是主机上的其他 macvlan 接口) ,也就是 hairpin mode 模式,这个模式用在交互机上需要做过滤、统计等功能的场景。 bridge mode: 通过虚拟的交换机讲主接口的所有 macvlan 接口连接在一起,这样的话,不同 macvlan 接口之间能够直接通信,不需要将报文发送到主机之外。这个模式下,主机外是看不到主机上 macvlan interface 之间通信的报文的。 passthru mode: 暂时没有搞清楚这个模式要解决的问题 VEPA 和 passthru 模式下,两个 macvlan 接口之间的通信会经过主接口两次: 第一次是发出的时候,第二次是返回的时候。这样会影响物理接口的宽带,也限制了不同 macvlan 接口之间通信的速度。如果多个 macvlan 接口之间通信比较频繁,对于性能的影响会比较明显。 ...

2020-05-04 · 2 min · 273 words · W10N

go 原子操作

go 原子操作 原子操作 像Java一样,Golang支持很多CAS操作。运行结果是unsaftCnt可能小于200,因为unsafeCnt++在机器指令层面上不是一条指令,而可能是从内存加载数据到寄存器、执行自增运算、保存寄存器中计算结果到内存这三部分,所以不进行保护的话有些更新是会丢失的。 package main import ( “fmt” “time” “sync/atomic” “runtime” ) func main() { // IMPORTANT!!! runtime.GOMAXPROCS(4) // thread-unsafe var unsafeCnt int32 = 0 for i := 0; i < 10; i++ { go func() { for i := 0; i < 20; i++ { time.Sleep(time.Millisecond) unsafeCnt++ } }() } time.Sleep(time.Second) fmt.Println("cnt: ", unsafeCnt) // CAS toolkit var cnt int32 = 0 for i := 0; i < 10; i++ { go func() { for i := 0; i < 20; i++ { time.Sleep(time.Millisecond) atomic.AddInt32(&cnt, 1) } }() } time.Sleep(time.Second) cntFinal := atomic.LoadInt32(&cnt) fmt.Println("cnt: ", cntFinal) } ...

2020-04-26 · 1 min · 114 words · -

yum, dnf repo

yum, dnf repo CentOS Extras —— 在 CentOS 5 及 6,这些组件提供额外功能,但不损坏 CentOS 与上游的兼容性,也不会更新基本组件,然而上游并未测试这些软件,它们亦不包含在上游产品内。在 CentOS 7 这是上游的软件库,也包含额外的 CentOS 组件。CentOS 的开发小组已经针对这个软件库内的每个程序作出测试,确定它们能在 CentOS 下运作。这个软件库已连同 CentOS 一并安装,并缺省为启用的。 CentOSPlus —— 这些组件为了提供额外功能,会更改 CentOS 的某些基本组件。这个软件库会导致 CentOS 与上游供应者的内容有异。CentOS 的开发小组已经针对这个软件库内的每个程序作出测试,确定它们能在 CentOS 下运作。上游供应者并未测试这些软件,它们亦不包含在上游产品内。这个软件库已连同 CentOS 一并安装,但缺省为停用的。由这个软件库提供的受欢迎组件包括: CentOS-Plus 内核 (含有额外修正、驱动程序/功能的重建内核) ,支持 postgresql 数据库的 postfix (官方版本只支持 MySQL) 。

2020-04-26 · 1 min · 45 words · -

podman in crostini

podman in crostini ERRO[0000] ‘overlay’ is not supported over btrfs at “/var/lib/containers/storage/overlay” https://bugs.chromium.org/p/chromium/issues/detail?id=938877&q=overlayfs&can=2 https://bugs.chromium.org/p/chromium/issues/detail?id=878034

2020-04-25 · 1 min · 14 words · -

华为云CCE, docker 实例发监控数据到influxdb

华为云CCE, docker 实例发监控数据到influxdb docker集群内部新建telegraf实例 从官方repo取到的telegraf镜像 不是最新版本, 手动上传导出 的docker image 到华为云,并创建telegraf 实例 telegraf使用influxdb_listener input plugin docker 实例 内的应用 用go metrics influxdb发数据到集群内的telegraf 的 influxdb listener

2020-04-22 · 1 min · 23 words · -

ssh Multiplexing,mux

ssh Multiplexing,mux 管理multiplexing 查看当前的状态 ssh -O check machine1 ssh -O check 192.168.50.169 -l root # Master running (pid=91057) 停止接受新的会话 ssh -O stop machine1 $ ssh -O stop root@47.91._._ # Stop listening request sent. 退出所有会话 ssh -O exit root@47.91._._ # Exit request sent. Session Multiplexing emacs /etc/ssh/ssh_config emacs ~/.ssh/config #--- Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p ControlPersist 10m http://schin.space/ops/OPS-openssh-multiplexing/ 很多使用类Unix的用户常常头疼的一个问题是,多次登录远程主机的时候,需要重复的输入密码,尤其在登录跳板机还要输入动态token的时候,开多个会话窗口是一件很繁琐的事情 multiplexing 幸运的是,openssh通过multiplexing功能进行了连接优化,通过mulitiplexing可以实现多个ssh会话共用同一个tcp连接 实现multiplexing后,无论打开多少个ssh会话窗口,netstat显示的ssh连接都只有第一次会话建立的连接 $netstat -navp tcp | grep 22 tcp4 0 0 192.168...60603 47.91...22 ESTABLISHED 131072 131768 79974 0 ...

2020-04-21 · 3 min · 624 words · -

linux tcp 连接建立时间

linux tcp 连接建立时间 lsof -P -i tcp | awk '{print $2,$4}' | tr -d 'u' | sort -u stat --printf "%z %N\n" /proc/$pid/fd/$fd

2020-04-21 · 1 min · 23 words · -

性能测试, performance testing

性能测试, performance testing 基准测试, benchmarking testing 性能测试, performance testing 测试系统在各种负载条件下的响应时间、吞吐量、资源使用等性能表现,以确保系统在预期的使用场景下能正常运行。 性能测试是什么: 性能测试就是通过特定的方式对被测试系统按照一定测试策略施加压力,获取该系统的响应时间、TPS、吞吐量、资源利用率等性能指标,来检测系统上线后能否满足用户需求的过程。 性能测试要统一考虑这么几个因素: Thoughput吞吐量/吞吐率,Latency响应时间,资源利用 (CPU/MEM/IO/Bandwidth…) ,成功率,系统稳定性。 并发数 并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。 响应时间 响应时间是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。 吞吐量/吞吐率 吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。 QPS (每秒查询数) 、TPS (每秒事务数) 是吞吐量的常用量化指标,另外还有HPS (每秒HTTP请求数) 。 跟吞吐量有关的几个指标是: 并发数、响应时间。 QPS (TPS) ,并发数、响应时间它们三者之间的关系是: QPS (TPS) =并发数/平均响应时间 响应时间 指的是客户发出请求到得到响应的整个过程的时间。在某些工具中,请求响应时间通常会被称为"TTLB"(Time to laster byte) ,意思是从发起一个请求开始,到客户端收到最后一个字节的响应所耗费的时间。 https://blog.wiloon.com/?p=16015 资源指标 CPU使用率: 指用户进程与系统进程消耗的CPU时间百分比,长时间情况下,一般可接受上限不超过85%。 CPU指标主要指的CPU利用率,包括用户态(user)、系统态(sys)、等待态(wait)、空闲态(idle)。 CPU 利用率要低于业界警戒值范围之内,即小于或者等于75%; CPU sys%小于或者等于30%; CPU wait%小于或者等于5%; 内存利用率: 内存利用率=(1-空闲内存/总内存大小)*100%,一般至少有10%可用内存,内存使用率可接受上限为85%。 磁盘I/O: 磁盘主要用于存取数据,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据的时候对应的是写IO操作,取数据的时候对应的是是读IO操作,一般使用% Disk Time(磁盘用于读写操作所占用的时间百分比)度量磁盘读写性能。 网络带宽: 一般使用计数器Bytes Total/sec来度量,Bytes Total/sec表示为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。 系统指标 并发用户数: 某一物理时刻同时向系统提交请求的用户数。 在线用户数: 某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求。 平均响应时间: 系统处理事务的响应时间的平均值。事务的响应时间是从客户端提交访问请求到客户端接收到服务器响应所消耗的时间。对于系统快速响应类页面,一般响应时间为3秒左右。 ...

2020-04-21 · 1 min · 154 words · -

性能测试-响应时间

性能测试-响应时间 https://www.cnblogs.com/fnng/archive/2012/07/01/2571990.html 响应时间过程分析 我们需要对这个过程进行分解,才能得到你真正想要的响应时间。我把整个过程分三个部分,呈现时间,数据传输时间和系统处理时间。 呈现时间 其实主要说的浏览器对接收到数据的一个处理展示的过程。几年前大家都在用IE,如果页面显示比较慢,我们肯定不会怪罪IE,只会怪罪电信运营商的网速或被访问的系统 (其实,大多情况我们不会考虑是被访问系统的问题) 。现在chrome来了,我们会发现同一台电脑同一个网站,通过chrome去访问,页面的呈现速度会比IE略快。这是各种评测及大众用户的整体感受。当然,我个人感觉,opera浏览器的呈现速度最快,但它的显示效果一直不太好。 当然,我说这个呈现时间总不能全怪罪与浏览器的身上吧!当然还和承载它的操作系统有关,以及电脑硬件 (比如cpu 内存) 。假如你有超快的浏览器,如果是一台极其垃圾的电脑,我想你多打开两个网页就有可能使电脑卡掉。 数据传输时间 千万不要忽视数据传输时间。如果你要寄信给你一个远方的朋友,你想是什么影响你将信息传递给远方的朋友?不是你写信的过程 (如果你写的信不像书一样厚的话) ,也不是你朋友读信的过程,而是送信的过程。 (ps, 我10天前在china-pub订购的一本书现在还没到货!XXX) 拿我们系统的数据传输过程来说,我们发送一个请求需要时间,系统处理完后返回给我们也需要时间。初学性能测试工具的同学喜欢拿工具去测试互联网上的一些系统,甚至不懂性能的同学认为可以用性能测试工具将互联网上的一些网站压崩溃。貌似这一招比任何黑客攻击厉害多去。 那么,我觉得这些同学应该补补网络知识了,你的带宽是多少?互联网是个网,就是算是相同的起点与终点,它有可能走的不同的路线。有没有考虑网络延迟?就算你的并发请求都能成功的发出,但到目的地的时候,已经不能叫并发了。 这也是为什么我们在一般做性能测试时,一般要强调要在局域网中进行。当然,也有特殊的性能测试需要在互联网中时行。它们重点不是求用户的最大的并发量。 系统处理时间 系统得到请求后对请求进行处理并将结果返回。那我进行性能测试主要就是验证系统的处理时间,因为前面的呈现时间和数据传输时间都我们不可控制的,用户使用的电脑及浏览器千差万别,用户的网络状况千差万别。我们唯一能控制的就是将系统的处理请求的时间缩到最短暂。 如果我们对系统的的处理进行分析和讲解的话,它会是一个非常庞大与复杂的过程。语言、语言框架、中间件,数据库、系统架构以及服务器系统。所以,想成为一个优秀的性能测试工程师我们的路还很长。 响应时间的定义: 响应时间 指的是客户发出请求到得到响应的整个过程的时间。在某些工具中,请求响应时间通常会被称为"TTLB"(Time to laster byte) ,意思是从发起一个请求开始,到客户端收到最后一个字节的响应所耗费的时间。 系统响应时间 应用系统从发出请求开始到客户端接收到响应所消耗的时间 合理的响应时间 在互联网上对于用户响应时间,有一个普遍的标准。2/5/10秒原则。 也就是说,在2秒之内给客户响应被用户认为是"非常有吸引力"的用户体验。在5秒之内响应客户被认为"比较不错"的用户体验,在10秒内给用户响应被认为"糟糕"的用户体验。如果超过10秒还没有得到响应,那么大多用户会认为这次请求是失败的。 这里我们还要考虑一个使用频率的概念。 我最早安装windows系统可能要1个小时,我们为什么觉得这很正常,因为我们要很久才装一次系统,如果系统使用得当,可能一个系统用几年不用重装,假如,我们在系统上装个任何小软件都要这么长时间,那我们一定是无法忍受的。对于软件控来说,他们会时常安装各种新鲜有趣的软件进行使用。 对于一个税务报账系统,该系统的用户每月使用一次,一次花费3小时进行数据的录入, 当用户单击"提交"按钮后,即使系统在10分钟后才给出"处理成功"的消息,我们也觉得是可以接受的。 因此,在进行性能测试时,“合理的响应时间"取决于用户的需求,而不能依据测试人员自己设想来决定。

2020-04-20 · 1 min · 41 words · -

cobra

cobra https://github.com/spf13/cobra-cli/blob/main/README.md go install github.com/spf13/cobra-cli@latest go mod init xxxxx cobra-cli init viper https://github.com/spf13/viper https://darjun.github.io/2020/01/17/godailylib/cobra/

2020-04-20 · 1 min · 14 words · -

json tool, jq command

json tool, jq command, json 格式化 install apt install jq https://stedolan.github.io/jq/ https://stedolan.github.io/jq/download/ jq ".[0]|.releases| .[0]|.downloads.linux.link" cat foo.txt|jq '.checklists|.[0]|.checkItems|.[].name' cat foo.txt|jq '.checklists|.[0]|.checkItems|.[]|if .state == "incomplete" then .name else "" end'|grep -v '""' jq 可以对 json 数据进行分片、过滤、映射和转换 jq 是用 C 编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。 下载页面: . 最简单的表达式 .,格式化输出 [index] 输出列表中的第一个元素,可以使用[0]: cat json.txt | jq ‘.[0]’ 管道符 | cat json.txt | jq ‘.[0] | .name ' json格式化 echo '{"kind": "Service", "apiVersion": "v1", "status": {"loadBalancer": true}}' | jq . { "kind": "Service", "apiVersion": "v1", "status": { "loadBalancer": true } } jq 生成 json 字符串 BUCKET_NAME=testbucket OBJECT_NAME=testworkflow-2.0.1.jar TARGET_LOCATION=/opt/test/testworkflow-2.0.1.jar JSON_STRING=$(jq -n \ --arg bucketname "$BUCKET_NAME" \ --arg objectname "$OBJECT_NAME" \ --arg targetlocation "$TARGET_LOCATION" \ '$ARGS.named') jq -n \ --arg foo "bar" \ --arg bar "foo" \ '$ARGS.named' –null-input | -n, 禁止 jq 读取输入, 在用 jq 生成 json 字符串时需要用这个选项把输入置空. –arg name value, 定义变量 Named arguments are also available to the jq program as $ARGS.named. https://stackoverflow.com/questions/48470049/build-a-json-string-with-bash-variables ...

2020-04-19 · 1 min · 160 words · -

goroutine pool

goroutine pool type worker struct { Func func() } func main() { var wg sync.WaitGroup channels := make(chan worker, 10) for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() for ch := range channels { //reflect.ValueOf(ch.Func).Call(ch.Args) ch.Func() } }() } for i := 0; i < 100; i++ { j := i wk := worker{ Func: func() { fmt.Println(j + j) }, } channels <- wk } close(channels) wg.Wait() } package pool type PayloadProcessor func(payload interface{}) type Pool struct { Size int Channels chan interface{} Processor PayloadProcessor } func New(size int, processor func(interface{})) *Pool { p := Pool{ Size: size, Channels: make(chan interface{}, 0), Processor: processor, } for i := 0; i < p.Size; i++ { go func() { for payload := range p.Channels { p.Processor(payload) } }() } return &p } func (p *Pool) Process(payload interface{}) { p.Channels <- payload } http://legendtkl.com/2016/09/06/go-pool/

2020-04-19 · 1 min · 149 words · -