Usando um iniciador de aplicativos Spring Cloud
1. Introdução
Neste artigo, demonstraremos como usar os iniciadores do Spring Cloud App - que fornecem aplicativos inicializados e prontos para uso - que podem servir como pontos de partida para desenvolvimento futuro.
Simplificando, os Task App Starters são dedicados a casos de uso como migração de banco de dados e testes distribuídos, e o Stream App Starters fornece integrações com sistemas externos.
No geral, são mais de 55 entradas; verifique a documentação oficialhereehere para obter mais informações sobre esses dois.
A seguir, construiremos um pequeno aplicativo Twitter distribuído que transmitirá postagens do Twitter em um Sistema de Arquivos Distribuídos Hadoop.
2. Obtendo a instalação
Usaremosconsumer-keyeaccess-token para criar um aplicativo simples do Twitter.
Em seguida, configuraremos o Hadoop para que possamos manter nosso fluxo do Twitter para fins futuros de Big Data.
Por último, temos a opção de usar os repositórios Spring GitHub fornecidos para compilar e montar componentes independentes do padrão de arquiteturasources -processors-sinks usando Maven ou combinarsources,processors esinks por meio de suas interfaces de ligação Spring Stream.
Vamos dar uma olhada nas duas maneiras de fazer isso.
É importante notar que, anteriormente, todos os Stream App Starters eram agrupados em um grande repo emgithub.com/spring-cloud/spring-cloud-stream-app-starters. Cada Starter foi simplificado e isolado.
3. Credenciais do Twitter
Primeiro, vamos configurar nossas credenciais de desenvolvedor do Twitter. Para obter as credenciais de desenvolvedor do Twitter, siga as etapas para configurar um aplicativo e criar um token de acessofrom the official Twitter developer documentation.
Especificamente, precisaremos de:
-
Chave do consumidor
-
Segredo da chave do consumidor
-
Segredo do token de acesso
-
Token de acesso
Certifique-se de manter a janela aberta ou anote-as, pois as usaremos abaixo!
4. Instalando o Hadoop
Em seguida, vamos instalar o Hadoop! Podemos seguirthe official documentation ou simplesmente aproveitar o Docker:
$ sudo docker run -p 50070:50070 sequenceiq/hadoop-docker:2.4.1
5. Compilando nossas iniciantes de aplicativos
Para usar componentes independentes e totalmente independentes, podemos fazer o download e compilar os Iniciantes de aplicativos Spring Cloud Stream desejados individualmente a partir de seus repositórios GitHub.
5.1. Twitter Spring Cloud Stream para iniciantes do aplicativo
Vamos adicionar o Twitter Spring Cloud Stream App Starter (org.springframework.cloud.stream.app.twitterstream.source) ao nosso projeto:
git clone https://github.com/spring-cloud-stream-app-starters/twitter.git
Então, rodamos o Maven:
./mvnw clean install -PgenerateApps
O Starter App compilado resultante estará disponível em ‘/ target 'da raiz do projeto local.
Em seguida, podemos executar o arquivo .jar compilado e transmitir as propriedades relevantes do aplicativo, como:
java -jar twitter_stream_source.jar --consumerKey= --consumerSecret= \
--accessToken= --accessTokenSecret=
Também podemos passar nossas credenciais usando o familiar Springapplication.properties:
twitter.credentials.access-token=...
twitter.credentials.access-token-secret=...
twitter.credentials.consumer-key=...
twitter.credentials.consumer-secret=...
5.2. HDFS Spring Cloud Stream para iniciantes
Agora (com o Hadoop já configurado), vamos adicionar a dependência HDFS Spring Cloud Stream App Starter (org.springframework.cloud.stream.app.hdfs.sink) ao nosso projeto.
Primeiro, clone o repositório relevante:
git clone https://github.com/spring-cloud-stream-app-starters/hdfs.git
Em seguida, execute o trabalho Maven:
./mvnw clean install -PgenerateApps
O Starter App compilado resultante estará disponível em ‘/ target 'da raiz do projeto local. Podemos então executar esse arquivo .jar compilado e transmitir as propriedades relevantes do aplicativo:
java -jar hdfs-sink.jar --fsUri=hdfs://127.0.0.1:50010/
‘hdfs://127.0.0.1:50010/’ é o padrão para Hadoop, mas sua porta HDFS padrão pode variar dependendo de como você configurou sua instância.
Podemos ver a lista de nós de dados (e suas portas atuais) em ‘http://0.0.0.0:50070’ dada a configuração que passamos anteriormente.
Também podemos passar nossas credenciais usando o familiar Springapplication.properties antes da compilação - portanto, não precisamos sempre passá-las via CLI.
Vamos configurar nossoapplication.properties para usar a porta Hadoop padrão:
hdfs.fs-uri=hdfs://127.0.0.1:50010/
6. UsandoAggregateApplicationBuilder
Como alternativa, podemos combinar nosso Spring StreamSourceeSink por meio deorg.springframework.cloud.stream.aggregate.AggregateApplicationBuilder em um aplicativo Spring Boot simples!
Primeiro, vamos adicionar os dois Stream App Starters ao nossopom.xml:
org.springframework.cloud.stream.app
spring-cloud-starter-stream-source-twitterstream
1.3.1.BUILD-SNAPSHOT
org.springframework.cloud.stream.app
spring-cloud-starter-stream-sink-hdfs
1.3.1.BUILD-SNAPSHOT
Em seguida, começaremos a combinar nossas duas dependências do Stream App Starter envolvendo-as em seus respectivos subaplicativos.
6.1. Construindo nossos componentes de aplicativo
NossoSourceApp especifica oSource a ser transformado ou consumido:
@SpringBootApplication
@EnableBinding(Source.class)
@Import(TwitterstreamSourceConfiguration.class)
public class SourceApp {
@InboundChannelAdapter(Source.OUTPUT)
public String timerMessageSource() {
return new SimpleDateFormat().format(new Date());
}
}
Observe que associamos nossoSourceApp aorg.springframework.cloud.stream.messaging.Sourcee injetamos a classe de configuração apropriada para obter as configurações necessárias de nossas propriedades ambientais.
Em seguida, configuramos uma ligaçãoorg.springframework.cloud.stream.messaging.Processor simples:
@SpringBootApplication
@EnableBinding(Processor.class)
public class ProcessorApp {
@Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
public String processMessage(String payload) {
log.info("Payload received!");
return payload;
}
}
Em seguida, criamos nosso consumidor (Sink):
@SpringBootApplication
@EnableBinding(Sink.class)
@Import(HdfsSinkConfiguration.class)
public class SinkApp {
@ServiceActivator(inputChannel= Sink.INPUT)
public void loggerSink(Object payload) {
log.info("Received: " + payload);
}
}
Aqui, vinculamos nossoSinkApp aorg.springframework.cloud.stream.messaging.Sinke injetamos novamente a classe de configuração correta para usar nossas configurações Hadoop especificadas.
Por último, combinamos nossoSourceApp,ProcessorApp e nossoSinkApp usandoAggregateApplicationBuilder em nosso método principalAggregateApp:
@SpringBootApplication
public class AggregateApp {
public static void main(String[] args) {
new AggregateApplicationBuilder()
.from(SourceApp.class).args("--fixedDelay=5000")
.via(ProcessorApp.class)
.to(SinkApp.class).args("--debug=true")
.run(args);
}
}
Como acontece com qualquer aplicativo Spring Boot, podemos injetar configurações especificadas como propriedades ambientais por meio deapplication.properties or programaticamente.
Como estamos usando a estrutura Spring Stream, também podemos passar nossos argumentos para o construtorAggregateApplicationBuilder.
6.2. Executando o aplicativo concluído
Podemos então compilar e executar nosso aplicativo usando as seguintes instruções de linha de comando:
$ mvn install
$ java -jar twitterhdfs.jar
Lembre-se de manter cada classe@SpringBootApplication em um pacote separado (caso contrário, várias exceções de ligação diferentes serão lançadas)! Para obter mais informações sobre como usarAggregateApplicationBuilder - dê uma olhada emofficial docs.
Depois de compilar e executar nosso aplicativo, veremos algo como o seguinte em nosso console (naturalmente o conteúdo varia de acordo com o Tweet):
2018-01-15 04:38:32.255 INFO 28778 --- [itterSource-1-1]
c.b.twitterhdfs.processor.ProcessorApp : Payload received!
2018-01-15 04:38:32.255 INFO 28778 --- [itterSource-1-1]
com.example.twitterhdfs.sink.SinkApp : Received: {"created_at":
"Mon Jan 15 04:38:32 +0000 2018","id":952761898239385601,"id_str":
"952761898239385601","text":"RT @mighty_jimin: 180114 ...
Esses demonstram a operação correta de nossosProcessoreSink ao receber dados deSource! Neste exemplo, não configuramos nosso coletor HDFS para fazer muito - ele simplesmente imprimirá a mensagem “Payload recebido!”
7. Conclusão
Neste tutorial, aprendemos como combinar dois incríveis Spring Stream App Starters em um exemplo de Spring Boot!
Aqui estão alguns outros excelentes artigos oficiais sobreSpring Boot Starters e como criar umcustomized starter!
Como sempre, o código usado no artigo pode ser encontradoover on GitHub.