Poster taggade med ‘rest’

Sida 1 av 512345

Är du en riktigt skarp .NET-utvecklare? I så fall bör du söka jobb på Cygni! Vi är ett konsultbolag med ambitionen att vara Stockholms bästa arbetsgivare för skickliga IT-konsulter.​ Bland våra kunder finns Sveriges Television, Aftonbladet, Metro, Com Hem och många andra företag som är ledande inom sin bransch.​ Cygni består idag av cirka 60 tjejer och killar i åldrarna 25-60. Vi har några av Stockholms absolut skarpaste systemutvecklare men vill nu växa och bli fler.

Det vi söker just nu är sylvassa .NET:are, gärna fullstacksutvecklare. Du måste vara grym på C# och gärna ha koll på andra språk såsom JavaScript/TypeScript. Förmodligen är du civilingenjör och har jobbat professionellt med utveckling i några år. Att jobba testdrivet är en självklarhet för dig och du brinner för att leverera kod av högsta kvalitet. Du gillar open source, Git, NoSQL, REST, Continuous Delivery och strävar ständigt efter att ligga i framkant när det gäller nya tekniker. Har du dessutom jobbat med mobila lösningar är du som klippt och skuren för oss.

Absolut viktigast är dock att du är en relationsbyggare som trivs i konsultrollen! Om du vill vara en del av ett ungt företag som har Stockholms bästa konsulter, fantastisk gemenskap, roliga kunder samt ett exceptionellt bra förmånspaket – skicka då ett mejl med din ansökan till rekrytering@cygni.se.

Dropwizard är en körmiljö och ett ramverk för att enkelt utveckla små enheter i form av RESTful webtjänster. En stack bestående av bl.a Jetty, Jersey, Jackson, slf4j, JDBI och en föreslagen projektstruktur gör det väldigt lätt att komma igång!

Begrepp

Dropwizard har idenitifierat följande aktörer och entiteter i sin stack:

Configuration

Konfigurationen är till för att hålla miljöspecifika aspekter av tjänsten. Det kan t.ex vara databaskonfiguration eller nödvändiga sökvägar och url:ar. Konfigurationen skrivs i formatet YAML. Genom JSON-annotationer i din klass läser DropWizard automatiskt upp konfigurationen och populerar din konfigurationsklass.

Representation

Detta är de objekt som ska skickas mellan klient och server och är i sin enklaste form vanliga POJOs. Jackson används för serialisering och deserialisering. DropWizard rekommenderar att dessa objekt är immutable.

Resource

Det är resurserna som exponerar REST API:et. Varje resurs och metod har en URI och klassen annoteras med javax.ws.rs.*-typerna för att definiera sökvägar, innehållstyper och metod. DropWizard använder Jersey-implementationen.

Health check

Hälsokontroller är små kodsnuttar som testar att tjänsten är uppe och att allt är som det ska. Status för hälsokontrollerna kan inspekteras via en speciell admin-url. DropWizard skapar automatiskt några hälsokontroller, bl.a en som kontrollerar att databasanslutningen är korrekt (om man har en i sitt projekt).

Service

Servicen ansvarar för att dra igång tjänsten med en konfiguration och med resurserna initialiserade med eventuella beroenden. Detta sker genom en vanlig main-metod(public static void main(String[] args) { ... } ).

I vårt exempelprojekt ser serviceklassen ut så här:

public class MainService extends Service<MainConfiguration> {
    public static void main(String[] args) throws Exception {
        new MainService().run(args);
    }

    @Override
    public void initialize(Bootstrap<MainConfiguration> mainConfigurationBootstrap) {
        mainConfigurationBootstrap.addBundle(new AssetsBundle("/assets/", "/"));
    }

    @Override
    public void run(MainConfiguration config, Environment environment) throws Exception {

        DBI dbi = initDatabaseConnection(config, environment);

        final EventsRepository eventsRepository = dbi.onDemand(EventsRepository.class);
        final ExpensesRepository expensesRepository = dbi.onDemand(ExpensesRepository.class);

        environment.addResource(new EventsResource(eventsRepository));
        environment.addResource(new ExpensesResource(expensesRepository));
    }

    private DBI initDatabaseConnection(MainConfiguration config, Environment environment) throws ClassNotFoundException {

        final DBIFactory factory = new DBIFactory();
        final DBI jdbi = factory.build(environment, config.getDatabaseConfiguration(), "db");

        createTables(jdbi);

        return jdbi;
    }

    private void createTables(DBI dbi) {

        Handle handle = dbi.open();

        handle.execute(EventsRepository.CREATE_TABLE_STATEMENT);

        handle.execute(ExpensesRepository.CREATE_TABLE_STATEMENT);

        handle.close();
    }
}

För dig som är van vid Spring eller något annat DI-ramverk kan det kännas lite konstigt att själv behöva instansiera t.ex resursklasserna (och skjuta in Repository-implementationerna). Eftersom tanken med en DropWizard tjänst är att ansvara för en relativt liten delmängd av ett system så tycker jag inte att detta är särskilt besvärande.

Resurser, dvs REST-tjänsterna, aktiveras genom att lägga till dem till instansen av Environment. Se rad 19-20 ovan.

Komma igång

Checka ut exempelprojektet och bygg:

git clone git://github.com/cygni-stacktrace/dropwizard-sample.git
cd dropwizard-sample
mvn package

Starta tjänsten med kommandot server och filnamnet för konfigurationen:

java -jar target/expenses-1.0-SNAPSHOT.jar server development.yml

Rest-API:et ligger under kontextet /api, en GET-operation för att lista events finns t.ex här: http://localhost:8080/api/event

Admingränssnittet med länk till Health check finns här: http://localhost:8081

Testning

Testning av resurser är en enkel historia med DropWizard. Genom att låta din testklass uttöka ResourceTest kan du lägga till resursen under test så här:

    @Override
    protected void setUpResources() throws Exception {
        eventsRepository = mock(EventsRepository.class);
        addResource(new EventsResource(eventsRepository));
    }

En testmetod:

    @Test
    public void shouldShowOneEvent() throws IOException {
        //given
        Event event = new Event(1, "An event", null);

        given(eventsRepository.findById(event.getId())).willReturn(event);

        //when
        Event result = client().resource("/event/1").get(Event.class);

        //then
        assertThat("event should be returned", result, is(event));
    }

Dropwizard drar igång Jersey och invokerar anropen i testet via en HTTP-klient så hela request/response kedjan går över JSON och HTTP. Detta är bra för då testas även att Jackson kan serialisera och deserialisera dina POJO:s.

Databasstöd

Dropwizard har moduler med stöd för Hibernate och JDBI. I exempelprojektet används JDBI.

Slutsats

Det är väldigt lätt att komma igång med Dropwizard och jag tycker att de valt en vettig stack med hjälpbibliotek. Den föreslagna projektstrukturen och användandet av Maven gör att det fungerar bra i alla stora IDE:er. Att inkludera Health checks direkt från början känns väldigt bra och det är befriande att ha en app som kan köras helt stand-alone (d.v.s den behöver inte deployas i en webcontainer). Jag tycker också att de tänkt till bra kring testningen.

Om man planerar att börja använda Dropwizard i ett större sammanhang behövs dock en strategi för hur tjänster ska kunna versionshanteras samt upptäckas.

Vidare läsning

http://dropwizard.codahale.com

I denna artikel mixar vi Jersey med det XML-schema som Tommy Wassgren definierade i Serialisering med JAXB. Jersey är referensimplementationen för JAX-RS som är ett API för att bygga RESTfulla webbtjänster.

I artikeln visar vi hur enkelt det är att dra nytta av Jerseys inbyggda stöd för att skicka bl.a. XML och JSON m.h.a. JAXB. Vi visar också hur du kan enhetstesta REST-applikationen. Koden hittar du på github: https://github.com/cygni-stacktrace/jaxbws.

Läs mer >>

I Protobuf för serialisering del 1 berättade jag om grunderna i Protobuf som kort kan beskrivas som ett binärt JSON-format. I den här artikeln tänkte jag visa hur man knyter i hop detta med Jersey som är ett snyggt API för RESTfulla webbtjänster. Som grädde på moset gör vi allt i Maven. Koden finns att hämta på https://github.com/cygni-stacktrace/protows.

Läs mer >>

Ibland kan det vara skönt att inte uppfinna hjulet en gång till, att låta någon annan göra jobbet och ägna sin tid åt viktigare saker. Ibland kan det vara skönt att gå till plugins.jquery.com och inse att det du vill göra i jQuery redan är gjort och det, handen på hjärtat, många gånger bättre än vad du själv hade lyckats med. Att använda ett jQuery-plugin kan spara dig mycket tid och arbete då alla jQuery-funktioner du skulle behöva leta upp och använda redan är samlade och ihop-pusslade.

Utifrån ett webbprojekt signerat Cygni, listar jag i den här artikeln fem jQuery-plugins som vi valt att använda oss av.  Jag ger en introduktion till pluginet, beskriver lite kort hur det fungerar och ger sedan exempel på var och hur det används i det projekt vi här kan kalla SiteDoe.

Läs mer >>

Cygni erbjuder expertis inom agil systemutveckling på moderna plattformar. Ett konsultbolag kan antingen nischa sig inom en viss bransch eller inom ett visst teknikområde. Cygni har valt det senare; oavsett bransch kan vi delta i utvecklingen av avancerade och verksamhetskritiska system. Många av Cygnis kunder upplever också en fördel i att konsulterna har erfarenhet från andra branscher än den kunden själv verkar i.

Cygnis kundlista återfinns företag och organisationer inom ett flertal branscher såsom retail, media, finans, spel och telekom. De flesta av Cygnis kunder är ledande i sin bransch men vi jobbar även med mindre företag och organisationer.

När man börjar utveckla i Scala dröjer det inte länge innan man behöver ett byggverktyg. Maven kommer med fullt javastöd  men för att kompilera Scala behövs maven-scala-pluginen. Det  gör att man börjar undra om det finns ett byggverktyg med fullt inbyggt stöd för Scala och det gör det, Simple Build Tool, eller SBT. På code.google.com finns SBT att ladda ner och bra engelsk dokumentation för installation och handhavande.

SBT liknar Maven väldigt mycket; samma konvention för hur filerna ska organiseras, de flesta av Mavens kommandon har direkta motsvarigheter i SBT. Så istället för mvn compile skriver man sbt compile.

SBT kan använda Mavens repositories, till och med Mavens pom.xml för beroendehantering. Det gör att det är väldigt enkelt att testa SBT i ett befintligt Maven-projekt.

Så vilka fördelar har SBT framför Maven, förutom att kompilera både scala- och javakod utan plugin-konfiguration?
Läs mer >>

Grunden i varje webbprojekt består av en databas. I de flesta fall rör det sig om en klassisk relationsdatabas i form av MySQL eller motsvarande. Denna arkitektur är välkänd, mogen och har tjänat oss väl, men på senaste tiden har uttrycket ”NoSQL” hörts mer och mer. Bakom uttrycket döljer sig en rad olika typer av databaser som bygger på andra paradigm än den klassiska relationsdatabasen, i denna artikel tänker jag ge en översikt av dokumentdatabasen CouchDB. Läs mer >>
Sida 1 av 512345