Desarrolle aplicaciones RESTful en el framework HSF e implemente el registro y descubrimiento de servicios. Dado que SAE ahora admite aplicaciones nativas de Spring Cloud, este método de desarrollo no se recomienda para nuevos usuarios.
Contexto
Para aprender a desarrollar servicios con el framework nativo de Spring Cloud, consulte y Host Spring Cloud applications in SAE.
Registro y descubrimiento de servicios
Esta sección le guía en el desarrollo de una aplicación RESTful local con registro y descubrimiento de servicios.
Descargue el código fuente de la demostración:
-
Cree un proveedor de servicios.
Este proveedor de servicios expone un servicio echo simple y se registra en el registro de servicios.
Cree un proyecto de aplicación RESTful llamado sc-vip-server.
-
Agregue las dependencias obligatorias al archivo pom.xml.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>Si no desea establecer el padre del proyecto como
spring-boot-starter-parent, puede agregar una seccióndependencyManagementy configurarscope="import"para gestionar las dependencias.<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> -
Cree la aplicación proveedora de servicios. Utilice la anotación @EnableDiscoveryClient para habilitar el registro y descubrimiento de servicios.
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } -
Cree un EchoController para proporcionar un servicio echo simple.
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } -
En el archivo application.properties ubicado en el directorio resources, configure el nombre de la aplicación y el puerto de escucha.
spring.application.name=service-provider server.port=18081
-
Cree un consumidor de servicios.
Este ejemplo crea un consumidor de servicios que invoca al proveedor mediante RestTemplate, AsyncRestTemplate y FeignClient.
Cree un proyecto de aplicación RESTful llamado sc-vip-client.
-
Agregue las dependencias obligatorias al archivo pom.xml.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>Este ejemplo utiliza FeignClient para la demostración. A diferencia del proveedor de servicios (sc-vip-server), el archivo pom.xml del consumidor incluye una dependencia adicional de
spring-cloud-starter-feign. -
Para usar RestTemplate, AsyncRestTemplate y FeignClient, también debe habilitar el registro y descubrimiento de servicios (como hizo para sc-vip-server) y agregar las siguientes dos configuraciones.
Agregue la anotación @LoadBalanced para integrar RestTemplate y AsyncRestTemplate con el descubrimiento de servicios.
-
Agregue la anotación @EnableFeignClients para activar FeignClient.
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @LoadBalanced @Bean public AsyncRestTemplate asyncRestTemplate(){ return new AsyncRestTemplate(); } public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ConsumerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } }
-
Antes de utilizar FeignClient para EchoService, debe configurar el nombre del servicio y asignar el método a la solicitud HTTP correspondiente. En el proyecto sc-vip-server, el nombre del servicio se configura como service-provider.
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Cree un Controller para probar las llamadas al servicio.
@RestController public class Controller { @Autowired private RestTemplate restTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @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-async-rest/{str}", method = RequestMethod.GET) public String asyncRest(@PathVariable String str) throws Exception{ ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate. getForEntity("http://service-provider/echo/"+str, String.class); return future.get().getBody(); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }El código implementa tres endpoints para pruebas:
/echo-rest/: Verifica la llamada al proveedor de servicios mediante RestTemplate./echo-async-rest/: Verifica la llamada al proveedor de servicios mediante AsyncRestTemplate./echo-feign/: Verifica la llamada al proveedor de servicios mediante FeignClient.
-
Configure el nombre de la aplicación y el puerto de escucha.
spring.application.name=service-consumer server.port=18082
-
Desarrolle y depure localmente.
-
Inicie el centro de configuración ligero.
Para el desarrollo y la depuración locales, utilice el centro de configuración ligero. Este proporciona una versión ligera del componente de registro y descubrimiento de servicios del lado del servidor que utilizan
EDAS
y
SAE
. Para obtener más información, consulte
Start the lightweight configuration and registration center
.
-
Inicie la aplicación.
-
Inicio desde un IDE
Para iniciar la aplicación desde su IDE, agregue la opción de VM
-Dvipserver.server.port=8080y luego ejecute el método main. Nota: Este parámetro es obligatorio solo para el desarrollo local con el centro de configuración ligero. Debe eliminar este parámetro cuando despliegue la aplicación en o SAE. De lo contrario, la aplicación podría fallar al publicar o suscribirse a servicios.Si el centro de configuración ligero y su aplicación están en máquinas diferentes, configure los enlaces de host. Para obtener más información, consulte Start the lightweight configuration and registration center.
-
Inicio desde un FatJar
-
Agregue el plugin de empaquetado FatJar.
Para empaquetar el proyecto pandora-boot en un FatJar mediante Maven, agregue el siguiente plugin a su archivo pom.xml. Para evitar conflictos, no agregue otros plugins de FatJar a la sección <plugins> de la configuración de compilación.
<build> <plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </build> Después de agregar el plugin, ejecute el comando
mvn clean packageen el directorio raíz del proyecto. El archivo FatJar se genera en el directoriotarget.-
Inicie la aplicación mediante un comando de Java.
java -Dvipserver.server.port=8080 -Dpandora.location=/Users/{$username}/.m2/repository/com/taobao/pandora/taobao-hsf.sar/dev-SNAPSHOT/taobao-hsf.sar-dev-SNAPSHOT.jar -jar sc-vip-server-0.0.1-SNAPSHOT.jarNotaLa ruta especificada por
-Dpandora.location
debe ser una ruta absoluta y debe colocarse antes del argumento
-jar
.
-
Inicie los servicios y llame a los endpoints. La salida muestra que todas las llamadas son exitosas.
→ ~ curl http://localhost:18082/echo-rest/rest-test rest-test% → ~ curl http://localhost:18082/echo-async-rest/async-rest-test async-rest-test% → ~ curl http://localhost:18082/echo-feign/feign-test feign-test% -
-
-
Resuelva problemas comunes.
-
AsyncRestTemplate no puede conectarse al descubrimiento de servicios.
La compatibilidad con el descubrimiento de servicios mediante AsyncRestTemplate se agregó en Spring Cloud Dalston. Debe utilizar esta versión o una posterior. Para obtener más información, consulte esta solicitud de extracción.
-
Conflictos con el plugin de empaquetado FatJar.
Para evitar conflictos, no agregue otros plugins de FatJar a la sección <plugins> de la configuración de compilación.
-
¿Puedo incluir taobao-hsf.sar en el paquete?
Sí, pero no se recomienda.
Puede modificar la configuración de pandora-boot-maven-plugin estableciendo
excludeSar
en
false
. Esto incluye automáticamente taobao-hsf.sar en el paquete.
<plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <configuration> <excludeSar>false</excludeSar> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>De esta manera, puede iniciar la aplicación sin configurar la ubicación de Pandora.
java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jarAntes de desplegar la aplicación en o SAE, restaure la configuración predeterminada para excluir el paquete SAR.
-