Dia 1 do microsserviço - introdução aos microsserviços

imagem-20230717095604286

imagem-20230717095712864


1. Entenda os microsserviços

1. Estrutura única

Todas as funções do negócio são desenvolvidas em um projeto e agrupadas em um único pacote para implantação.

vantagem

  • estrutura simples
  • Baixo custo de implantação

deficiência

  • Alto acoplamento

[Falha na transferência da imagem do link externo, o site de origem pode ter um mecanismo anti-leeching, é recomendável salvar a imagem e carregá-la diretamente (img-fPfsQXAn-1689593800699)(https://picture.wangkay.tech/blog/image-20230717100100447.png)]

2. Arquitetura distribuída

O sistema é dividido de acordo com as funções de negócios, e cada módulo de negócios é desenvolvido como um projeto independente, chamado de serviço

vantagem

  • reduza o acoplamento
  • Propicia a atualização e expansão do serviço

imagem-20230717100340895

3. Microsserviços

Microservice é uma solução de arquitetura distribuída com arquitetura bem projetada. Características da arquitetura de microservice:

  • Responsabilidade única: a granularidade da divisão do microsserviço é menor, cada serviço corresponde a uma capacidade de negócios única, de modo a alcançar uma única responsabilidade e evitar o desenvolvimento repetido de negócios
  • Orientado a serviços: os microsserviços expõem as interfaces de negócios para o mundo externo
  • Autonomia: equipe independente, tecnologia independente, dados independentes, implantação independente
  • Forte isolamento: as chamadas de serviço são isoladas, tolerantes a falhas e degradadas para evitar problemas em cascata

4. Estrutura de microsserviços

A solução de microsserviço requer uma estrutura técnica para implementá-la. Empresas de Internet em todo o mundo estão tentando ativamente sua própria tecnologia de implementação de microsserviço. Os mais conhecidos na China são SpringCloud e Dubbo do Alibaba.

5. Necessidades da empresa

imagem-20230717101205179

二、SpringCloud

  • O SpringCloud é atualmente a estrutura de microsserviço mais usada na China.
  • O SpringCloud integra vários componentes funcionais de microsserviços e realiza a montagem automática desses componentes com base no SpringBoot, proporcionando assim uma boa experiência pronta para uso:
    imagem-20230717101412724

1. Divisão de serviço

Considerações para Divisão de Serviço

  • Responsabilidade única: microsserviços diferentes, não desenvolver o mesmo negócio repetidamente
  • Independência de dados: Não acesse bancos de dados de outros microsserviços
  • Orientado a serviços: exponha seu negócio como uma interface para outros microsserviços chamarem

2. Chamada remota (consulte a função do pedido de acordo com o ID do pedido)

Requisito: Ao consultar o pedido de acordo com o ID do pedido, retorne as informações do usuário ao qual o pedido pertence

[Falha na transferência da imagem do link externo, o site de origem pode ter um mecanismo de link anti-roubo, é recomendável salvar a imagem e carregá-la diretamente (img-OxFyPehL-1689593800699)(https://picture.wangkay.tech/blog/image-20230717102926142.png)]

(1) Registrar RestTemplate

Registrar RestTemplate em OrderApplication of order-service

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderApplication.class, args);
    } 

    @Bean
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

(2) O serviço chama RestTemplate remotamente

Modifique o método queryOrderById de OrderService em order-service:

@Service
public class OrderService {
    
    
    
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
    
    
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // TODO 2.查询用户 
        String url = "http://localhost:8081/user/" +  order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user信息
        order.setUser(user);
        // 4.返回
        return order;
    }
}

(3) A maneira básica de chamar microsserviços

  • Realize chamada remota com base na solicitação http iniciada por RestTemplate
  • As chamadas remotas feitas por solicitações http são chamadas independentes de idioma, desde que você conheça o ip, a porta, o caminho da interface e os parâmetros de solicitação da outra parte.

(4) Relação de chamada de serviço

  1. Provedor de serviço: expõe a interface a outras chamadas de microsserviço
  2. Consumidores de serviço: interfaces de chamada fornecidas por outros microsserviços
  3. As funções de provedor e consumidor são realmente relativas
  4. Um serviço pode ser um provedor de serviços e um consumidor de serviços

3. Centro de Registro Eureka

1. Introdução ao Eureka

O Eureka é um componente de descoberta e registro de serviço de código aberto da Netflix e é uma das principais ferramentas para a construção de uma arquitetura de microsserviço em um sistema distribuído. O principal objetivo do registro Eureka é alcançar alta disponibilidade, descoberta dinâmica e balanceamento de carga entre os serviços.

Na arquitetura de microsserviços, o sistema é dividido em vários pequenos serviços, cada um dos quais é executado em um processo independente e coopera entre si para fornecer a funcionalidade geral do sistema. Esses serviços precisam ser capazes de se comunicar e descobrir em um ambiente distribuído, que é o que o registro Eureka faz.

O registro Eureka tem dois componentes principais:

  1. Eureka Server: É o núcleo do registro e roda em um ou mais servidores do cluster. Cada serviço (aplicativo de microsserviço) registrará suas próprias informações no Eureka Server, incluindo nome do serviço, endereço de rede, status de integridade, etc. O Eureka Server mantém um registro de serviço que registra todas as informações de serviço registradas.

  2. Eureka Client: É um aplicativo de microsserviço, como consumidor do serviço, ele se registrará no Eureka Server e enviará heartbeats periodicamente para indicar seu estado de saúde. Ao mesmo tempo, o Eureka Client também obterá o registro do serviço do Eureka Server e, quando precisar chamar outros serviços, obterá as informações do serviço correspondente do registro para realizar a comunicação entre os serviços.

O registro Eureka tem as seguintes características principais:

  1. Alta disponibilidade: O Eureka Server suporta a execução em um cluster para garantir a alta disponibilidade do centro de registro.Mesmo se um nó falhar, outros nós ainda podem fornecer registro de serviço e funções de descoberta.

  2. Descoberta dinâmica: O registro e a descoberta do serviço são dinâmicos.Quando um novo serviço fica online ou offline, o Eureka Server pode detectar e atualizar o registro a tempo, para que outros serviços possam obter dinamicamente as informações mais recentes do serviço.

  3. Balanceamento de carga: o Eureka Client pode implementar o balanceamento de carga de acordo com as informações do registro do serviço, de forma a distribuir as solicitações entre vários provedores de serviços disponíveis e melhorar a escalabilidade e o desempenho do sistema.

O registro Eureka desempenha um papel importante na arquitetura de microsserviços da Netflix e, devido à sua natureza de código aberto, muitas outras empresas e desenvolvedores também adotaram o Eureka como uma solução para registro e descoberta de serviços em seus projetos. Vale ressaltar que, embora o Eureka tenha sido amplamente utilizado no passado, no atual desenvolvimento tecnológico, outras soluções de registro com funções semelhantes também surgiram, como Consul, etcd, etc.

2. O papel de Eureka

  • Como os consumidores devem obter informações específicas sobre os prestadores de serviços?
    • O provedor de serviços registra suas próprias informações no eureka quando inicia
    • eureka salva esta informação
    • Os consumidores extraem informações do provedor do eureka de acordo com o nome do serviço
  • Se houver vários provedores de serviços, como os consumidores devem escolher?
    • O consumidor do serviço usa o algoritmo de balanceamento de carga para selecionar um serviço da lista de serviços
  • Como os consumidores percebem o estado de saúde dos prestadores de serviços?
    • O provedor de serviços enviará uma solicitação de pulsação ao EurekaServer a cada 30 segundos para relatar o status de integridade
    • eureka atualizará as informações da lista de serviço de registro e a pulsação anormal será removida
    • Os consumidores podem obter as informações mais recentes

Na arquitetura Eureka, existem dois tipos de funções de microsserviço:

  • EurekaServer: servidor, centro de registro
    • Registrar informações de serviço
    • Monitoramento de batimentos cardíacos
  • EurekaClient: cliente
    • Provedor: provedor de serviço, como usuário-atendimento no caso
      • Registre suas próprias informações no EurekaServer
      • Envie uma pulsação para o EurekaServer a cada 30 segundos
    • consumidor: consumidor de serviço, como pedido-serviço no caso
      • Puxe a lista de serviços do EurekaServer de acordo com o nome do serviço
      • Faça o balanceamento de carga com base na lista de serviços e inicie uma chamada remota após selecionar um microsserviço

[A transferência da imagem do link externo falhou, o site de origem pode ter um mecanismo de link anti-roubo, é recomendável salvar a imagem e carregá-la diretamente (img-88TXJy2e-1689593800699)(https://picture.wangkay.tech/blog/image-20230717142428805.png)]

3. Construa o Servidor Eureka

As etapas para criar o serviço EurekaServer são as seguintes:

  1. Crie um projeto e introduza a dependência de spring-cloud-starter-netflix-eureka-server

    imagem-20230717151327511

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  2. Escreva a classe de inicialização e adicione a anotação @EnableEurekaServer

    Para escrever uma classe de inicialização para o serviço eureka-server, certifique-se de adicionar uma anotação @EnableEurekaServer para habilitar a função de centro de registro do eureka:

    package cn.itcast.eureka;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
          
          
        public static void main(String[] args) {
          
          
            SpringApplication.run(EurekaApplication.class, args);
        }
    }
    
  3. Adicione o arquivo application.yml e escreva a seguinte configuração:

    server:  port: 10086spring:
      application:
        name: eurekaserver
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:10086/eureka/
    
  4. Começar serviço

Inicie o microsserviço e, em seguida, visite-o no navegador: http://127.0.0.1:10086

Veja o seguinte resultado deve ser bem sucedido:

imagem-20230717152406414

4. Registro de serviço

Em seguida, registramos o serviço do usuário no eureka-server.

1) Introduzir dependências

No arquivo pom do user-service, introduza as seguintes dependências do eureka-client:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2) Arquivo de configuração

Em user-service, modifique o arquivo application.yml e adicione o nome do serviço e o endereço eureka:

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3) Inicie várias instâncias de serviço do usuário

Para demonstrar um cenário em que um serviço possui várias instâncias, adicionamos uma configuração de inicialização SpringBoot e iniciamos um serviço de usuário.

Primeiro, copie a configuração original de inicialização do serviço do usuário:

imagem-20230717153021479

imagem-20230717165615969

O acima precisa marcar a opção Adicionar VM na opção de modificação e adicioná-la-Dserver.port=8082

imagem-20230717165713001

Inicie duas instâncias de serviço do usuário:

imagem-20230717171459086

imagem-20230717171414195

4) Puxar o serviço completo no pedido de serviço

O pull de serviço é obter a lista de serviços com base no nome do serviço e, em seguida, executar o balanceamento de carga na lista de serviços

  1. Modifique o código do OrderService, modifique o caminho da url para acessar e use o nome do serviço em vez de ip e porta:

    String url = "http://userservice/user/" + order.getUserId();
    

  2. Adicione anotações de balanceamento de carga a RestTemplate na classe de inicialização OrderApplication do projeto de serviço de pedido :

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
          
          
        return new RestTemplate();
    }
    

O Spring nos ajudará automaticamente a obter a lista de instâncias do lado do servidor eureka de acordo com o nome do serviço userservice e, em seguida, concluir o balanceamento de carga.

4. Balanceamento de carga da fita

1. O princípio do balanceamento de carga

imagem-20230717174345639

1)LoadBalancerInterceptor

imagem-20230717174646863

O método intercept aqui intercepta a solicitação HttpRequest do usuário e faz várias coisas:

  • request.getURI(): Obtenha o uri de solicitação, neste caso é http://user-service/user/8
  • originalUri.getHost(): obtenha o nome do host do caminho uri, que na verdade é o ID do serviço.user-service
  • this.loadBalancer.execute(): ID do serviço de processo e solicitações do usuário.

Aqui this.loadBalancerestá LoadBalancerCliento tipo, continuamos a seguir.

2)LoadBalancerClient

imagem-20230717191213064

  • getLoadBalancer(serviceId): obtenha o ILoadBalancer de acordo com o id do serviço e o ILoadBalancer levará o id do serviço para eureka para obter a lista de serviços e salvá-la.
  • getServer(loadBalancer): Use o algoritmo de balanceamento de carga integrado para selecionar um na lista de serviços. Neste exemplo, você pode ver que o serviço na porta 8082 foi obtido

3) Estratégia de balanceamento de carga IRule

imagem-20230717191248461

imagem-20230717191257955

imagem-20230717191306387

4) Resumo

A camada inferior do SpringCloudRibbon usa um interceptador para interceptar a solicitação enviada pelo RestTemplate e modificar o endereço. Resumindo com uma foto:

imagem-20230717191419279

O processo básico é o seguinte:

  • Intercepte nossa solicitação RestTemplate http://userservice/user/1
  • RibbonLoadBalancerClient obterá o nome do serviço do URL da solicitação, que é user-service
  • DynamicServerListLoadBalancer extrai a lista de serviços de eureka de acordo com o serviço do usuário
  • eureka retorna a lista, localhost:8081, localhost:8082
  • IRule usa regras de balanceamento de carga integradas, selecione uma na lista, como localhost:8081
  • RibbonLoadBalancerClient modifica o endereço da solicitação, substitui userservice por localhost:8081, obtém http://localhost:8081/user/1 e inicia uma solicitação real

2. Estratégia de balanceamento de carga

estratégia de balanceamento de carga

As regras de balanceamento de carga são definidas na interface IRule, e IRule tem muitas classes de implementação diferentes:

imagem-20230717191607976

Os significados das diferentes regras são os seguintes:

Classe de regra de balanceamento de carga integrada Descrição da regra
Regra RoundRobin Basta consultar a lista de serviços para selecionar um servidor. É a regra de balanceamento de carga padrão da Faixa de Opções.
Regra de filtragem de disponibilidade Ignore os dois servidores a seguir: (1) Por padrão, se este servidor falhar ao conectar 3 vezes, este servidor será definido para o estado "curto-circuito". O estado de curto-circuito durará 30 segundos e, se a conexão falhar novamente, a duração do curto-circuito aumentará geometricamente. (2) Servidores com simultaneidade muito alta. Se o número de conexões simultâneas de um servidor for muito alto, o cliente configurado com a regra AvailabilityFilteringRule também irá ignorá-lo. O limite superior do número de conexões simultâneas pode ser configurado pela propriedade ..ActiveConnectionsLimit do cliente.
WeightedResponseTimeRule Atribua um valor de peso a cada servidor. Quanto maior o tempo de resposta do servidor, menor o peso desse servidor. Essa regra selecionará aleatoriamente um servidor e esse valor de peso afetará a seleção do servidor.
ZoneAvoidanceRule A seleção do servidor é baseada nos servidores disponíveis na região. Use Zona para classificar servidores. Esta Zona pode ser entendida como uma sala de informática, um rack, etc. Em seguida, pesquise vários serviços na Zona.
MelhorRegraDisponível Ignore os servidores que estão em curto-circuito e escolha servidores com menor simultaneidade.
RandomRule Selecione aleatoriamente um servidor disponível.
RetryRule Lógica de seleção para o mecanismo de repetição

A implementação padrão é ZoneAvoidanceRule, que é um esquema de pesquisa

Estratégia personalizada de balanceamento de carga

As regras de balanceamento de carga podem ser modificadas definindo a implementação IRule. Existem duas maneiras:

  1. Método de código: na classe OrderApplication em order-service, defina uma nova IRule:
@Bean
public IRule randomRule(){
    
    
    return new RandomRule();
}
  1. Método do arquivo de configuração: No arquivo application.yml do order-service, adicionar novas configurações também pode modificar as regras:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

Observe que as regras de balanceamento de carga padrão geralmente são usadas sem modificações.

3. Carregamento de fome

A Ribbon utiliza o lazy loading por padrão, ou seja, o LoadBalanceClient é criado somente quando for acessado pela primeira vez, e o tempo de requisição será muito longo.

O carregamento de fome será criado quando o projeto começar a reduzir o tempo gasto para a primeira visita. Habilite o carregamento de fome através da seguinte configuração:

ribbon:
  eager-load:
    enabled: true
    clients: userservice

Acho que você gosta

Origin blog.csdn.net/qq_54351538/article/details/131773486
Recomendado
Clasificación