[JAVA] Microservices in Spring Cloud

Verwenden Sie Spring Cloud, um einen einfachen Microservice zu konfigurieren. Verwenden Sie OAuth2, um sich anzumelden und sich mit Ihrem Google-Konto anzumelden. Die Quelle ist https://github.com/jun-1/spring-cloud-microservices

Gesamtstruktur

Der Webdienst führt einen Dialog mit Clients wie Browsern und der Anmeldeverarbeitung und fordert verschiedene Funktionen vom Backend-Dienst an. Registrieren Sie zu diesem Zeitpunkt den Dienst im Discovery-Dienst, damit sich jeder Dienst finden kann.

image

Implementierung des Erkennungsdienstes

Sie können den Eureka-Server als Dienstregistrierung implementieren, indem Sie einfach eine Spring-Boot-Anwendung mit der Annotation "@ EnableEurekaServer" erstellen. Sie können den Status auch unter http: // localhost: 8761 überprüfen.

package demo;

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

@EnableEurekaServer
@SpringBootApplication
public class DeiscoveryServiceApplication {

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

Stellen Sie die Portnummer und sich selbst so ein, dass sie nicht in der Registrierung registriert sind.

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
server:
  port: 8761

Implementierung von Web-Service

Holen Sie sich zunächst die von OAuth verwendete Client-ID und das Client-Geheimnis.

Erstellung von Google-Anmeldeinformationen

Erstellen Sie Ihre Anmeldeinformationen unter https://console.developers.google.com.

image

Klicken Sie unter Anmeldeinformationen auf Projekt erstellen, um das Projekt zu erstellen.

image

Wählen Sie die OAuth-Client-ID aus und erstellen Sie die Anmeldeinformationen. (Wenn Sie den OAuth-Zustimmungsbildschirm nicht erstellt haben, erstellen Sie ihn.)

image

Wenn Sie es auf localhost ausführen möchten, wählen Sie [Andere] und klicken Sie auf die Schaltfläche [Erstellen], um die Client-ID und das Client-Geheimnis des OAuth-Clients abzurufen.

Anwendungsimplementierung

Die Rolle des Webdienstes besteht darin, mit dem Client zu interagieren, sich anzumelden und den Proxy zum Backend-Dienst umzukehren.

Sie können Zuul mit @ EnableZuulProxy verwenden, um als Reverse-Proxy zu fungieren, ohne CORS- und Authentifizierungsprobleme separat verwalten zu müssen. Single Sign-On basierend auf OAuth2 kann durch Hinzufügen von "@ EnableOAuth2Sso" realisiert werden.

package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableEurekaClient
@EnableZuulProxy
@EnableOAuth2Sso
@SpringBootApplication
public class WebServiceApplication extends WebSecurityConfigurerAdapter{

	public static void main(String[] args) {
		SpringApplication.run(WebServiceApplication.class, args);
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
			.antMatchers("/", "index.html").permitAll()
			.anyRequest().authenticated();
	}
}

configure () legt fest, dass eine Authentifizierung erforderlich ist, um auf andere URLs als index.html zuzugreifen. Als nächstes folgen die Webdiensteinstellungen.

spring:
  application:
    name: web-service
eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka
zuul:
  ignored-services: '*'
  routes:
    backend-service: 'api/**'
security:
  oauth2:
    resource:
      user-info-uri: https://www.googleapis.com/oauth2/v1/userinfo
    client:
      access-token-uri: https://accounts.google.com/o/oauth2/token
      user-authorization-uri: https://accounts.google.com/o/oauth2/auth
      client-id: ${clientId}
      client-secret: ${clientSecret}
      grant-type: code
      scope: profile

Der Dienst ist beim Eureka-Server unter dem in spring.application.name festgelegten Namen registriert. Der Registrierungszielserver wird durch "eureka.client.service.url.defaultZone" angegeben.

Die Einstellung "zuul" ist festgelegt, um die Anforderung an api / ** an den Backend-Service weiterzuleiten. Hier können Sie den auf dem Eureka-Server registrierten Dienstnamen als Übertragungsziel verwenden.

Die Sicherheitseinstellung ist die OAuth2-Clienteinstellung. Verwenden Sie hier die zuvor erhaltene Client-ID und das Client-Geheimnis.

backend-service

Der Backend-Service ist ein OAuth2-Client und als Ressourcenserver implementiert.

package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;

@EnableEurekaClient
@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class BackendServiceApplication {

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

Das Folgende ist ein Controller, der nur die Zeichenfolge 'Hallo' zurückgibt, aber ohne OAuth2-Authentifizierung nicht zugänglich ist. Wenn Sie über den Webdienst zugreifen, leitet Zuul Proxy das Authentifizierungstoken weiter. Wenn Sie also mit dem Webdienst angemeldet sind, können Sie es mit / api / hello aufrufen.

package demo.controller;

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

@RestController
public class BackendController {
	
	@RequestMapping("/hello")
	public String hello(){
		return "Hello";
	}
}

Sie können OAuth2RestTemplate auch wie unten gezeigt verwenden, um die Rest-Kommunikation mit anderen Diensten einfach durchzuführen.

    @Bean
    @LoadBalanced
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context){
        return new OAuth2RestTemplate(resource, context);
    }

Recommended Posts

Microservices in Spring Cloud
Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway
Injizieren Sie den Logger im Frühjahr
Spring Cloud Netflix-Memo
Verwenden Sie Interceptor im Frühjahr
Holen Sie sich Cookies im Frühling
Probieren Sie gRPC im Spring Boot & Spring Cloud-Projekt (Mac OS) aus.
Legen Sie den Kontextparameter in Spring Boot fest
Spring Cloud Stream Demo veröffentlicht
Fehler in der Spring-Datenbankverbindung
Wichtige Änderungen in Spring Boot 1.5
NoHttpResponseException in Spring Boot + WireMock
Erstellen Sie mit Spring Boot einen Mikrodienst
Schleifenschritt mit Spring Batch
Wie man Lombok im Frühling benutzt
Rufen Sie Chain from Chain in Spring Integration auf
Frühlingsstiefel Hallo Welt in Eclipse
Spring Boot-Anwendungsentwicklung in Eclipse
Java Spring-Umgebung in vs Code
Schreiben Sie den Testcode mit Spring Boot
Ich habe am JJUG CCC 2019 Spring teilgenommen
Implementieren Sie reCAPTCHA v3 in Java / Spring
Speichern Sie Sitzungsinformationen mit Spring Session in der Datenbank
Oauth2-Authentifizierung mit Spring Cloud Gateway
Implementieren Sie die REST-API mit Spring Boot
Google Cloud Platform mit Spring Boot 2.0.0
Die Ereignisverarbeitung wird im Frühjahr durchgeführt.
Einbetten des Konfigurationsservers in Spring Cloud Config
Implementieren Sie die Spring Boot-Anwendung in Gradle
Lassen Sie uns Spring Cloud Gateway ausführlich erklären
Microservices mit Docker- und Cloud-Leistung
Verwendung von Thymeleaf mit Spring Boot
[Cloud9] Bereits verwendete Adresse [Lösung]
Spring Autowired wird im Konstruktor geschrieben
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Konvertieren Sie Anforderungsparameter im Frühjahr in Enum
Unterstützt Protokollpuffer für Spring Cloud Stream
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
Statische Dateizugriffspriorität beim Spring Boot
Wie kann ich Spring Tool in Eclipse 4.6.3 einbinden?
Spring Boot-Protokoll im JSON-Format ausgeben
Memorandum zum Herunterladen lokaler Dateien mit Spring Boot
Behandeln Sie Systemumgebungsvariablen in Spring application.properties
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Lösen Sie die Thymeleaf-Syntaxprüfung in Spring Boot
Separate Task Executors, die von @Async im Frühjahr verwendet werden
[Trainieren! ] Zeigen Sie Hello World mit Spring Boot an
Funktionsweise des Dispatcher-Servlets in Spring MVC
Verwenden Sie die DynamoDB-Abfragemethode mit Spring Boot
Null-Support-Cache in Spring Data Redis
Antwortdaten direkt im Frühjahr schreiben
Wichtige Änderungen in der Kernfunktionalität von Spring Framework 5.0
Ich war süchtig nach Spring's @Transactional
Wechseln der Beans mit Profilanmerkung im Frühjahr
Installieren Sie IBM Cloud CLI in einem Container
Der Rails-Server kann in Cloud9 nicht gestartet werden
DI SessionScope Bean im Spring Boot 2-Filter
[* Java *] Ich habe am JJUG CCC 2019 Spring teilgenommen
Maven-Konfigurationsproblem mit Spring pom.xml in Eclipse
Ändern Sie das Sitzungszeitlimit in Spring Boot
Ausgabe Bean als JSON im Frühjahr