Cuando varios microservices de Spring Cloud necesitan descubrirse y llamarse entre sí, un registro de servicios centralizado elimina los endpoints codificados de forma manual y habilita el enrutamiento dinámico. Microservices Engine (MSE) proporciona un registro Nacos administrado que gestiona el descubrimiento de servicios y la administración de configuración. Solo necesita configurar el endpoint del registro en su aplicación para que esta se registre automáticamente al iniciarse.
Esta guía explica cómo compilar un proveedor y un consumidor, registrar ambos en un registro Nacos de MSE y comprobar las llamadas de servicio de extremo a extremo.
Requisitos previos
Antes de empezar, compruebe que cuenta con lo siguiente:
Maven instalado y con las variables de entorno configuradas.
Una instancia de MSE Nacos. Consulte Create an instance.
Un namespace. Consulte Create a namespace. Esta guía utiliza el namespace predeterminado
Public.
Si accede al registro de MSE Nacos a través de Internet, tanto el proveedor como el consumidor deben tener acceso a Internet. Agregue sus direcciones IP públicas a la lista blanca del registro. Consulte Configure a public IP address whitelist.
Paso 1: Compilar el proveedor
Cree una aplicación de Spring Cloud que exponga un endpoint REST y se registre en el registro de MSE Nacos como proveedor de servicios.
1. Crear un proyecto de Maven
Cree un proyecto de Maven llamado nacos-service-provider.
2. Agregar dependencias
Agregue lo siguiente al archivo pom.xml. Este ejemplo usa Spring Boot 2.1.4.RELEASE con Spring Cloud Greenwich.SR1.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- Nacos service discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
La versión de Spring Cloud Alibaba debe coincidir con la versión de Spring Cloud:
|
Versión de Spring Cloud |
Versión de Spring Cloud Alibaba |
Estado |
|
Greenwich |
2.1.1.RELEASE |
Activa |
|
Finchley |
2.0.1.RELEASE |
Activa |
|
Edgware |
1.5.1.RELEASE |
Descontinuada |
Spring Cloud Edgware está descontinuada. No la utilice para aplicaciones nuevas.
3. Crear la clase de la aplicación
Cree un paquete llamado com.aliware.edas dentro de src/main/java. Agregue la siguiente clase llamada ProviderApplication.
La anotación @EnableDiscoveryClient habilita el registro y el descubrimiento de servicios.
package com.aliware.edas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4. Crear un controlador REST
En el mismo paquete com.aliware.edas, cree una clase llamada EchoController que asigne las solicitudes GET a /echo/{string} y devuelva la variable de ruta.
package com.aliware.edas;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return string;
}
}
5. Configurar el endpoint del registro de Nacos
Cree un archivo llamado application.properties dentro de src/main/resources:
spring.application.name=service-provider
server.port=18081
spring.cloud.nacos.discovery.server-addr=mse.XX.nacos.mse.aliyuncs.com:8848
# To use a custom namespace, uncomment the following line:
# spring.cloud.nacos.discovery.namespace=<namespace-id>
Reemplace mse.XX.nacos.mse.aliyuncs.com con el endpoint público de su instancia de MSE Nacos. Para encontrar este valor, abra la consola de MSE, vaya a Microservices Registry > Instances y ubique el endpoint en la página de detalles de la instancia.
Si utiliza un registro de MSE ZooKeeper o Eureka en lugar de Nacos, ajuste la configuración del registro según corresponda. Consulte Usage notes.
6. Comprobar el registro del proveedor
Ejecute el método
mainde ProviderApplication para iniciar el proveedor.Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, elija Microservices Registry > Instances. Haga clic en el nombre de la instancia.
Elija Service Management > Services.
En la página Services, confirme que
service-provideraparece en la lista.
Paso 2: Compilar el consumidor
Cree una aplicación de Spring Cloud que llame al proveedor mediante RestTemplate y FeignClient, y que se registre en el mismo registro de MSE Nacos.
1. Crear un proyecto de Maven
Cree un proyecto de Maven llamado nacos-service-consumer.
2. Agregar dependencias
Agregue lo siguiente al archivo pom.xml. En comparación con el proveedor, el consumidor agrega spring-cloud-starter-openfeign para realizar llamadas REST declarativas.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- Nacos service discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Declarative REST client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3. Crear la interfaz de FeignClient
Cree un paquete llamado com.aliware.edas dentro de src/main/java. Agregue una interfaz llamada EchoService con la anotación @FeignClient que apunte a service-provider.
package com.aliware.edas;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "service-provider")
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
4. Crear la clase de la aplicación
En el mismo paquete, cree una clase llamada ConsumerApplication con las siguientes anotaciones:
@EnableDiscoveryClient: habilita el registro y el descubrimiento de servicios.@EnableFeignClients: habilita FeignClient.@LoadBalanceden el beanRestTemplate: integra RestTemplate con el descubrimiento de servicios para equilibrar la carga del lado del cliente.
package com.aliware.edas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
5. Crear un controlador de prueba
En el mismo paquete, cree una clase llamada TestController que exponga dos endpoints: uno con RestTemplate y otro con FeignClient. Esto le permitirá demostrar ambos métodos de descubrimiento de servicios.
package com.aliware.edas;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private EchoService echoService;
@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
public String rest(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str,
String.class);
}
@RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
public String feign(@PathVariable String str) {
return echoService.echo(str);
}
}
6. Configurar el endpoint del registro de Nacos
Cree un archivo llamado application.properties dentro de src/main/resources:
spring.application.name=service-consumer
server.port=18082
spring.cloud.nacos.discovery.server-addr=mse.XX.nacos.mse.aliyuncs.com:8848
# To use a custom namespace, uncomment the following line:
# spring.cloud.nacos.discovery.namespace=<namespace-id>
Reemplace mse.XX.nacos.mse.aliyuncs.com con el endpoint público de su instancia de MSE Nacos, tal como se describe en el subpaso 5 del paso 1.
Si utiliza un registro de MSE ZooKeeper o Eureka en lugar de Nacos, ajuste la configuración del registro según corresponda. Consulte Usage notes.
7. Comprobar el registro del consumidor
Ejecute el método
mainde ConsumerApplication para iniciar el consumidor.Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, elija Microservices Registry > Instances. Haga clic en el nombre de la instancia.
Elija Service Management > Services.
En la página Services, confirme que
service-consumeraparece en la lista.
Paso 3: Probar las llamadas de servicio
Con ambas aplicaciones en ejecución, compruebe que el consumidor puede descubrir y llamar al proveedor.
Linux, UNIX o macOS:
curl http://127.0.0.1:18082/echo-rest/rest-rest
curl http://127.0.0.1:18082/echo-feign/feign-rest
Windows: Abra un navegador y vaya a las siguientes URL:
http://127.0.0.1:18082/echo-rest/rest-resthttp://127.0.0.1:18082/echo-feign/feign-rest
Resultado esperado para el endpoint de RestTemplate:
rest-rest
Resultado esperado para el endpoint de FeignClient:
feign-rest
Si ambas respuestas coinciden, el consumidor descubrió y llamó al proveedor a través del registro de MSE Nacos.
Preguntas frecuentes
Los servicios no aparecen en la consola de MSE después del registro
De forma predeterminada, la lista blanca de direcciones IP públicas se establece en 127.0.0.1/32, lo cual bloquea todo el acceso externo. Agregue las direcciones IP públicas de sus máquinas proveedoras y consumidoras a la lista blanca. Consulte Configure a public IP address whitelist.
¿Qué versiones de Spring Cloud admite MSE?
|
Versión de Spring Cloud |
Versión de Spring Cloud Alibaba |
Estado |
|
Greenwich |
2.1.1.RELEASE |
Activa |
|
Finchley |
2.0.1.RELEASE |
Activa |
|
Edgware |
1.5.1.RELEASE |
Descontinuada |
Spring Cloud Edgware está descontinuada. No la utilice para aplicaciones nuevas.