我正在创建一个Dropwizard Bundle,可以在我的所有微服务中重用.我想要标准化的一件事是MetricRegistry每个服务使用.
如果我可以MetricRegistry通过简单地在init上添加我的捆绑包来配置每个服务来使用它,那将是很好的,所以类似于:
class Microservice1 extends Application<Microservice1Config> {
@Override
void initialize(Bootstrap<Microservice1Config> cfg) {
// Boom! Standardized metrics/reporters configured and initialized!
bootstrap.addBundle(new MyBundle())
}
}
Run Code Online (Sandbox Code Playgroud)
问题是BundleAPI似乎不利于这种行为:
class MyBundle implements Bundle {
MetricRegistry metricRegistry
@Override
void initialize(Bootstrap bootstrap) {
}
@Override
void run(Environment environment) {
environment.jersey().register(???)
}
}
Run Code Online (Sandbox Code Playgroud)
由于该register(...)方法没有注册metricRegistry为JAX-RS资源,因此我不知道如何连接,以便将其metricRegistry用于整个微服务中的所有指标.想法?
我正在寻找的是在哪里放置以下内容:
MetricRegistry metricRegistry = new MetricRegistry()
Slf4jReporter slf4jReporter = Slf4jReporter.forRegistry(metricRegistry)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.SECONDS)
.build()
slf4jReporter.start(5, TimeUnit.SECONDS)
Run Code Online (Sandbox Code Playgroud) Java 8在这里.
假设有一个旧版本的widgetlibray,带有Maven坐标widgetmakers:widget:1.0.4,其中有一个类,如下所示:
public class Widget {
private String meow;
// constructor, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)
岁月流逝.这个widget库的维护者决定一个事实上Widget应该永远不meow应该bark.因此,新版本发布,Maven坐标widgetmakers:widget:2.0.0和Widget看起来像:
public class Widget {
private Bark bark;
// constructor, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)
所以现在我去构建我的应用程序myapp.而且,想要使用我所有依赖项的最新稳定版本,我声明我的依赖项就像这样(在里面build.gradle):
dependencies {
compile (
,'org.slf4j:slf4j-api:1.7.20'
,'org.slf4j:slf4j-simple:1.7.20'
,'bupo:fizzbuzz:3.7.14'
,'commons-cli:commons-cli:1.2'
,'widgetmakers:widget:2.0.0'
)
}
Run Code Online (Sandbox Code Playgroud)
现在,让我们说,这(虚构的)fizzbuzz图书馆总是对的1.x的版本取决于widget图书馆,在那里Widget会meow.
所以现在,我widget在我的编译类路径上指定了两个版本:
widgetmakers:widget:1.0.4fizzbuzz作为它的依赖,它被图书馆所吸引; 和 …java conflicting-libraries dependency-management gradle transitive-dependency
我刚刚发现了Speedment,一个基于Java 8 Stream的OR/M库,并且不得不说我喜欢它的想法.没有更疯狂的配置或花费时间筛选900页的休眠文档来找到正确的方法来注释我的类:Speedment只是读取您的数据库,为您生成Java类并为您提供基于流的API来运行针对它们的DDL语句.邪恶酷.
然而,一个大大忌是,它看起来像你必须使用Speedment UI来配置你的数据库连接.此外,文档似乎没有具体说明如何执行以下操作:
等等.在GitHub上,我似乎无法找到代码如何从UI连接在一起以生成配置对象.只是想知道是否有办法配置Speedment没有UI(可能通过JSON或YAML),如果是,可以使用哪些配置.
我试图了解如何使用Spring Data的Query by Example功能,并且正在努力了解如何使用ExampleMatcher它及其各种with*方法.使用匹配器的经典示例包括以下代码段:
Person person = new Person();
person.setFirstname("Dave");
ExampleMatcher matcher = ExampleMatcher.matching()
.withIgnorePaths("lastname")
.withIncludeNullValues()
.withStringMatcherEnding();
Example<Person> example = Example.of(person, matcher);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法将我的大脑包裹在这个DSL上.我们Person来自文档中的示例.假设一个Person实体看起来像这样:
// Pseudo code; omitting JPA annotations for this example
public class Person {
private String firstName;
private String lastName;
private Date dob;
private Long score;
// Getters, setters & constructor omitted
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我展示如何构建一个ExampleMatcher允许我找到Person符合以下条件的记录的示例:
要在Akka(Java绑定)中实现自己的自定义actor,可以扩展UntypedActor基类.这需要您定义自己的onReceive(...)方法:
@Override
public void onReceive(Object message) {
// TODO
}
Run Code Online (Sandbox Code Playgroud)
手头的问题是确定一种消息处理策略,使actor能够处理多种类型的消息.一种策略是使用反射/类型.这里的问题是:
message参数并阻止我们传递任何动态或有意义的东西空shell类的示例:
public class EmptyShellMessage { }
Run Code Online (Sandbox Code Playgroud)
然后在该onReceive方法中看起来像:
@Override
public void onReceive(Class<?> message) {
if(message.isAssignableFrom(EmptyShellMessage.class)) {
// TODO
} else {
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我们不仅创建了一个无用的类,而且由于Object message现在用于确定消息的类/类型,我们不能使用它来包含任何更多的信息,尤其是另一个actor可能的动态/运行时信息想传递它.
有时我会看到这种变化:
@Override
public void onReceive(Object message) {
if(message instanceof FizzEvent) {
// TODO
} else {
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
但在这里我们使用的instanceof是许多人认为是一个巨大的反模式(只是谷歌" 反对模式的 …
我正在使用随附的Eclipse-Groovy插件的最新版本(2.8.0)groovy-all-2.1.5.jar.我将Guice添加到我的Groovy项目中,当我从Eclipse内部运行它们时,我在控制台输出中收到以下错误:
Caught: java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling
java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling
at net.me.myapp.utils.restclient.RestClient.<init>(RestClient.groovy:57)
at net.me.myapp.inject.UserServiceClientModule.configure(UserServiceClientModule.groovy:34)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.spi.Elements.getElements(Elements.java:101)
at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:72)
at com.google.inject.Guice.createInjector(Guice.java:62)
at net.me.myapp.UserServiceClient.<init>(UserServiceClient.groovy:37)
at net.me.myapp.UserServiceClient.main(UserServiceClient.groovy:45)
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
... 12 more
Run Code Online (Sandbox Code Playgroud)
根据这个答案,因为ShortTypeHandling直到2.3.x才添加.所以我现在想附加groovy-all-2.3.3.jar到我的Eclipse项目的类路径.
问题是我似乎没有编辑权限来更改库在Groovy Libraries库中使用的库.当我手动将2.3.3 JAR添加到我的构建路径时,我收到以下错误:
Caught: java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.1.5 and you are trying to load version 2.3.3
Run Code Online (Sandbox Code Playgroud)
我有什么选择?
我有以下多项目Gradle构建:
myapp/
myapp-client/
build.gradle
src/** (omitted for brevity)
myapp-shared/
build.gradle
src/** (omitted for brevity)
myapp-server
build.gradle
src/** (omitted for brevity)
build.gradle
settings.gradle
Run Code Online (Sandbox Code Playgroud)
其中myapp/build.gradle的样子:
subprojects {
apply plugin: 'groovy'
sourceCompatibility = '1.7'
targetCompatibility = '1.7'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories {
mavenCentral()
maven {
// My local/private Artifactory
url "http://localhost:8081/artifactory/myapp-snapshots"
}
}
dependencies {
compile (
'org.codehaus.groovy:groovy-all:2.3.7'
)
}
}
Run Code Online (Sandbox Code Playgroud)
目前,3个子项目Gradle文件中的每一个都非常简单:
dependencies {
compile (
'org.apache.commons:commons-lang3:3.3.2'
)
}
Run Code Online (Sandbox Code Playgroud)
这是我想要实现的目标:
gradle clean build -Pversion=0.1.5从父myapp目录运行时,我希望所有三个子项目都使用0.1.5的版本构建; 因此myapp-client-0.1.5.jar …在我的本地文件系统上,我有以下C项目目录结构:
derpus/
src/
derpus/
c/
derpus.c
headers/
build.gradle
Run Code Online (Sandbox Code Playgroud)
在哪里derpus.c:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Derp!");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我想使用Gradle Native(C)插件来管理derpus构建的全部范围.具体来说,我希望Gradle:
gradlew用于所有构建调用; 和derpus成derpus.exevia gradlew; 和gradlew eclipse然后我可以将项目导入Eclipse(我已经预安装了Eclipse CDT插件)这是我的build.gradle:
apply plugin: 'c'
apply plugin: 'eclipse'
sources {
c {
source {
srcDir "src/derpus/c"
include "**/*.c"
}
exportedHeaders {
srcDir "src/derpus/headers"
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
} …Run Code Online (Sandbox Code Playgroud) 我试图了解何时何地使用不同的内置Akka邮箱,以及何时适合自己推出.但是,该页面上没有任何地方可以解释实际上是什么" 有界邮箱 ",或者它与无限邮箱的行为方式不同.此外,该页面将邮箱归类为" 阻止 "与" 非阻止 ".虽然我对它的含义有很强的了解(除非邮箱首先被清空,否则可以将邮件发送到邮箱)我不是百分之百确定我理解这一点.因此,当他们将邮箱归类为有界或阻塞时,我不知道文档是什么意思,我很难告诉我什么时候应该使用每种类型.
此外,如果重新启动该actor,似乎是清除演员邮箱的默认Akka行为.我想阻止这种情况,但不确定解决方案是使用这些内置邮箱类型之一(本页未提及消息持久性)或以某种方式使用持久性actor来实现此类无损.
有一种新兴的趋势是将全局状态从传统的"静态"配置管理工具(例如Chef/Puppet/Ansible)中删除,而是将配置存储在某些集中/分布式工具中,其中主要参与者似乎是:
这些工具中的每一个都有不同的工作方式,但原理是相同的:
MY_APP")和环境(" DEV"," PROD"等).有一个优秀的Consul Java客户端,它可以很好地解释所有这些,并提供了充足的代码示例.
我对这些工具的理解是,它们建立在Zab,Paxos和Gossip等共识算法的基础之上,这些算法允许配置更新在整个节点中几乎以病毒式传播,最终保持一致.这样的想法存在,如果你有一个myapp有20个节点的应用程序,比如myapp01通过myapp20,如果你做一个配置改变其中之一,这种变化自然会"蔓延"遍及20个节点在一段秒/分钟.
我的问题是:这些更新如何实际部署到每个节点?在任何客户端API(我上面链接的那个,ZooKeeper API或Eureka API)中都没有看到某种回调功能,可以设置并用于在集中服务(例如领事)时通知客户端cluster)想要推送和重新加载配置更新.
所以我问:这应该如何工作(动态配置部署和客户端重装)?虽然Consul的API似乎是最先进的恕我直言,但我对这三种工具中的任何一种都有任何可行的答案感兴趣.
configuration-management consul netflix-eureka apache-zookeeper
gradle ×3
java ×3
akka ×2
messaging ×2
actor ×1
artifactory ×1
buildpath ×1
bundle ×1
c ×1
consul ×1
dropwizard ×1
eclipse ×1
eclipse-cdt ×1
groovy ×1
java-8 ×1
java-stream ×1
maven ×1
orm ×1
publish ×1
speedment ×1
spring ×1
spring-data ×1