[JAVA] Microservices dans Spring Cloud

Utilisez Spring cloud pour configurer un microservice simple. Utilisez OAuth2 pour vous connecter et vous permettre de vous connecter avec votre compte Google. La source est https://github.com/jun-1/spring-cloud-microservices

structure globale

Le service Web effectue un dialogue avec les clients tels que les navigateurs et le traitement des connexions, et demande diverses fonctions au service backend. À ce stade, enregistrez le service dans Discovery-service afin que chaque service puisse se trouver.

image

Implémentation du service de découverte

Vous pouvez implémenter le serveur Eureka en tant que registre de service simplement en créant une application à démarrage à ressort annotée avec @ EnableEurekaServer. Vous pouvez également vérifier l'état depuis http: // localhost: 8761.

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);
	}
}

Définissez le numéro de port et vous-même afin qu'ils ne soient pas enregistrés dans le registre.

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

mise en œuvre du service Web

Tout d'abord, obtenez l'ID client et le secret client utilisés par OAuth.

Créer des identifiants Google

Créez vos informations d'identification sur https://console.developers.google.com.

image

Dans Informations d'identification, cliquez sur Créer un projet pour créer le projet.

image

Sélectionnez l'ID client OAuth et créez les informations d'identification. (Si vous n'avez pas créé l'écran de consentement OAuth, créez-le)

image

Si vous souhaitez l'exécuter sur l'hôte local, sélectionnez [Autre] et cliquez sur le bouton [Créer] pour obtenir l'ID client et le secret client du client OAuth.

Implémentation de l'application

Le rôle du service Web consiste à interagir avec le client, à se connecter et à inverser le proxy au service backend.

Vous pouvez utiliser Zuul avec @ EnableZuulProxy pour agir en tant que proxy inverse sans avoir à gérer séparément CORS et les problèmes d'authentification. L'authentification unique basée sur OAuth2 peut être réalisée en ajoutant @ EnableOAuth2Sso.

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 () définit que l'authentification est requise pour accéder aux URL autres que index.html. Viennent ensuite les paramètres du service Web.

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

Le service est enregistré auprès du serveur Eureka avec le nom défini dans spring.application.name. Le serveur de destination d'enregistrement est spécifié par ʻeureka.client.service.url.defaultZone`.

Le paramètre zuul est défini pour transférer la requête vers api / ** vers le service backend. Ici, vous pouvez utiliser le nom de service enregistré sur le serveur Eureka comme destination de transfert.

Le paramètre security est le paramètre client OAuth2. Ici, utilisez l'ID client et le secret client obtenus précédemment.

backend-service

backend-service est un client OAuth2 et implémenté en tant que serveur de ressources.

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);
	}
}

Ce qui suit est un contrôleur qui renvoie simplement la chaîne "Hello", mais il ne sera pas accessible sans l'authentification OAuth2. Si vous accédez via le service Web, Zuul Proxy relaiera le jeton d'authentification, donc si vous êtes connecté avec le service Web, vous pouvez l'appeler avec / api / hello.

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";
	}
}

Vous pouvez également utiliser OAuth2RestTemplate comme indiqué ci-dessous pour effectuer facilement une communication Rest avec d'autres services.

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

Recommended Posts

Microservices dans Spring Cloud
Configurer des microservices avec Spring Cloud (4): API Gateway
Inject Logger au printemps
Mémo Spring Cloud Netflix
Utilisez Interceptor au printemps
Obtenez des cookies au printemps
Essayez gRPC dans le projet Spring Boot et Spring Cloud (Mac OS)
Définir le paramètre contextuel dans Spring Boot
Sortie de la démo Spring Cloud Stream
Erreur de connexion à la base de données Spring
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Créer un micro service avec Spring Boot
Étape de boucle avec Spring Batch
Comment utiliser Lombok au printemps
Chaîne d'appels depuis la chaîne dans l'intégration Spring
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
Environnement Java Spring dans vs Code
Écrire du code de test avec Spring Boot
J'ai participé au JJUG CCC 2019 Spring
Implémenter reCAPTCHA v3 dans Java / Spring
Stocker les informations de session dans la base de données avec Spring Session
Authentification Oauth2 avec Spring Cloud Gateway
Implémenter l'API REST avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
Le traitement des événements est effectué au printemps.
Intégration du serveur de configuration dans Spring Cloud Config
Implémenter l'application Spring Boot dans Gradle
Expliquons en détail Spring Cloud Gateway
Microservices avec Docker et Cloud Performance
Comment utiliser Thymeleaf avec Spring Boot
[Cloud9] Adresse déjà utilisée [Solution]
Spring Autowired est écrit dans le constructeur
Lancer un (ancien) projet Spring Boot avec IntelliJ
Convertir les paramètres de demande en Enum au printemps
Prise en charge des tampons de protocole pour Spring Cloud Stream
Créer une image Spring Boot + Docker avec Gradle
Priorité d'accès aux fichiers statiques dans Spring Boot
Comment inclure Spring Tool dans Eclipse 4.6.3?
Sortie du journal Spring Boot au format json
Mémorandum de téléchargement de fichier local avec Spring Boot
Gérer les variables d'environnement système dans Spring application.properties
Créer un projet Java Spring Boot avec IntelliJ
Desserrer la vérification de la syntaxe de Thymeleaf dans Spring Boot
Exécuteurs de tâches séparés utilisés par @Async au printemps
[Entraine toi! ] Affichez Hello World avec Spring Boot
Fonctionnement du servlet Dispatcher dans Spring MVC
Utiliser la méthode de requête DynamoDB avec Spring Boot
Cache de support nul dans Spring Data Redis
Pour écrire des données de réponse directement dans Spring
Changements majeurs dans la fonctionnalité de base de Spring Framework 5.0
J'étais accro au @Transactional de Spring
Changement de beans avec annotation de profil dans Spring
Installer IBM Cloud CLI dans un conteneur
Le serveur Rails ne peut pas être démarré dans Cloud9
DI SessionScope Bean dans le filtre Spring Boot 2
[* Java *] J'ai participé au JJUG CCC 2019 Spring
Problème de configuration Maven avec Spring pom.xml dans Eclipse
Modifier le délai d'expiration de la session dans Spring Boot
Bean de sortie au format JSON au printemps