Java >> Java tutorial >  >> Tag >> Spring

Spring Cloud Tutorial for begyndere

Hvad er Spring Cloud? I dette indlæg vil jeg dække Spring Cloud Tutorial for begyndere. Hvis du er ny til Spring Framework, vil jeg foreslå, at du starter med Spring Boot og Microservices og Simplifying Spring Security.

Som den officielle dokumentation på Spring-hjemmesiden siger:

"Spring Cloud giver udviklere værktøjer til hurtigt at opbygge fælles mønstre i distribuerede systemer – konfigurationsstyring, serviceopdagelse, kredsløbsafbrydere, intelligent routing, mikroproxy, kontrolbus, engangstokens

  • Hvad er Spring Cloud?
  • Forår Cloud-funktioner
  • Forårssky-eksempel i aktion
  • Konklusion

Hvad er Spring Cloud?

Spring Cloud leverer færdige mønstre til at udvikle distribuerede systemapplikationer. De fleste af disse mønstre er almindelige, når man bygger sådanne applikationer.

Et eksempel er, når der er flere mikrotjenester, og de interagerer med hinanden. Du skal sikre hver tjeneste. Hver tjeneste kommunikerer sikkert med andre tjenester. Hvordan sikres disse tjenester fremover? Hvordan kommunikerer de sikkert? Og hvordan bliver de implementeret problemfrit? Hvad er de andre automatiseringsopgaver, der bruges til forskellige krav?

Ved at bruge Spring Cloud kan en udvikler hurtigt bygge en applikation, der implementerer disse designmønstre og implementere applikationen på cloudplatforme (såsom Heroku eller Cloud Foundry).

Spring Cloud-funktioner

Spring framework er grundlæggende for at bygge en Spring Cloud-applikation. Så hvad er de forskellige funktioner, som Spring Cloud tilføjede?

Tjenesteregistrering og -opdagelse

Spring Boot blev populær med mikroservicearkitektur. Når du har flere tjenester, der interagerer med hinanden, har du brug for en tjeneste for at registrere hver tjeneste, dette er for det meste Configuration Service. Så har du brug for en opdagelsestjeneste for at finde andre tjenester.

Distribuering af beskeder

Grundlæggende giver Spring cloud forskellige værktøjer til at gøre vores mikroservice-baserede arkitektur vellykket. Spring Boot hjælper hurtig udvikling af disse applikationer. Spring Cloud hjælper med at koordinere og implementere disse applikationer. En sådan funktion med Spring Cloud er distribueret meddelelse.

Mikrotjenester kommunikerer synkront eller asynkront. Samlet set tilbyder Spring Cloud Bus en meddelelsesmægler, der forbinder noder i et distribueret system. På samme måde tilbyder Spring Cloud Stream en ramme til at bygge begivenhedsdrevne mikrotjenester. Ikke desto mindre fungerer denne funktion godt med beskedtjenester som Kafka eller ActiveMQ.

Service til Service-kommunikation

Spring Cloud giver en funktion til service-til-service-kommunikation. Normalt går flowet sådan her

  • Registrer tjenesten
  • Hent registreringsdatabasen
  • Find den ønskede downstream-tjeneste
  • Ring til REST-slutpunktet for den pågældende tjeneste

Distribueret konfiguration

Især tillader spring cloud config-serveren eksternaliseret konfiguration på klientsiden for de distribuerede systemer.

Ud over disse funktioner leverer Spring Cloud værktøjer til at bygge robuste og robuste tjenester. Et sådant værktøj er afbrydere.

Som en illustration vil vi oprette to mikrotjenester, og en mikrotjeneste kalder en anden. Vi vil bruge funktionen til registreringstjenesten (fra Spring Cloud) til at registrere disse mikrotjenester.

Forårssky-eksempel i aktion

Byg Eureka Server til Registry Service

Først vil vi oprette en tjeneste, der bruger Eureka-tjenesten og fungerer som en registreringstjeneste. Som et resultat skal du tilføje følgende afhængighed i et nyt Spring Boot-program:

plugins {
	id 'org.springframework.boot' version '2.5.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.betterjavacode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

ext {
	set('springCloudVersion', "2020.0.4")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

test {
	useJUnitPlatform()
}

Når vi har den afhængighed, kan vi aktivere eureka-serveren i vores hovedklasse.

package com.betterjavacode.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaserverApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaserverApplication.class, args);
	}

}

Tilføj følgende egenskaber til application.yml

server:
  port: 7000

# Discovery Server Access
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
  serviceUrl:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

Egenskaberne eureka.instance.client.register-with-eureka=false og eureka.instance.client.fetch-registry=false angiver, at dette er en registreringsserver og ikke vil bruge sig selv til at registrere.

En mikrotjeneste til at returnere produkter

For at vise, hvordan vi vil bruge registreringstjenesten som en del af hele Spring Cloud-integrationen, vil vi oprette en ny mikrotjeneste. Denne REST-baserede mikroservice returnerer en liste over produkter.

plugins {
	id 'org.springframework.boot' version '2.5.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.betterjavacode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

ext {
	set('springCloudVersion', "2020.0.4")
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

test {
	useJUnitPlatform()
}

Med dette i tankerne vil RESTController for denne tjeneste se ud som nedenfor:

package com.betterjavacode.productservice.controllers;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ProductController
{
    @GetMapping("/products")
    public List getAllProducts ()
    {
        List products = new ArrayList<>();
        products.add("Shampoo");
        products.add("Soap");
        products.add("Cleaning Supplies");
        products.add("Dishes");

        return products;
    }
}

Og application.yml-filen for denne applikation vil være sådan her

spring:
  application:
    name: product-service

server:
  port: 8083

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:7000/eureka/
  instance:
    hostname: localhost

Her har vi eureka.client.registerWithEureka=true og eureka.client.fetchRegistry=true da vi ønsker, at vores service skal registreres med vores Eureka-server, der kører registreringstjenesten. Efterfølgende vil vores hovedklasse for denne tjeneste have en annotation @EnableDiscoveryClient som vil tillade denne tjeneste at blive opdaget af Eureka Server.

Kundeservice for at ringe til produktservice

Lad os nu skabe en anden service, som vil være en kundeservice til produktservice. Det vil minde meget om Product Service, bortset fra at det vil være baseret på MVC, så vi vil bruge en thymeleaf-skabelon til at kalde denne service.

package com.betterjavacode.productserviceclient.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@Controller
public class ProductController
{
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/")
    public String home(Model model)
    {
        List serviceInstances = discoveryClient.getInstances("product" +
                "-service");

        if(serviceInstances != null && !serviceInstances.isEmpty())
        {
            ServiceInstance serviceInstance = serviceInstances.get(0);
            String url = serviceInstance.getUri().toString();
            url = url + "/products";
            RestTemplate restTemplate = new RestTemplate();
            List products = restTemplate.getForObject(url, List.class);
            model.addAttribute("products", products);
        }

        return "home";
    }
}

application.yml for denne service vil se ud som nedenfor:


spring:
  application:
    name: product-service-client

server:
  port: 8084


eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:7000/eureka/
  instance:
    hostname: localhost

Thymeleaf-skabelon til hjemmet vil grundlæggende vise produkterne i en tabelform.

Kør tjenesterne

Kør om kort tid alle tjenesterne - startende med Eureka-server, produktservice og produkt-service-klient. Hvis vi nu får adgang til eureka-serveren, vil vi se listen over tjenester, der er registreret med den som nedenfor:

Du kan se begge tjenester registreret. Og hvis vi får adgang til vores produkt-service-klient-applikation på http://localhost:8084/ , vil vi se listen over produkter

Til sidst så vi en simpel demo af at bruge Eureka-server som en registreringstjeneste med Spring Cloud. Hvis du vil lære mere om Spring Cloud Config, anbefaler jeg klart dette kursus Distribueret konfiguration med Spring Cloud Config fra udemy.

Konklusion

I dette indlæg lærte vi om Spring Cloud. Der er en række funktioner, der skal evalueres i Spring Cloud. Jeg har kun dækket en funktion, som de fleste udviklere skal bruge, mens de bruger Spring Cloud. En udvikler kan også kombinere Spring Cloud Function med AWS Lambda for at lære mere om Spring Cloud.

Hvis du stadig søger at lære om Spring Security, kan du min bog her.

Bemærk – Links til Udemy eller Educative kurser er tilknyttede links. Hvis du ender med at købe de kurser, får jeg en procentdel af den samlede pris. Jeg anbefaler også kun de kurser, som jeg selv har taget eller har lært om det emne.


Java tag