Ok, vamos continuar falando sobre o ensaio do artigo anterior. No artigo anterior, mencionamos que, se queremos atualizar todas as configurações de microsserviço e atualizar a configuração sem reiniciar, só podemos confiar na configuração da Spring Cloud. No entanto, precisamos enviar solicitações de postagem de um serviço para outro.
Podemos suportar isso? Isso é muito melhor do que a falta anterior de centro de configuração. Então, como podemos continuar evitando enviar solicitações de postagem ao Serviço um por um para informar o Serviço? Suas informações de configuração foram alteradas e você precisa modificar as informações de configuração na memória no tempo.
No momento, não devemos esquecer o modelo de assinatura de publicação da fila de mensagens. Todos os serviços assinam este evento. Quando este evento muda, todos os microsserviços podem ser notificados para atualizar suas informações de configuração de memória. Neste momento, o barramento de mensagens de ônibus pode resolvê -lo. Você só precisa emitir uma atualização no lado do servidor de configuração SpringCloud para acionar todas as atualizações do microsserviço.
Conforme mostrado no seguinte diagrama arquitetônico:
Além de suportar a configuração automatizada do RabbitMQ, o Spring Cloud Bus também suporta Kafka, que agora é amplamente utilizado. Neste artigo, construiremos um ambiente local Kafka e o usaremos para tentar usar o Spring Cloud Bus para oferecer suporte a Kafka para implementar a função do barramento de mensagens.
O KAFKA é implementado usando o Scala e é usado como um pipeline para o streaming ativo e o processamento de dados operacionais do LinkedIn e agora é amplamente usado por muitas empresas de Internet como um pipeline de transmissão de dados e sistemas de mensagens.
O diagrama de arquitetura Kafak é o seguinte:
Kafka é um sistema de mensagens implementado com base no modo de publicação/assinatura de mensagens. Seus principais objetivos de design são os seguintes:
1. Persistência da mensagem: Forneça a capacidade de persistência da mensagem em uma complexidade do tempo o (1), e até os dados acima do nível da TB podem garantir o desempenho do acesso com a complexidade do tempo constante.
2. Alta taxa de transferência: também pode suportar a taxa de transferência de mais de 100k por segundo em máquinas comerciais baratas
3. Distribuído: Suporte Mensagens Partindo e consumo distribuído e garantir a ordem da mensagem dentro da partição
4. Plataforma cruzada: suporta clientes com diferentes plataformas técnicas (como: java, php, python, etc.)
5. Em tempo real: suporta o processamento de dados em tempo real e o processamento de dados offline
6. Escalabilidade: Suporte a expansão horizontal
Alguns conceitos básicos envolvidos em Kafka:
1.Broker: Um cluster Kafka contém um ou mais servidores, que são chamados de corretores.
2.Tópico: logicamente semelhante à fila da fila do Rabbit, cada mensagem postada no cluster Kafka deve ter um tópico. (Mensagens com tópicos diferentes são armazenadas separadamente. Embora a mensagem lógica de um tópico seja armazenada em um ou mais corretores, o usuário precisa apenas especificar o tópico da mensagem para produzir ou consumir dados sem se preocupar sobre onde os dados são armazenados)
3. Partição: Partição é uma partição no conceito físico. Para fornecer a taxa de transferência do sistema, cada tópico será fisicamente dividido em uma ou mais partições e cada partição corresponde a uma pasta (armazenando o conteúdo da mensagem e o arquivo de índice da partição correspondente).
4.Produtor: produtor de mensagens, responsável por produzir mensagens e enviá -las para o corretor Kafka.
5.Consumer: Consumidor de mensagens, cliente que lê mensagens para o corretor da Kafka e as processa.
6. Grupo de consumidores: Cada consumidor pertence a um grupo específico (cada consumidor pode ser especificado como um grupo e, se não for especificado, pertence ao grupo padrão). O grupo pode ser usado para implementar funções, como uma mensagem consumida por vários membros do grupo.
Você pode ver no diagrama de arquitetura Kafka que Kafka requer suporte ao Zookeeper. Você precisa especificar onde o Zookeeper está na sua configuração Kafka. Garante alguma confiabilidade através do Zookeeper e é o mestre e escravo do corretor. Também precisamos saber que as mensagens Kafka estão organizadas em forma de tópico. Os produtores enviam mensagens de formulário de tópico, e os consumidores são divididos de acordo com os grupos, para que um grupo de consumidores precisará de mensagens de formulário de tópico. No lado do servidor, ele também produz alguns fragmentos, para que um tópico possa ser distribuído em diferentes fragmentos, o que nos facilita a expandir e implantar várias máquinas. Kafka é naturalmente distribuído. Para demonstração aqui, precisamos usar sua configuração padrão e fazer uma pequena demonstração no Windows.
Nós nos concentramos principalmente no suporte do Spring Cloud Bus para Kafka, que implementa a função do barramento de mensagens. Para filas específicas de mensagens Kafka e RabbitMQ, esperamos encontrar informações para aprender sozinho. Com algum suporte conceitual, fazemos algumas demos.
Como segue: Primeiro, crie um novo módulo SpringCloud-Config-Client1 para facilitar nossos testes. As dependências introduzidas são as seguintes:
<Depencency> <PuerpId> org.springframework.boot </frugiD> <ArtifactId> Spring-boot-starter-actuator </stutifactId> </dependency> <pendence> <ouprougid> org.springframework.boot </grupo> <TifactId> </spring-boot starter-web-webweb </groupid> <tifactid> spring-boot Starterf-webeb- art. <roupidId> org.springframework.cloud </frupiD> <ArtifactId> Spring-Cloud-Starter-Config </ArtifactId> <Versão> 1.4.0.release </sipers> </pendence> <spendency> <voundid> org.springframework.cloud </groupid> <Artiftid> primavera> primavera> primavera de primavera> primavera de primavera </springlid> <roundid> org.springframework.cloud </groupid> <stroftid> primavera> primavera> primavera> primavera <roundId> org.springframework.cloud </groupid> <stringflwld> springld> primavera> primavera> primavera <rutfloud> springring. <Versão> 1.3.5.Release </sisters> </dependency> <pendency> <puperid> org.springframework.cloud </groupiD> <TRATIFACTID> Spring-Cloud-Starter-Bus-Kafka </ArtifactId> <Versão> 1.3.2.release </sipers> </pendence>
Em seguida, observe que o arquivo de configuração do Client1 deve ser alterado para bootstrap.yml, porque esse formato de configuração é preferido. Como mencionado no ensaio anterior, a configuração do Client1 é a seguinte:
Servidor: Porta: 7006Spring: Aplicativo: Nome: Cloud-Config Cloud: Config:#O ambiente é usado para iniciar? Dev representa o ambiente de desenvolvimento. Isso está relacionado ao sufixo do arquivo em seu armazém. Por exemplo, o formato de nomenclatura do arquivo de configuração do armazém é Cloud-Config-dev.properties, portanto o perfil deve ser escrito Profile de Dev: Dev Discovery: Habiled: true# Este nome é o nome do serviço do lado do servidor de configuração e você não pode escrevê-lo cegamente. Serviço-Id: Config-Server#Centro de registro Eureka: Cliente: Serviço-URL: DefaultZone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/#A permissão precisa ser puxada? O padrão é verdadeiro. Se você não for falso, não poderá puxar o conteúdo atualizado pelo gerenciamento do servidor do Centro de Configuração: Segurança: Ativado: Falso
Em seguida, inicie a aula da seguinte maneira:
@SpringboOTApplication@EnablediscoveryclientPublic Class Client1Application {public static void main (String [] args) {springApplication.run (client1Application.class, args); }}Em seguida, atribua uma cópia do testController no cliente ao cliente1, o código é o seguinte:
@RestController // As propriedades aqui podem ser atualizadas. Se o centro de configuração no GIT mudar, ele deverá ser atualizado. Sem essa anotação, a configuração não pode ser atualizada no time @RefreshScopeppublic Classe testController {@Value ("$ {name}") Nome da string privada; @Value ("$ {Age}") Idade do número inteiro privado; @RequestMapping ("/test") public String test () {return this.name+this.age; }}Em seguida, adicione a seguinte configuração ao servidor de configuração no módulo no ensaio anterior:
#Se a permissão é necessária para puxar, o padrão é verdadeiro. Se você não for falso, não poderá puxar o conteúdo atualizado pelo gerenciamento do servidor do Centro de Configuração: Segurança: Ativado: Falso
Em seguida, precisamos fazer uma coisa: Config-Client, Config-Client1 e Config-Server devem introduzir dependências Kafka, como segue:
<Depencency> <PuerpId> org.springframework.cloud </frugiD> <TRATIFACTID> Spring-cloud-starter-bus-kafka </stifactId> <versão> 1.3.2.Release </sipers> </dependency>
Nosso projeto está pronto, então o colocaremos aqui por enquanto. Vamos instalar e baixar o kafka abaixo. Primeiro, vamos ao site oficial da Kafka kafka.apache.org/downloads para ir à versão recomendada no site oficial.
Primeiro, entramos no diretório Kafka baixado e editamos Kafka-Run-Class.bat sob kafka_2.11-1.1.0/bin/windows da seguinte forma:
Encontre esta configuração da seguinte maneira:
Copie o código da seguinte forma: Set Command =%Java%KAFKA_HEAP_OPTS%KAFKA_JVM_PERFORMAFEM_OPTS%KAFKA_JMX_OPTS%KAFKA_LOG4J_OPTS%-CP%CLASSPATH%KAFKA_OPTS%**
Você pode ver que % ClassPath % não tem cotações duplas.
Portanto, inclua -o em cotações duplas, caso contrário, ele não poderá ser iniciado. É relatado que seu JDK não está instalado corretamente. Após a modificação, é a seguinte:
Copie o código da seguinte forma: Set Command =%Java%KAFKA_HEAP_OPTS%KAFKA_JVM_PERFORMAFEM_OPTS%KAFKA_JMX_OPTS%KAFKA_LOG4J_OPTS%-CP "%ClassPath%"%KAFKA_OPTS%**
Em seguida, abra o servidor.properties na pasta de configuração e configure -a da seguinte forma:
Você pode ver que está conectado ao Zookeeper local.
Então começamos o Zookeeper primeiro, e depois Kafka, como segue:
Quando você vê as informações acima, isso prova que a startup do Zookeeper é bem -sucedida. , Assim,
Em seguida, comece Kafka com outro CMD, como segue:
Ver essa informação significa que Kafka foi lançado com sucesso
OK, vamos iniciar o projeto anterior, dois centros de registro, um servidor SpringCloud-Config, dois SpringCloud-Config-Client e SpringCloud-Config-Client1.
Você pode ver que Springcloudbus está no 0 Shard. Se as informações acima aparecerem nos dois config-clients, isso prova que a startup será bem-sucedida.
Ok, agora vamos acessar o lado do servidor de configuração, como segue:
Visite mais dois clientes, como segue:
Ok, o show começou. Agora vamos ao repositório Git para modificar o arquivo do centro de configuração e alterar a idade para 24, como segue:
Em seguida, usamos a atualização para atualizar a configuração do servidor de configuração e notificar os dois clientes para atualizar as informações de configuração na memória. Use Postman para enviar localhost: 7000/ônibus/atualização, como segue:
Você pode ver que nenhuma informação é retornada, mas não se preocupe, esta é uma notificação bem -sucedida a todos os clientes para atualizar as informações na memória.
Em seguida, re-requestamos a configuração do servidor e dois clientes para atualizar a página, e o resultado é o seguinte:
Os dois clientes são os seguintes:
Você pode ver que todos os clientes atualizam automaticamente as informações de configuração na memória.
Até agora, o exposto acima atualizou as informações de configuração. Também está ok se queremos atualizar as informações de configuração de um serviço específico. Podemos especificar o intervalo de atualização da seguinte forma:
Especifique a faixa de atualização
No exemplo acima, acionamos /refresh para outras instâncias de serviço no barramento solicitando a interface Spring Cloud Bus /bus/refresh na instância de serviço. No entanto, em alguns cenários especiais (como o lançamento em escala de cinza), esperamos atualizar a configuração de uma instância específica no microsserviço.
O Spring Cloud Bus também possui um bom suporte para esse cenário: /bus/refresh também fornece parâmetros destination para localizar o aplicativo específico para atualizar. Por exemplo, podemos solicitar /bus/refresh?destination=服务名字:9000 . No momento, cada instância do aplicativo no barramento determinará se é seu próprio nome de instância com base no valor do atributo destination .
Se a configuração for atendida, a configuração será atualizada. Se a configuração não corresponder, a mensagem será ignorada.
Além de posicionar casos específicos, os parâmetros destination também podem ser usados para posicionar serviços específicos. O princípio dos Serviços de Posicionamento é implementado usando o PathMatecher da Spring, por exemplo: /bus/refresh?destination=customers:** , que acionará todas as instâncias do Serviço customers para atualizar.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.