groovy

Sort map by value in Groovy jenkins pipeline script

陌路散爱 提交于 2020-08-10 19:13:09
问题 How to do custom sort of Map for example by value in Jekins pipeline script? This code doesn't quite work in Jenkins pipeline script: Map m =[ james :"silly boy", janny :"Crazy girl", jimmy :"funny man", georges:"massive fella" ] Map sorted = m.sort { a, b -> a.value <=> b.value } The map is still not sorted. I decided to crate a separate question with better name and tags, because many people were struggling to find an answer here: Groovy custom sort a map by value 回答1: You will have to

nGrinder 简易使用教程

北城余情 提交于 2020-08-10 18:49:36
背景 性能压测工具之前使用的是jmeter,这次说的是nGrinder,先直接搬运两者之间的比较 比较点 JMeter nGrinder 结果 实现语言 Java Java = License Apache v2 Apache v2 = 使用方式 C/S或Command B/S < 支持分布式 master/slave controller/agent = 资源监控 monitor/plugin,如果二开,需要查找plugin的源码 monitor方式,有直接可用的源码 < 社区活跃度 有N个群,文档完善 群只有一个,有中文社区 > 是否需要编码 基本不需要 需要,Jython/Groovy > 脚本的维护 本地 内置SVN < 脚本录制 可使用BadBoy进行录制 可通过PTS插件进行录制 = 可扩展性 可增加plugin,输出结果可以再加工 可增加plugin = 压测平台编码量 大 小 < 这里还有一个详细的对比: http://qa.blog.163.com/blog/static/19014700220125264628978/ nGrinder采用的controler-agent模式,需要安装controler和agent 安装搭建 官网:https://github.com/naver/ngrinder/releases 下载nGrinder-controler

为什么微服务一定要有网关?

人走茶凉 提交于 2020-08-10 06:41:20
作者:赵计刚 https://www.cnblogs.com/java-zhao/p/6716059.html 1、什么是服务网关 服务网关 = 路由转发 + 过滤器 1、路由转发:接收一切外界请求,转发到后端的微服务上去; 2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。 2、为什么需要服务网关 上述所说的横切功能(以权限校验为例)可以写在三个位置: 每个服务自己实现一遍 写到一个公共的服务中,然后其他所有服务都依赖这个服务 写到服务网关的前置过滤器中,所有请求过来进行权限校验 第一种,缺点太明显,基本不用; 第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点: 由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好; 由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。 而服务网关恰好可以解决这样的问题: 将权限校验的逻辑写在网关的过滤器中

阿里P8教你如何学习JVM

落爺英雄遲暮 提交于 2020-08-09 20:33:36
前言 提到Java虚拟机(JVM),可能大部分人的第一印象是“难”,但当让我们真正走入“JVM世界”的时候,会发现其实问题并不像我们想象中的那么复杂。唯一真正令我们恐惧的,其实是恐惧本身。 为了帮助大家更好的学习JVM,小编送给大家一本PDF书籍,详见下文啦~ 一、什么是JVM? JVM简介: JVM是Java Virtual Machine的缩写,中文翻译为Java虚拟机,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。简单来说JVM是用来解析和运行Java程序的。 Java有一个非常重要的特点“平台的无关性”,就是使用JVM实现的。Java语言只需要生成Jvm上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,因为JVM本身屏蔽了与具体平台相关的信息,使得Java能够“一次编译,到处运行”。 二、为什么要学习JVM? 学习JVM无外乎以下几个原因: 1、 程序调优 不同的程序(业务场景)需要不同的Jvm配置,比如设置不同的垃圾收集器、设置新生代和老生带的内存配置和占比等,不同的配置对于程序的运行有着千差万别的影响。而Jvm默认的配置只能保证程序能够“运行”,而想要“很好的运行”甚至是“更好的运行”,就是学习Jvm最主要的因素之一。 2、 排查程序运行问题 有些程序可能在线上使用的时候会遇到各种各样的问题

如何mock固定QPS的接口

怎甘沉沦 提交于 2020-08-09 20:13:13
在做接口测试的时候,经常会遇到一些接口去调用其他服务接口,或者调用第三方接口。在进行压测的时候就会遇到问题,因为很难隔离掉其他服务和第三方接口的性能变化情况,虽然单独维护一套压测环境可以解决服务调用的问题,但是这需要很多资源和精力投入,并不一定适合每个团队。至于第三方就更难掌握,能够提供一些性能数据就很不错了。 为此我们需要用到 mock 一个固定 QPS 的接口这样的功能。我的解决方案是基于 moco API ,利用本身提供的功能做一些尝试,很不幸失败了,在花费一个小时左右翻阅官方文档和实现Demo以及自己尝试发现这条路走不通。 只能无奈放弃,然后自己拓展这个功能了。采取的方案是 JDK 中的 Semaphore 类控制流量,然后通过创建自定义 ResponseHandler 来完成接口的限流,思路是拿到令牌的请求线程休眠一段时间再去释放令牌完成响应。 经过我的测试误差都在10%以内,如果是测试方案设计得好,误差应该是5%以内,这里有几条规律: 请求线程越多,误差越小 请求次数越多,误差越小 系统充分预热,误差越小 测试过程,改天录个视频给大家分享。 使用Demo HttpServer server = getServer(8088) server.get(urlOnly("/aaa")).response(qps(textRes("faun"), 10)) server

DbSchema生成表单和报表,原来如此简单

我只是一个虾纸丫 提交于 2020-08-09 12:11:06
DbSchema 8 for Mac是mac上一款非常实用的商业数据库ER图绘制软件,可以轻松的对文档进行注释或标注,而且Dbschema集成了SQL和数据工具,能生成直观的图表、PDF文件或HTML 5文档等,非常的实用。现在就来给大家分享DbSchema如何生成表单和报表,不要错过哦! DbSchema 8 for Mac(商业数据库ER图绘制软件) 表格和报告 DbSchema集成了功能非常强大且可完全自定义的Forms&Reports Engine。它可以用于: 创建多主体详细报告; 使用Bootstrap响应HTML模板创建小型应用程序或报告。另外,它们也可以作为JavaFx或PDF运行。 将应用程序部署为WAR Tomcat应用程序。 生成报告 您可以从 顶部菜单 或 右键单击表格标题 来打开“表单和报表”引擎。 创建表单有四种主要方法: 使用表中的数据; 使用 Visual Query Builder 建立 查询 并根据结果创建报告; 使用 SQL编辑器 编写查询,然后根据结果创建报告; 从头开始创建报告。 前三种方式简单明了,直观,最后一种将在独立的章节中进行详细说明。 打开表单和报表后,将打开第一个窗口: 选择报告的名称 选择数据源 选择方向。一份报告每页可以包含多个记录,也可以仅包含一个。 下一个对话框用于选择报告中将显示哪些列 接下来

乐字节-Java8核心实战之三:函数式接口

 ̄綄美尐妖づ 提交于 2020-08-09 08:40:24
Java8 引入 Lambda 表达式,允许开发者将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理。使用 Lambda 表达式,使得应用变得简洁而紧凑。 很多语言(Groovy、Scala 等)从设计之初就支持 Lambda 表达式。但是 java 中使用的是匿名内部类代替。最后借助强大的社区力量,找了一个折中的 Lambda 实现方案,可以实现简洁而紧凑的语言结构。 一、匿名内部类到Lambda的演化 匿名内部类,即一个没有名字的,存在于一个类或方法内部的类。当我们需要用某个类且只需要用一次,创建和使用合二为一时,我们可以选择匿名内部类,省掉我们定义类的步骤。 匿名内部类会隐士的继承一个类或实现一个接口,或者说匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。下面看一个匿名内部类的例子 package com.java8; /* 定义和使用匿名内部类 */ public class NoNameClass { public static void main(String[] args) { Model m = new Model(){ @Override public void func() { System.out.println("方法的实现"); } }; m.func(); } } // 需要被实现的接口 interface Model{ void

Lambda表达式用法大比较: Scala和Java 8

廉价感情. 提交于 2020-08-08 11:15:52
最近几年Lambda表达式风靡于编程界. 很多现代编程语言都把它作为函数式编程的基本组成部分. 基于JVM的编程语言如Scala,Groovy还有Clojure把它们作为关键部分集成在语言中.现在Java8也加入了它们的行列. 有趣的是,对于JVM来说,Lambda表达式是完全不可见的,并没有匿名函数和Lamada表达式的概念,它只知道字节码是严格面向对象规范的.它取决于语言的作者和它的编译器在规范限制内创造出更新,更高级的语言元素. 我们第一次接触它是在我们要给Takipi添加Scala支持的时候, 我们不得不深入研究Scala的编译器.伴随着JAVA8的来临,我认为探究Scala和java编译器是如何实现Lambda表达式是非常有趣的事情.结果也是相当出人意料. 接下来,我展示一个简单的Lambda表达式,用于将字符串集合转化成字符串自身长度的集合。 Java的写法 – 1List names = Arrays.asList("1", "2", "3"); 2Stream lengths = names.stream().map(name -> name.length()); Scala的写法 – 1.val names = List("1", "2", "3") 2.val lengths = names.map(name =>name.length) 表面上看起来非常简单

为什么静态变量被认为是邪恶的?

半腔热情 提交于 2020-08-08 05:14:25
问题: I am a Java programmer who is new to the corporate world. 我是一位Java程序员,对公司领域来说是新手。 Recently I've developed an application using Groovy and Java. 最近,我已经使用 Groovy 和Java开发了一个应用程序。 All through the code I wrote used quite a good number of statics. 我编写的所有代码都使用了大量的静态变量。 I was asked by the senior technical lot to cut down on the number of statics used. 高级技术人员要求我减少使用的静电数量。 I've googled about the same, and I find that many programmers are fairly against using static variables. 我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 I find static variables more convenient to use. 我发现静态变量更易于使用。 And I presume that they are

Nested closure resolution different between methods and properties?

江枫思渺然 提交于 2020-08-08 04:58:12
问题 When a closure's resolveStrategy is set to DELEGATE_ONLY or DELEGATE_FIRST , resolution is different in nested closures between methods and properties of the delegate. For example, in the following, x resolves to f 's delegate (what I expect), but keySet() resolves to g 's delegate. ​def g = {-> def f = { {-> [x, keySet()]}() } f.resolveStrategy = Closure.DELEGATE_ONLY f.delegate = [x: 1, f: 0] f() } g.delegate = [x: 0, g: 0] g() ​ Result: [1, ['x', 'g']] Whereas without the nested closure