serverless-java-container icon indicating copy to clipboard operation
serverless-java-container copied to clipboard

Dropwizard example?

Open kennovak-zy opened this issue 6 years ago • 14 comments

Can this framework support Dropwizard? I have a REST server using dropwizard, JAX-RS, and hibernate and would like to port to Lambda. If there are any examples of how to do this, please let me know. Thanks

kennovak-zy avatar Feb 28 '18 17:02 kennovak-zy

Hey @kennovak-zy - I suspect it is possible. Ultimately Dropwizard can use Jersey behind the scenes. I'll have a go at this as soon as possible and let you know.

sapessi avatar Feb 28 '18 17:02 sapessi

I'm working on a custom runtime for running AWS Lambdas with Java 9+. I'd love to get Dropwizard working with this as well. If anyone has a theory on how to get it to work I'd love to hear it. Do you think changes to Dropwizard would be required?

spullara avatar Feb 13 '19 18:02 spullara

@kennovak-zy , @sapessi, or @spullara did you ever get any traction on running Dropwizard applications with minimal changes under aws-serverless-java-container (or another helper)?

aharnly-amplify avatar Jun 27 '19 14:06 aharnly-amplify

I haven't had a chance to look into it yet. Working on the 1.3.2 bug-fix release. I'll try to look into it for the 1.4 release. Could you add a +1 to the original comment so that I can track interest in the framework support?

sapessi avatar Jun 27 '19 16:06 sapessi

Hi @kennovak-zy, @spullara, @aharnly-amplify. I've started working on Dropwizard support and have a basic version working in the dropwizard branch of this repo. I've also added a hello world example that you can simply mvn package and run in AWS Lambda. Lots of work still to be done in terms of understanding the internals of dropwizard and improving performance. I'm no expert so I'd like to ask for your help - can you help me test with your applications? I'm looking for something more complex/taxing than hello world.

  1. Git clone/download the dropwizard branch to your local environment
  2. Run mvn install from the root of the repository to make all the packages available in your local maven repo
  3. Add the dropwizard version of this package as a dependency (1.4-SNAPSHOT)
  4. Create a LambdaStreamHandler and pass your application and configuration file to the handler just like I do in the sample. The config file name should be the relative path of the config file starting from the resources folder.

sapessi avatar Jul 01 '19 23:07 sapessi

Thanks @sapessi ! We will test drive this with a one or two of our production Dropwizard applications over the next few weeks – happy to try and learn with you guys. cc @bcerrato-amplify.

aharnly-amplify avatar Jul 15 '19 16:07 aharnly-amplify

Hi sapessi, As I followed your steps in Dropwizard, but I am getting the below error after mvn install,

Running com.amazonaws.serverless.proxy.AwsProxyExceptionHandlerTest [main] ERROR com.amazonaws.serverless.proxy.AwsProxyExceptionHandler - Called exception handler for: com.amazonaws.serverless.exceptions.InvalidResponseObjectException: Invalid response error at com.amazonaws.serverless.proxy.AwsProxyExceptionHandlerTest.typedHandle_InvalidResponseObjectException_jsonContentTypeHeader(AwsProxyExceptionHandlerTest.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) com.amazonaws.serverless.exceptions.InvalidResponseObjectException: Invalid response error at com.amazonaws.serverless.proxy.AwsProxyExceptionHandlerTest.typedHandle_InvalidResponseObjectException_jsonContentTypeHeader(AwsProxyExceptionHandlerTest.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

Kumaresan89 avatar Sep 05 '19 10:09 Kumaresan89

For anyone who may be interested, I've managed to get a slight variant of this working for a Dropwizard 0.7.1 app that I needed to deploy to AWS.

https://git.nexus.commercehub.com/snippets/291

davidmc24 avatar Oct 30 '19 14:10 davidmc24

Nice! thanks @davidmc24 - I'll go through it next week. Haven't decided yet whether I want to create a completely separate package for Dropwizard or just work on an example that shows how to use the existing Jersey support.

sapessi avatar Nov 07 '19 18:11 sapessi

I'll summarize our findings from our POC. For context, we have a sizable suite of microservices that currently run in ec2 (most with RDS), which we are considering migrating to docker and/or lambda. We chose a relatively simple Dropwizard service to evaluate the effort and results of converting to Docker, Lambda via aws-serverless-java-container, and Lambda with a refactor.

  1. We made a few small changes to support Dropwizard 1.3.9 (rather than 2.0.0-rc4). Those are here:

https://github.com/awslabs/aws-serverless-java-container/compare/dropwizard...amplify-education:dropwizard

  1. The cold start times were, to no great surprise, very long – around 18 seconds.

  2. Again not a surprise, the database pooling configured for our dropwizard deployment wouldn't work very well in a lambda deployment.

In short, as we suspected heading in, we concluded that we'd do better to do one of:

a) Put substantial work into a version of the serverless container that essentially neuters Dropwizard, exposing the resources more directly to lambda. This would take real work.

b) Refactor our applications to remove Dropwizard and optimize for a lambda environment.

c) just run in Docker

aharnly-amplify avatar Nov 07 '19 18:11 aharnly-amplify

Thanks for the summary and code sample @aharnly-amplify. I'll try to dig into this. Do you have a public sample of the slow application I can test with?

sapessi avatar Nov 08 '19 16:11 sapessi

Any interest in restarting this effort? We (the Dropwizard maintainers) recently released v4.0.1 that we could try and add as a sample?

jplock avatar Aug 17 '23 13:08 jplock

Please feel free!

msailes avatar Aug 29 '23 07:08 msailes

@jplock We haven't seen requests for it lately but open to review and merge related pull requests.

deki avatar Aug 29 '23 07:08 deki