如何修改网站内容,网站宣传费用,新鸿儒做网站,赣州室内设计学校最近发布时间不错#xff01; 我在Too Much Coding博客上的博客更多是关于发布#xff0c;然后是关于任何具体主题;#xff09; 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后#xff0c;我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误#xff0c;但引… 最近发布时间不错 我在Too Much Coding博客上的博客更多是关于发布然后是关于任何具体主题; 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误但引入了一些重要功能包括 Maven插件支持 Stub Runner功能 这篇文章将更深入地介绍后者。 介绍 我已经就名为Micro-Infra-Spring的库进行了很多讨论在其中我介绍了如何从Stub Runner功能中受益。 自从我离开拥有该存储库的公司以来几乎根本没有维护该项目。 很长一段时间以来任何开发工作都是我自己完成的实际上我是大多数Stub Runner代码的作者。 由于上述原因以及Stub Runner与AccuREST的stub生成功能紧密结合的事实我决定将其迁移到AccuREST的存储库。 AccuREST回顾 Stub Runner与AccuREST的概念紧密结合。 有关AccuREST的更多信息您可以检查我的博客条目或在Github上检查AccuREST项目 。 如果您不知道那是什么我会尽力快速回顾一下。 AccuREST是消费者驱动的合同验证器您可以在其中通过Groovy DSL定义API的合同。 从该DSL在服务器端创建测试以检查您的合同是否说实话。 从Stub Runner的角度来看更有趣的是客户端。 对于客户端AccuREST从提供的DSL生成WireMock存根以便可以为该API的客户端提供可靠的存根。 什么是Stub Runner 现在我们记得AccuREST做什么了我们可以更深入地研究Stub Runner 。 假设我们有以下服务流程顺便说一下这是来自与Spring Cloud Sleuth集成的Zipkin的屏幕截图 让我们想象一下自己作为服务2的开发商-的一个呼叫服务3和服务 。 因为我们正在做的CDC 消费者驱动的契约 的方式让我们假定服务3和服务的存根得到了已部署到一些Maven仓库。 如果我写服务2的集成测试我肯定有服务3和服务互动的一些要点。 在大多数情况下我很可能会在代码中模拟这些交互但是对其他应用程序执行真正的HTTP调用将非常有价值。 当然我不想下载这两种服务并只为进行集成测试而运行它们-这太过分了。 这就是为什么此时最好的解决方案是运行我的协作者的存根。 由于我懒得手动做事所以我希望自动为我下载存根因此WireMock服务器启动并提供了存根定义。 这正是Stub Runner可以为您做的 它是如何工作的 概念 Stub Runner的核心是使用Groovy的Grape机制从给定的Maven存储库下载存根。 接下来将它们解压缩到一个临时文件夹。 假设您在存根JAR中具有WireMock存根的以下结构service3 service3-stubs.jar ├── META-INF
│ └── MANIFEST.MF
└── mappings└── service3├── shouldMarkClientAsFraud.json├── notAWireMockMapping.json└── shouldSayHello.json Stub Runner将扫描整个解压缩的JAR中是否有任何.json文件。 约定将存根定义放在mappings文件夹下。 因此它将选择shouldMarkClientAsFraud.json notAWireMockMapping.json和shouldSayHello.json文件。 接下来为每个依赖项启动一个WireMock实例并尝试将每个找到的JSON解析为WireMock存根定义。 此时任何异常都将被忽略因此假设notAWireMockMapping.json不是有效的WireMock定义该异常将被抑制。 在我们的场景2 WireMock服务器将启动-一个用于service3 一个用于service4 。 这样您不必手动复制存根。 由于存根存储在Maven存储库中因此它们是集中式的。 这是非常重要的原因因为Stub Runner总是下载最新版本的Stub因此您可以确保一旦有人进行了不兼容的更改测试就会中断。 API 从开发人员的角度来看仅应使用少数几个Stub Runner的类。 在大多数情况下您将使用以下内容 存根查找器 该接口允许您查找已启动的WireMock实例的URL。 您可以通过传递常春藤表示法 groupId:artifactId 或仅artifactId来找到该URL Stub Runner将尝试处理其余的内容。 interface StubFinder {/*** For the given groupId and artifactId tries to find the matching* URL of the running stub.** param groupId - might be null. In that case a search only via artifactId takes place* return URL of a running stub or null if not found*/URL findStubUrl(String groupId, String artifactId)/*** For the given Ivy notation {code groupId:artifactId} tries to find the matching* URL of the running stub. You can also pass only {code artifactId}.** param ivyNotation - Ivy representation of the Maven artifact* return URL of a running stub or null if not found*/URL findStubUrl(String ivyNotation)/*** Returns all running stubs*/RunningStubs findAllRunningStubs()
}RunningStubs 表示已经运行的存根的结构。 给您一些帮助方法以检索特定存根的常春藤表示找到存根的端口等。 存根运行 可以运行存根的类的合同 interface StubRunning extends Closeable, StubFinder {/*** Runs the stubs and returns the {link RunningStubs}*/RunningStubs runStubs()}StubRunner 表示一个现成的存根实例。 它可以运行存根并返回到运行实例的WireMock包裹在RunningStubs类。 由于正在实现StubFinder因此如果当前的groupid和artifactid与相应的正在运行的存根匹配也可以查询StubFinder 。 BatchStubRunner 如果您要使用存根运行WireMocks的多种服务则可以使用BatchStubRunner 。 迭代StubRunner的给定Iterable 并在每个StubRunner执行逻辑。 正在运行的Stub Runner 在下面的所有示例中我们假设存根存储在Maven存储库中该存储库位于http://toomuchcoding.com URL下。 作为服务2我想下载的存根com.toomuchcoding:service3和com.toomuchcoding:service4服务。 存根赛跑者为胖胖的JAR 如何使用它 Stub Runner带有一个主类 io.codearte.accurest.stubrunner.StubRunnerMain 您可以使用以下选项运行它 -maxp (--maxPort) N : Maximum port value to be assigned to theWiremock instance. Defaults to 15000(default: 15000)-minp (--minPort) N : Minimal port value to be assigned to theWiremock instance. Defaults to 10000(default: 10000)-s (--stubs) VAL : Comma separated list of Ivy representation ofjars with stubs. Eg. groupid:artifactid1,groupid2:artifactid2:classifier-sr (--stubRepositoryRoot) VAL : Location of a Jar containing server where youkeep your stubs (e.g. http://nexus.net/content/repositories/repository)-ss (--stubsSuffix) VAL : Suffix for the jar containing stubs (e.g.stubs if the stub jar would have a stubsclassifier for stubs: foobar-stubs ).Defaults to stubs (default: stubs)-wo (--workOffline) : Switch to work offline. Defaults to false(default: false) 您可以从IDE运行该主类也可以自己构建一个胖JAR。 为此只需调用以下命令 ./gradlew stub-runner-root:stub-runner:shadowJar -PfatJar 然后在build/lib中将有一个带有分类器fatJar的胖JAR等待您执行。 再回到我们的例子中一旦脂肪JAR建我只是调用下面的命令检索服务3和服务的存根从Maven仓库提供http://toomuchcoding.com 。 java -jar stub-runner-1.0.4-SNAPSHOT-fatJar.jar -sr http://toomuchcoding.com -s com.toomuchcoding:service3:stubs,com.toomuchcoding.service4什么时候使用 当您在不想下载并运行该应用程序的所有协作器的已部署应用程序上运行一些快速冒烟测试时将Stub Runner作为主要类运行是最有意义的。 有关这种方法的更多原理您可以查看我有关微服务部署的文章 Stub Runner JUnit规则 如何使用它 您可以使用Stub Runner的 JUnit规则在测试过程中自动下载并运行存根。 AccurestRule实现了StubFinder界面因此您可以轻松地找到您感兴趣的服务的URL。 这是使用Spock的方法 class SomeSpec extends Specification {ClassRule Shared AccurestRule rule new AccurestRule().repoRoot(http://toomuchcoding.com).downloadStub(com.toomuchcoding, service3).downloadStub(com.toomuchcoding:service4)def should do something useful when service3 is called() {given:URL service3Url rule.findStubUrl(com.toomuchcoding, service3)expect:somethingUseful(service3Url)}def should do something even more useful when service4 is called() {given:URL service4Url rule.findStubUrl(service4)expect:somethingMoreUseful(service4Url)}
} 或使用普通的Java JUnit public class SomeTest {ClassRule public static AccurestRule rule new AccurestRule().repoRoot(http://toomuchcoding.com).downloadStub(com.toomuchcoding, service3).downloadStub(com.toomuchcoding:service4);Testpublic void should_do_something_useful_when_service3_is_called() {URL service3Url rule.findStubUrl(com.toomuchcoding, service3);somethingUseful(service3Url);}Testpublic void should_do_something_even_more_useful_when_service4_is_called() {URL service4Url rule.findStubUrl(service4);somethingMoreUseful(service4Url);}
}什么时候使用 如果我们不提供与现有框架的任何集成则可以在任意位置使用此规则。 存根赛跑者春天 如何使用它 您可以使用Stub Runner的 Spring配置下载协作者的Stub并在Spring上下文启动时运行WireMock服务器。 我们提供了您可以在测试中导入的StubRunnerConfiguration 。 在该配置中我们注册了一个StubFinder bean您可以在测试中自动装配它。 具有以下application.yaml文件 stubrunner.stubs.repository.root: http://toomuchcoding.com
stubrunner.stubs.ids: com.toomuchcoding:service3:stubs,com.toomuchcoding.service4 这就是用Spock可以做到的 ContextConfiguration(classes Config, loader SpringApplicationContextLoader)
class StubRunnerConfigurationSpec extends Specification {Autowired StubFinder stubFinderdef should do something useful when service3 is called() {given:URL service3Url stubFinder.findStubUrl(com.toomuchcoding, service3)expect:somethingUseful(service3Url)}def should do something even more useful when service4 is called() {given:URL service4Url stubFinder.findStubUrl(service4)expect:somethingMoreUseful(service4Url)}ConfigurationImport(StubRunnerConfiguration)EnableAutoConfigurationstatic class Config {}}什么时候使用 在您的测试中如果您拥有Spring而没有Spring Cloud。 您也可以在编译时添加它当然您必须添加一些Spring概要文件以便不在生产环境中运行它以从运行微服务的“开发人员”模式中获利。 这意味着如果您启动应用程序以单击它那么周围的所有存根都将已经下载并启动。 存根赛跑者春天云 如何使用它 在使用Spring Cloud的服务发现抽象和Netflix Ribbon时您可以使用Stub Runner的 Spring Cloud配置来从Stubed合作者中获利。 Stub Runner Spring Cloud配置是AutoConfiguration因此会自动为您启动。 让我们假设你指的是作为服务3 service3在你的代码并作为服务4 shouldMapThisNameToService4 。 这意味着您以如下方式使用了LoadBalanced RestTemplate 不要像在本示例中一样使用字段注入 Component
class SomeClass {Autowired LoadBalanced RestTemplate restTemplatevoid doSth() {// code...String service3Response restTemplate.getForObject(http://service3/name, String)String service4Response restTemplate.getForObject(http://shouldMapThisNameToService4/name, String)// more code...}} 如果您用来调用其他服务的服务ID准确地映射到Maven存储库中的工件ID的名称那么您很幸运无需执行任何操作即可找到正在运行的存根。 但是如果不是这种情况–不用担心您只需要自己映射即可。 stubrunner.stubs.idsToServiceIds属性是映射的根路径其中的键是下载的存根的artifactID 值是代码中使用的serviceId 。 具有以下application.yaml文件 stubrunner.stubs.repository.root: http://toomuchcoding.com
stubrunner.stubs.ids: com.toomuchcoding:service3:stubs,com.toomuchcoding.service4stubrunner.stubs.idsToServiceIds:service4: shouldMapThisNameToService4 这就是用Spock可以做到的 ContextConfiguration(classes Config, loader SpringApplicationContextLoader)
class StubRunnerConfigurationSpec extends Specification {Autowired SomeClass someClassdef should not explode() {when:someClass.doSth()expect:noExceptionThrown()}ConfigurationEnableAutoConfigurationstatic class Config {}}什么时候使用 当您使用Spring Cloud时。 您也可以以“开发人员”模式从Stub Runner Spring Cloud受益如Stub Runner Spring部分所述。 其他配置选项 您可以通过系统属性设置Maven存储库的默认值 -Dstubrunner.stubs.repository.roothttp://your.maven.repo.com 可配置属性的列表包含 名称 默认值 描述 stubrunner.port.range.min 10000 WireMock服务器的端口的最小值 stubrunner.port.range.max 15000 WireMock服务器的端口最大值 stubrunner.stubs.repository.root M2仓库的地址如果未提供将指向本地M2仓库 stubrunner.stubs.classifier 存根 包含存根的JAR的默认分类器 stubrunner.work-offline 假 应该尝试连接到任何存储库以下载存根如果没有互联网则很有用 存根 默认逗号分隔的存根列表以供下载 摘要 短跑选手 已经被证明是进行CDC时非常有用的工具。 经过了战斗测试越来越多的公司宣布有兴趣使用它。 帮助您生成一个API该API应该使双方服务器和客户端同等高兴或不高兴但他们的情感仍然平等;。 语言/技术不可知–您可以将其作为胖JAR来运行可以将其与SpringGuice或任何您想要的东西一起使用。 从API设计和兼容性角度来看都可以帮助您加快反馈周期。 链接 AccuREST Github存储库 短跑选手维基 AccuREST Gitter 翻译自: https://www.javacodegeeks.com/2016/04/accurest-stub-runner-released.html