REST-microservices maken met Javalin

1. Inleiding

Javalin is een lichtgewicht webframework dat is geschreven voor Java en Kotlin. Het is bovenop de Jetty-webserver geschreven, waardoor het zeer goed presteert. Javalin is nauw gemodelleerd naar koa.js, wat betekent dat het vanaf de basis is geschreven om eenvoudig te begrijpen en erop voort te bouwen.

In deze zelfstudie zullen we de stappen doorlopen voor het bouwen van een standaard REST-microservice met behulp van dit lichte raamwerk.

2. Afhankelijkheden toevoegen

Om een ​​basistoepassing te maken, hebben we maar één afhankelijkheid nodig - Javalin zelf:

 io.javalin javalin 1.6.1 

De huidige versie is hier te vinden.

3. Javalin opzetten

Javalin maakt het opzetten van een basistoepassing eenvoudig. We beginnen met het definiëren van onze hoofdklasse en het opzetten van een eenvoudige "Hello World" -toepassing.

Laten we een nieuw bestand maken in ons basispakket met de naam JavalinApp.java.

Binnen dit bestand maken we een hoofdmethode en voegen we het volgende toe om een ​​basistoepassing op te zetten:

Javalin-app = Javalin.create () .port (7000) .start (); app.get ("/ hallo", ctx -> ctx.html ("Hallo, Javalin!"));

We maken een nieuw exemplaar van Javalin, laten het luisteren op poort 7000 en starten vervolgens de toepassing.

We zijn ook bezig met het opzetten van ons eerste endpoint-luisteren voor een KRIJGEN verzoek bij de /Hallo eindpunt.

Laten we deze applicatie uitvoeren en // localhost: 7000 / hallo bezoeken om de resultaten te zien.

4. Een UserController

Een "Hallo wereld" -voorbeeld is geweldig om een ​​onderwerp te introduceren, maar het is niet gunstig voor een echte toepassing. Laten we nu eens kijken naar een meer realistische use-case voor Javalin.

Eerst moeten we een model maken van het object waarmee we werken. We beginnen met het maken van een pakket met de naam gebruiker onder het rootproject.

Vervolgens voegen we een nieuw Gebruiker klasse:

openbare klasse Gebruiker {openbare definitieve int id; openbare laatste String-naam; // constructeurs}

We moeten ook ons ​​gegevenstoegangsobject (DAO) instellen. In dit voorbeeld gebruiken we een in-memory-object om onze gebruikers op te slaan.

We maken een nieuwe klasse in de gebruiker verpakt genoemd Userbao.java:

class Userensional {private List users = Arrays.asList (nieuwe gebruiker (0, "Steve Rogers"), nieuwe gebruiker (1, "Tony Stark"), nieuwe gebruiker (2, "Carol Danvers")); privé statische UserStation userensional = null; private Userensional () {} statische Userão-instantie () {if (userensional == null) {userensional = new Userensional (); } retourneer gebruiker bedreigd; } Optioneel getUserById (int id) {retourneer gebruikers.stream () .filter (u -> u.id == id) .findAny (); } Herhaalbare getAllUsernames () {retourneer gebruikers.stream () .map (gebruiker -> gebruiker.naam) .collect (Collectors.toList ()); }}

Door onze DAO als singleton te implementeren, is het gemakkelijker om in het voorbeeld te gebruiken. We zouden het ook kunnen declareren als een statisch lid van onze hoofdklasse of afhankelijkheidsinjectie van een bibliotheek zoals Guice kunnen gebruiken als we dat zouden willen.

Ten slotte willen we onze controllerklasse maken. Javalin stelt ons in staat om zeer flexibel te zijn bij het aangeven van onze routebeheerders, dus dit is maar één manier om ze te definiëren.

We maken een nieuwe klasse met de naam UserController.java in de gebruiker pakket:

openbare klasse UserController {openbare statische handler fetchAllUsernames = ctx -> {Userão dao = Userão.instance (); Herhaalbare allUsers = dao.getAllUsernames (); ctx.json (allUsers); }; openbare statische handler fetchById = ctx -> {int id = Integer.parseInt (Objects.requireNonNull (ctx.param ("id")))); User Dao dao = Userbao.instance (); Gebruiker gebruiker = dao.getUserById (id); if (user == null) {ctx.html ("Niet gevonden"); } else {ctx.json (gebruiker); }}; }

Door de handlers statisch te verklaren, zorgen we ervoor dat de controller zelf geen status heeft. Maar in complexere applicaties willen we de status tussen verzoeken opslaan, in welk geval we de statische modifier moeten verwijderen.

Merk ook op dat het testen van eenheden moeilijker is met statische methoden, dus als we dat niveau van testen willen, zullen we niet-statische methoden moeten gebruiken.

5. Routes toevoegen

We hebben nu meerdere manieren om gegevens uit ons model op te halen. De laatste stap is om deze gegevens weer te geven via REST-eindpunten. We moeten twee nieuwe routes registreren in onze hoofdtoepassing.

Laten we ze toevoegen aan onze hoofdtoepassingsklasse:

app.get ("/ gebruikers", UserController.fetchAllUsernames); app.get ("/ gebruikers /: id", UserController.fetchById);

Nadat we de applicatie hebben gecompileerd en uitgevoerd, kunnen we een verzoek indienen bij elk van deze nieuwe endpoints. Door // localhost: 7000 / users aan te roepen, worden alle gebruikers weergegeven en door // localhost: 7000 / users / 0 te bellen, wordt het JSON-object voor één gebruiker met de id 0 opgehaald. We hebben nu een microservice waarmee we kunnen ophalen Gebruiker gegevens.

6. Uitbreiding van routes

Het ophalen van gegevens is een essentiële taak van de meeste microservices.

We moeten echter ook gegevens kunnen opslaan in onze datastore. Javalin biedt de volledige set padbehandelaars die nodig zijn om services te bouwen.

We zagen een voorbeeld van KRIJGEN hierboven, maar PATCH, POST, VERWIJDEREN, en LEGGEN zijn ook mogelijk.

Als we Jackson ook als een afhankelijkheid opnemen, kunnen we JSON-aanvraaglichamen automatisch in onze modelklassen parseren. Bijvoorbeeld:

app.post ("/") {ctx -> Gebruiker user = ctx.bodyAsClass (User.class); }

zou ons in staat stellen om de JSON te pakken Gebruiker object uit de hoofdtekst van het verzoek en vertaal het naar het Gebruiker modelobject.

7. Conclusie

We kunnen al deze technieken combineren om onze microservice te maken.

In dit artikel hebben we gezien hoe we Javalin kunnen opzetten en een eenvoudige applicatie kunnen bouwen. We hebben ook gesproken over het gebruik van de verschillende soorten HTTP-methoden om klanten met onze service te laten communiceren.

Raadpleeg de documentatie voor meer geavanceerde voorbeelden van het gebruik van Javalin.

Zoals altijd is de code ook te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found