Desenvolva aplicações RESTful no framework HSF e implemente o registro e a descoberta de serviços. Como o e o SAE agora oferecem suporte nativo a aplicações Spring Cloud, este método de desenvolvimento não é recomendado para novos usuários.
Informações de contexto
Para saber como desenvolver serviços com o framework nativo do Spring Cloud, consulte e Hospedar aplicações Spring Cloud no SAE.
Registro e descoberta de serviços
Esta seção descreve o desenvolvimento de uma aplicação RESTful local com registro e descoberta de serviços.
Baixe o código-fonte de demonstração:
-
Crie um provedor de serviços.
Este provedor expõe um serviço echo simples e se registra no registro de serviços.
Crie um projeto de aplicação RESTful chamado sc-vip-server.
-
Adicione as dependências necessárias ao arquivo 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>Se não quiser definir o pai do projeto como
spring-boot-starter-parent, adicione uma seçãodependencyManagemente definascope="import"para gerenciar as dependências.<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> -
Crie a aplicação provedora de serviços. Use a anotação @EnableDiscoveryClient para ativar o registro e a descoberta de serviços.
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } -
Crie um EchoController para fornecer um serviço echo simples.
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } -
No arquivo application.properties, localizado no diretório resources, configure o nome da aplicação e a porta de escuta.
spring.application.name=service-provider server.port=18081
-
Crie um consumidor de serviços.
Este exemplo cria um consumidor de serviços que chama o provedor usando RestTemplate, AsyncRestTemplate e FeignClient.
Crie um projeto de aplicação RESTful chamado sc-vip-client.
-
Adicione as dependências necessárias ao arquivo 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 exemplo usa FeignClient para demonstração. Diferentemente do provedor de serviços (sc-vip-server), o arquivo pom.xml do consumidor inclui a dependência adicional
spring-cloud-starter-feign. -
Para usar RestTemplate, AsyncRestTemplate e FeignClient, ative também o registro e a descoberta de serviços (como feito no sc-vip-server) e adicione as duas configurações a seguir.
Adicione a anotação @LoadBalanced para integrar RestTemplate e AsyncRestTemplate à descoberta de serviços.
-
Adicione a anotação @EnableFeignClients para ativar o 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 usar o FeignClient para o EchoService, configure o nome do serviço e mapeie o método para a requisição HTTP correspondente. No projeto sc-vip-server, o nome do serviço está configurado como service-provider.
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Crie um Controller para testar as chamadas de serviço.
@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); } }O código implementa três endpoints para teste:
/echo-rest/: Verifica a chamada ao provedor de serviços usando RestTemplate./echo-async-rest/: Valida a chamada ao provedor de serviços usando AsyncRestTemplate./echo-feign/: Confirma a chamada ao provedor de serviços usando FeignClient.
-
Configure o nome da aplicação e a porta de escuta.
spring.application.name=service-consumer server.port=18082
-
Desenvolva e depure localmente.
-
Inicie o centro de configuração leve.
Para desenvolvimento e depuração locais, use o centro de configuração leve. Ele fornece uma versão simplificada do componente de registro e descoberta de serviços do lado do servidor usado pelo
EDAS
e
SAE
. Para mais informações, consulte
Iniciar o centro de configuração e registro leve
.
-
Inicie a aplicação.
-
Iniciar a partir de uma IDE
Para iniciar a aplicação pela IDE, adicione a opção de VM
-Dvipserver.server.port=8080e execute o método main. Nota: Este parâmetro é necessário apenas para desenvolvimento local com o centro de configuração leve. Remova-o ao implantar a aplicação no ou SAE. Caso contrário, a aplicação pode falhar ao publicar ou assinar serviços.Se o centro de configuração leve e sua aplicação estiverem em máquinas diferentes, configure os bindings de host. Para mais informações, consulte Iniciar o centro de configuração e registro leve.
-
Iniciar a partir de um FatJar
-
Adicione o plug-in de empacotamento FatJar.
Para empacotar o projeto pandora-boot em um FatJar usando Maven, adicione o seguinte plug-in ao seu arquivo pom.xml. Para evitar conflitos, não adicione outros plug-ins de FatJar na seção <plugins> da configuração 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> Após adicionar o plug-in, execute o comando
mvn clean packageno diretório raiz do projeto. O arquivo FatJar será gerado no diretóriotarget.-
Inicie a aplicação com um comando 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.jarNotaO caminho especificado por
-Dpandora.location
deve ser absoluto e posicionado antes do argumento
-jar
.
-
Inicie os serviços e chame os endpoints. A saída mostra que todas as chamadas foram bem-sucedidas.
→ ~ 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% -
-
-
Solucione problemas comuns.
-
O AsyncRestTemplate não consegue se conectar à descoberta de serviços.
O suporte à descoberta de serviços via AsyncRestTemplate foi adicionado no Spring Cloud Dalston. Use esta versão ou superior. Para mais detalhes, consulte este pull request.
-
Conflitos com o plug-in de empacotamento FatJar.
Para evitar conflitos, não adicione outros plug-ins de FatJar na seção <plugins> da configuração de build.
-
Posso incluir o taobao-hsf.sar no pacote?
Sim, mas isso não é recomendado.
Modifique a configuração do pandora-boot-maven-plugin definindo
excludeSar
como
false
. Isso inclui automaticamente o taobao-hsf.sar no pacote.
<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>Assim, inicie a aplicação sem precisar configurar a localização do Pandora.
java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jarAntes de implantar a aplicação no ou SAE, restaure a configuração padrão para excluir o pacote SAR.
-
Rastreamento distribuído
Para habilitar o rastreamento distribuído, integre sua aplicação RESTful local ao EagleEye no EDAS com algumas pequenas modificações.
O EDAS fornece o componente EagleEye para rastreamento distribuído, reduzindo custos de desenvolvimento e aumentando a eficiência. Para utilizar esse recurso, basta configurar os pontos de rastreamento do EagleEye no código; o EDAS cuida da coleta, análise e armazenamento dos logs.
Baixe o código-fonte de demonstração: service1 e service2.
Integrate with EagleEye
-
Configure o endereço do repositório privado do EDAS no Maven.
Os pacotes do Pandora Boot Starter são publicados exclusivamente no repositório privado do EDAS. Portanto, configure esse repositório no arquivo settings.xml do Maven (para Maven 3.x ou posterior). Para mais informações, consulte
Configurar o endereço do repositório privado e o centro de configuração leve para EDAS e SAE
.
-
Modifique o código.
A integração de uma aplicação RESTful com o EagleEye no EDAS é simples. Siga estas três etapas:
-
Adicione as seguintes dependências ao seu arquivo pom.xml.
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eagleeye</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> -
Altere o método main.
Se o método main original for:
public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); }Modifique-o para:
public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } -
Adicione o plug-in de empacotamento FatJar.
Para empacotar o projeto pandora-boot em um FatJar usando Maven, adicione o seguinte plug-in ao seu arquivo pom.xml.
Para evitar conflitos, não adicione outros plug-ins de FatJar na seção <plugins> da configuração de build.
<build> <plugins> <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> </plugins> </build>Após concluir essas três modificações, use o recurso de rastreamento distribuído do EDAS diretamente, sem precisar configurar sistemas de coleta ou análise.
-
Distributed tracing example
Para demonstrar o uso do rastreamento distribuído, este exemplo utiliza duas aplicações de demonstração: service1 e service2.
O service1 atua como serviço de entrada e oferece três cenários de demonstração:
-
/rest/ok: Uma chamada normal

-
/rest/delay: Uma chamada com alta latência

-
/rest/error: Uma chamada que resulta em erro

-
Implante as aplicações.
Os recursos de coleta e análise do EagleEye são baseados no EDAS. Para visualizar os rastreamentos, implante primeiro as aplicações service1 e service2 no EDAS. Para mais informações, consulte os seguintes documentos:
-
Visualize os rastreamentos.
Após a implantação, chame os endpoints do service1 para gerar dados de rastreamento. Use um comando
curl
simples, como
curl http://{$ip:$port}/rest/ok
. Também é possível usar ferramentas como Postman ou fazer chamadas diretamente pelo navegador. Para gerar mais dados de observação, recomendamos o uso de um script para realizar múltiplas chamadas. Em seguida, siga estas etapas para visualizar o rastreamento:
Faça login no console do EDAS e acesse a aplicação recém-implantada.
No painel de navegação à esquerda da página de detalhes da aplicação, escolha .
Visualize as informações na página API Call.
-
Demonstração de rastreamento para outros clientes.
As URIs /echo-rest/{str}, /echo-async-rest/{str} e /echo-feign/{str} no service1 demonstram o suporte a rastreamento automático do EagleEye para RestTemplate, AsyncRestTemplate e FeignClient. Após chamar esses endpoints, visualize seus rastreamentos conforme descrito acima.
Tópicos relacionados
-
Suporte a rastreamento
O EagleEye no EDAS rastreia automaticamente requisições feitas por RestTemplate, AsyncRestTemplate e FeignClient. O suporte a rastreamento automático para mais componentes será adicionado futuramente.
-
AsyncRestTemplate
O AsyncRestTemplate requer modificações para suporte a rastreamento durante a fase de instanciação da classe. Portanto, para usar o recurso de rastreamento distribuído, injete o objeto
eagleEyeAsyncRestTemplatepelo nome. Esse objeto já vem com suporte à descoberta de serviços ativado por padrão.@Autowired private AsyncRestTemplate eagleEyeAsyncRestTemplate; -
Plug-in de empacotamento FatJar
Para empacotar um projeto pandora-boot em um FatJar usando Maven, adicione o pandora-boot-maven-plugin ao seu arquivo pom.xml. Para evitar conflitos, não adicione outros plug-ins de FatJar na seção <plugins> da configuração de build.