Développez des applications RESTful dans le framework HSF et mettez en œuvre l'enregistrement et la découverte de services. Étant donné qu'SAE prend désormais en charge les applications Spring Cloud natives, cette méthode de développement n'est pas recommandée pour les nouveaux utilisateurs.
Informations contextuelles
Pour savoir comment développer des services à l'aide du framework Spring Cloud natif, consultez les rubriques et Héberger des applications Spring Cloud dans SAE.
Enregistrement et découverte de services
Cette section vous guide pas à pas dans le développement d'une application RESTful locale avec enregistrement et découverte de services.
Téléchargez le code source de démonstration :
-
Créez un fournisseur de services.
Ce fournisseur de services expose un service echo simple et s'enregistre auprès du registre de services.
Créez un projet d'application RESTful nommé sc-vip-server.
-
Ajoutez les dépendances requises au fichier 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 vous ne souhaitez pas définir le parent du projet sur
spring-boot-starter-parent, ajoutez une sectiondependencyManagementet définissezscope="import"pour gérer les dépendances.<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> -
Créez l'application fournisseur de services. Utilisez l'annotation @EnableDiscoveryClient pour activer l'enregistrement et la découverte de services.
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } -
Créez un EchoController pour fournir un service echo simple.
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } -
Dans le fichier application.properties situé dans le répertoire resources, configurez le nom de l'application et le port d'écoute.
spring.application.name=service-provider server.port=18081
-
Créez un consommateur de services.
Cet exemple crée un consommateur de services qui appelle le fournisseur de services à l'aide de RestTemplate, AsyncRestTemplate et FeignClient.
Créez un projet d'application RESTful nommé sc-vip-client.
-
Ajoutez les dépendances requises au fichier 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>Cet exemple utilise FeignClient à des fins de démonstration. Contrairement au fournisseur de services (sc-vip-server), le fichier pom.xml du consommateur inclut une dépendance supplémentaire
spring-cloud-starter-feign. -
Pour utiliser RestTemplate, AsyncRestTemplate et FeignClient, activez également l'enregistrement et la découverte de services (comme vous l'avez fait pour sc-vip-server) et ajoutez les deux configurations suivantes.
Ajoutez l'annotation @LoadBalanced pour intégrer RestTemplate et AsyncRestTemplate à la découverte de services.
-
Ajoutez l'annotation @EnableFeignClients pour activer 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(); } }
-
Avant d'utiliser FeignClient pour EchoService, configurez le nom du service et mappez la méthode à la requête HTTP correspondante. Dans le projet sc-vip-server, le nom du service est configuré comme service-provider.
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Créez un Controller pour tester les appels de service.
@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); } }Le code implémente trois endpoints pour les tests :
/echo-rest/: Vérifie l'appel au fournisseur de services à l'aide de RestTemplate./echo-async-rest/: Vérifie l'appel au fournisseur de services à l'aide d'AsyncRestTemplate./echo-feign/: Vérifie l'appel au fournisseur de services à l'aide de FeignClient.
-
Configurez le nom de l'application et le port d'écoute.
spring.application.name=service-consumer server.port=18082
-
Développez et déboguez localement.
-
Démarrez le centre de configuration léger.
Pour le développement et le débogage locaux, utilisez le centre de configuration léger. Il fournit une version légère du composant côté serveur d'enregistrement et de découverte de services utilisé par
EDAS
et
SAE
. Pour plus d'informations, consultez la rubrique
Démarrer le centre de configuration et d'enregistrement léger
.
-
Démarrez l'application.
-
Démarrage depuis un IDE
Pour démarrer l'application depuis votre IDE, ajoutez l'option VM
-Dvipserver.server.port=8080puis exécutez la méthode main. Remarque : Ce paramètre est requis uniquement pour le développement local avec le centre de configuration léger. Vous devez supprimer ce paramètre lorsque vous déployez l'application sur ou SAE. Sinon, l'application risque de ne pas pouvoir publier ou s'abonner aux services.Si le centre de configuration léger et votre application se trouvent sur des machines différentes, configurez les liaisons d'hôte. Pour plus d'informations, consultez la rubrique Démarrer le centre de configuration et d'enregistrement léger.
-
Démarrage depuis un FatJar
-
Ajoutez le plug-in d'emballage FatJar.
Pour empaqueter le projet pandora-boot dans un FatJar à l'aide de Maven, ajoutez le plug-in suivant à votre fichier pom.xml. Pour éviter les conflits, n'ajoutez pas d'autres plug-ins FatJar à la section <plugins> de la configuration de build.
<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> Après avoir ajouté le plug-in, exécutez la commande
mvn clean packagedans le répertoire racine du projet. Le fichier FatJar est généré dans le répertoiretarget.-
Démarrez l'application à l'aide d'une commande 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.jarRemarqueLe chemin spécifié par
-Dpandora.location
doit être un chemin absolu et doit être placé avant l'argument
-jar
.
-
Démarrez les services et appelez les endpoints. La sortie indique que tous les appels ont réussi.
→ ~ 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% -
-
-
Résolvez les problèmes courants.
-
AsyncRestTemplate ne peut pas se connecter à la découverte de services.
La prise en charge de la découverte de services via AsyncRestTemplate a été ajoutée dans Spring Cloud Dalston. Vous devez utiliser cette version ou une version ultérieure. Pour plus d'informations, consultez cette demande de fusion (pull request).
-
Conflits avec le plug-in d'emballage FatJar.
Pour éviter les conflits, n'ajoutez pas d'autres plug-ins FatJar à la section <plugins> de la configuration de build.
-
Puis-je inclure taobao-hsf.sar dans le package ?
Oui, mais cela n'est pas recommandé.
Vous pouvez modifier la configuration de pandora-boot-maven-plugin en définissant
excludeSar
sur
false
. Cela inclut automatiquement taobao-hsf.sar dans le package.
<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 cette manière, vous pouvez démarrer l'application sans configurer l'emplacement de Pandora.
java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jarAvant de déployer l'application sur ou SAE, restaurez la configuration par défaut pour exclure le package SAR.
-