java空间中似乎有一种趋势,即不再以war文件(或ear文件)的形式将java Web应用程序部署到java servlet容器(或应用程序服务器),而是将应用程序打包为可执行jar.像jetty这样的嵌入式servlet/HTTP服务器.我的意思是,更新的框架影响新应用程序的开发和部署方式,而不是如何将应用程序交付给最终用户(因为,例如,我知道Jenkins使用嵌入式容器,非常容易抓住和去).采用可执行jar选项的框架示例: Dropwizard,Spring Boot和Play (它不是在servlet容器上运行,而是嵌入了HTTP服务器).
我的问题是,来自我们已经将我们(直到这一点,主要是Struts2)应用程序部署到单个tomcat应用程序服务器的环境,如果我们计划使用嵌入式容器方法,需要做出哪些更改,最佳实践或注意事项?目前,我们在单个tomcat服务器上运行大约10个自行开发的应用程序,对于这些小型应用程序,共享资源并在一台服务器上进行管理的能力很不错.我们的应用程序无意分发给最终用户以在其环境中运行.但是,如果我们决定利用更新的Java框架,那么这种方法会改变吗?越来越多地使用云部署(例如Heroku)刺激了对可执行jar的转变?
如果您有使用Play风格的部署管理多个应用程序而不是单个应用程序服务器上的传统war文件部署的经验,请分享您的见解.
我学习的DropWizard指标库(原科达硬朗指标),我很困惑,当我应该使用到Meters
VS Timers
.根据文件:
仪表:仪表测量一组事件发生的速率
和:
计时器:计时器基本上是事件类型持续时间的直方图和其发生率的计量表
基于这些定义,我无法辨别它们之间的区别.令我感到困惑的是,Timer
没有像我期望的那样使用它.对我而言,Timer
就是这样:一个计时器; 它应该测量a start()
和之间的时间差stop()
.但似乎Timers
也可以捕捉事件发生的速度,感觉就像是踩到了Meters
脚趾.
如果我能看到每个组件输出的示例,这可能有助于我理解何时/何处使用其中任何一个.
我在默认端口8080(服务)和8081(管理员)上运行基于Dropwizard的Jersey REST服务,我需要将默认端口更改为不太常用的端口,我无法找到任何信息,请有人指点我这样做吗?
我正在使用使用JDBI的dropwizard创建一个简单的REST应用程序.下一步是集成一个与另一个具有一对多关系的新资源.到目前为止,我无法弄清楚如何在我的DAO中创建一个方法来检索一个包含另一个表中对象列表的对象.
POJO表示将是这样的:
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Account {
private int id;
private String name;
private List<User> users;
public Account(int id, String name, List<User> users) {
this.id …
Run Code Online (Sandbox Code Playgroud) 典型的DropWizard应用程序指定一个Application子类,并覆盖其initialize
方法,如下所示:
class MyApplication extends Application<MyConfiguration> {
static void main(String[] args) {
new MyApplication().run(args)
}
@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
// ???
}
@Override
public void run(MyConfiguration configuration, Environment environment)
throws Exception {
// Register resources, health checks, etc.
}
}
Run Code Online (Sandbox Code Playgroud)
仔细阅读DropWizard文档以及JavaDocs:
Configuration
- YAML配置文件的对象表示.使用您自己的配置属性扩展它,它们也将从YAML文件中解析.Bootstrap
- 预启动应用程序环境,包含引导Dropwizard命令所需的所有内容.Environment
- Dropwizard应用程序的环境.但这些是相当模糊的类定义,特别是最后两个.我理解我应该是子类Configuration
,并且它代表我的应用程序的YAML/JSON配置文件的内存中POJO.
但我无法理解其他构造代表什么(Bootstrap
和Environment
).我习惯于在我的应用程序中注入特定于环境的配置,因此我倾向于将"环境"和"配置"的概念视为同一个概念.
此外,似乎DropWizard将Bootstrap
实例与Configuration
impl实例紧密结合,但我找不到关于这两个类如何不同以及如何使用它们彼此不同的可证明的例子.
所以我问:
Bootstrap
,我用它做什么用的?Environment
,我用它做什么?我有一个Dropwizard应用程序,需要为配置列表中的每个配置生成十几个bean.健康检查,石英调度等等.
像这样的东西:
@Component
class MyModule {
@Inject
private MyConfiguration configuration;
@Bean
@Lazy
public QuartzModule quartzModule() {
return new QuartzModule(quartzConfiguration());
}
@Bean
@Lazy
public QuartzConfiguration quartzConfiguration() {
return this.configuration.getQuartzConfiguration();
}
@Bean
@Lazy
public HealthCheck healthCheck() throws SchedulerException {
return this.quartzModule().quartzHealthCheck();
}
}
Run Code Online (Sandbox Code Playgroud)
我有多个MyConfiguration实例都需要像这样的bean.现在我必须复制并粘贴这些定义,并为每个新配置重命名它们.
我可以以某种方式迭代我的配置类并为每个类生成一组bean定义吗?
我可以使用子类化解决方案或类型安全的任何东西,而不会让我复制并粘贴相同的代码,并在我必须添加新服务时重命名方法.
编辑:我应该补充一点,我有其他依赖这些bean的组件(Collection<HealthCheck>
例如,它们注入.)
我正在使用java:7u79
基于的图像在Docker容器中运行dropwizard Java应用程序debian/jessie
.
我的Java应用程序处理SIGTERM
信号以正常关闭.SIGTERM
当我运行没有Docker的应用程序时,处理工作非常完美.
当我在Docker容器中运行它SIGTERM
时,当我发出docker stop
命令时,它不会到达Java应用程序.它在10秒后突然杀死了这个过程.
我的Dockerfile
:
FROM java:7u79
COPY dropwizard-example-1.0.0.jar /opt/dropwizard/
COPY example.keystore /opt/dropwizard/
COPY example.yml /opt/dropwizard/
WORKDIR /opt/dropwizard
RUN java -jar dropwizard-example-1.0.0.jar db migrate /opt/dropwizard/example.yml
CMD java -jar dropwizard-example-1.0.0.jar server /opt/dropwizard/example.yml
EXPOSE 8080 8081
Run Code Online (Sandbox Code Playgroud)
这有什么问题Dockerfile
?有没有其他方法可以解决这个问题?
我很好奇一个难以捉摸的 - 但可能非常强大 - DropWizard功能叫做Bundles.根据文件:
Dropwizard包是一组可重用的功能,用于定义应用程序行为的块.
鉴于DropWizard(DW)的记录非常好,我很震惊,这确实是捆绑包的唯一解释.我在野外看到了一些例子:
但我不明白的是:bundle似乎只是代码打包并在JAR中分发.那么为什么我不能只编写"原始"(非"bundle"兼容)Java类来做我需要的东西,在JAR中将它们打包,然后在我的构建/编译类路径中包含该JAR,然后在广告中使用它们我的DW应用程序?DW捆绑的用途是什么,什么时候应该使用它们?
我正在使用dropwizard,我想构建一个在实体中具有各种外键关系的REST应用程序.
例如,给出以下3个表:
-- table persons
CREATE TABLE PUBLIC.PERSONS(
ID BIGINT DEFAULT NOT NULL AUTOINCREMENT,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
BIRTHDAY DATE,
ADDRESS_ID BIGINT NOT NULL,
CREATED TIMESTAMP DEFAULT 'current_timestamp',
MODIFIED TIMESTAMP
);
ALTER TABLE PUBLIC.PERSONS ADD CONSTRAINT PUBLIC.PK_PERSONS PRIMARY KEY(ID);
-- table customers
CREATE TABLE PUBLIC.CUSTOMERS(
ID BIGINT DEFAULT NOT NULL AUTOINCREMENT,
PERSON_ID BIGINT NOT NULL,
STATUS_CODE VARCHAR(100) DEFAULT 'ACQUISITION' NOT NULL,
CREATED TIMESTAMP DEFAULT 'current_timestamp',
MODIFIED TIMESTAMP
);
ALTER TABLE PUBLIC.CUSTOMERS ADD CONSTRAINT PUBLIC.PK_CUSTOMERS PRIMARY KEY(ID);
-- table addresses
CREATE …
Run Code Online (Sandbox Code Playgroud) 我试图了解DropWizard中的身份验证和授权是如何工作的.我已经阅读了他们的auth指南以及GitHub上的dropwizard-security项目,但感觉我仍然缺少一些重要的概念.
public class SimpleCredential {
private String password;
public SimpleCredential(String password) {
super();
this.password = password;
}
}
public class SimplePrincipal {
pivate String username;
public SimplePrincipal(String username) {
super();
this.username = username;
}
}
public class SimpleAuthenticator implements Authenticator<SimpleCredential, SimplePrincipal> {
@Override
public Optional<SimplePrincipal> authenticate(SimpleCredential credential) throws AuthenticationException {
if(!"12345".equals(credential.getPassword())) {
throw new AuthenticationException("Sign in failed.");
}
Optional.fromNullable(new SimplePrincipal("simple_user"));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的Application
子类中:
@Override
public void run(BackendConfiguration configuration, Environment environment) throws Exception …
Run Code Online (Sandbox Code Playgroud) dropwizard ×10
java ×8
jersey ×3
jax-rs ×2
jdbi ×2
docker ×1
dockerfile ×1
jetty ×1
join ×1
metrics ×1
one-to-many ×1
rest ×1
spring ×1
spring-boot ×1
spring-mvc ×1
timer ×1
war ×1