Evolução da arquitetura de microsserviços

Evolução da arquitetura de microsserviços

Conheça os microsserviços

Evolução da arquitetura de serviço

Arquitetura monolítica: concentre todas as funções de negócios em um projeto para desenvolvimento e implante-as como um pacote

vantagem:

  • Arquitetura simples
  • Baixo custo de implantação

deficiência:

  • Alto acoplamento

imagem

Arquitetura distribuída: O sistema é dividido de acordo com funções de negócio, e cada módulo de negócio é desenvolvido como um projeto independente, denominado serviço.

vantagem:

  • Reduza o acoplamento de serviço
  • Propício à atualização e expansão do serviço

Perguntas a considerar:

  • Granularidade de divisão de serviço
  • Como manter o endereço do cluster de serviço
  • Como implementar chamadas remotas entre serviços
  • Como perceber o estado de saúde do serviço

imagem

microsserviços

  • Responsabilidade única: a granularidade dividida de microsserviços é menor e cada serviço corresponde a uma capacidade de negócios única, que pode atingir uma responsabilidade única e evitar desenvolvimento repetido
  • Orientado a serviços: microsserviços expõem interfaces de negócios para o mundo exterior
  • Autonomia: equipe independente, tecnologia independente, dados independentes, implantação independente
  • Forte isolamento: as chamadas de serviço são isoladas, tolerantes a falhas, rebaixadas e problemas em cascata são evitados

imagem

Comparação de tecnologia de microsserviços

imagem

necessidades de negócios

imagem

SpringCloud

Site oficial: https://spring.io/projects/spring-cloud

imagem

Divisão de serviço e chamada remota

Notas sobre divisão de serviço:

  • Não desenvolva o mesmo negócio repetidamente para diferentes microsserviços
  • Os dados de microsserviços são independentes, não acessam o banco de dados de outros microsserviços
  • Os microsserviços podem expor seus negócios como interfaces para outros microsserviços chamarem

Análise de métodos de chamada remota:

imagem

Chamada remota de serviço

Usando a classe RestTemplate

aula principal de inicialização

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

serviço

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
    
    
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        Long userId = order.getUserId();
        String url = "http://userservice/user/"+userId;
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        // 4.返回
        return order;
    }

fornecedor e consumidor

  • Provedor de serviços: um serviço chamado por outros microsserviços em uma empresa
  • Consumidor de serviços: Em uma empresa, outros serviços são chamados

centro de registro eureka

Problemas com chamadas de serviço

  • Como os consumidores de serviços obtêm as informações de endereço dos prestadores de serviços?

    • O provedor de serviços registra suas próprias informações no eureka quando ele inicia
    • eureka salva essas informações
    • O consumidor extrai informações do provedor do eureka com base no nome do serviço
  • Se houver vários prestadores de serviços, como os consumidores deverão escolher?

    • O consumidor de serviço usa o algoritmo de balanceamento de carga para selecionar um da lista de serviços
  • Como os consumidores conhecem 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ços de registro e, se o batimento cardíaco estiver anormal, ele será removido.
    • Os consumidores podem obter as informações mais recentes

O papel de Eureka

imagem

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

Introduzir dependências

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

Adicionar anotação @EnableEurekaServer

Adicionar arquivo de configuração application.yml

server:
  port: 10086 #服务端口
spring:
  application: # eureka的服务名称
    name: eurekaserver
eureka:
  client:
    service-url:  # eureka的地址信息
         defaultZone: http://127.0.0.1:10086/eureka

Configurar EurekaService

Introduzir dependências

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

Adicionar anotação @EnableEurekaServer

Adicionar arquivo de configuração application.yml

server:
  port: 8081
spring:
  application: # eureka的服务名称
    name: userservice # user服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

Conclua a solicitação de serviço no serviço de pedido

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

    public Order queryOrderById(Long orderId) {
    
    
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        Long userId = order.getUserId();
        String url = "http://userservice/user/"+userId;
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        // 4.返回
        return order;
    }

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

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

Princípio de balanceamento de carga de fita

processo

imagem

Código fonte

imagem

estratégia de balanceamento de carga

imagem

Alterar regras de balanceamento de carga

  • Método de código: Na classe OrderApplication em order-service, defina uma nova IRule:
    @Bean
    public IRule randomRule(){
    
    
        return new RandomRule();
    }
  • Método do arquivo de configuração: No arquivo application.yml do order-service, adicionar uma nova configuração também pode modificar as regras:
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Fome carregada

O Ribbon adota carregamento lento por padrão, ou seja, o LoadBalanceClient será criado apenas quando acessado pela primeira vez, e o tempo de solicitação será muito longo. O carregamento faminto será criado no início do projeto, reduzindo o tempo da primeira visita. Habilite o carregamento faminto através da seguinte configuração:

ribbon:
	eager-load:	
  	enabled: true # 开启饥饿加载
  	clients: userservice # 指定对userservice这个服务饥饿加载

centro de registro nacos

Site oficial: https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html

Registro de serviço para nacos

confiar

No projeto pai (se se tornar popular, primeiro importe-o nas dependências para atualizar o maven e depois importe-o no dependencyManagement)

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.5.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

subprojeto

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

aplicativo.yml

spring:
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: localhost:8848

modelo de armazenamento hierárquico de serviço nacos

imagem

Problema de chamada entre clusters de serviço

  cloud:
    nacos:
      server-addr: localhost:8848
    	# 集群配置
      discovery:
        cluster-name: HZ #集群名称

centro de controle nacos

imagem

Balanceamento de carga baseado em cluster

1. Modifique application.yml em order-service e defina o cluster como HZ:

userservice:
  ribbon:
  	# 优先同区域再随机
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

Balanceamento de carga com base no peso

Na implantação real, ocorrerá o seguinte cenário:

  • O desempenho dos equipamentos do servidor varia. Algumas instâncias estão localizadas em máquinas com melhor desempenho, enquanto outras são piores. Esperamos que máquinas com bom desempenho suportem mais solicitações dos usuários.

O Nacos fornece configuração de peso para garantir acesso frequente. Quanto maior o peso, maior a frequência de acesso.

imagem

Se ocorrer um erro 500, então:

imagem

Namespace de isolamento de ambiente

A camada mais externa de armazenamento de serviço e armazenamento de dados no Nacos é algo chamado namespace, que é usado para isolamento externo.

imagem

Configuração

imagem

imagem

imagem

imagem

configuração yml

spring:
  cloud:
      nacos:
        server-addr: localhost:8848
        discovery:
          cluster-name: HZ
      	# 命名空间配置
          namespace: 7c20c8b7-1a7b-46f2-8451-5190cf114fcb

Análise detalhada do centro de registro nacos

imagem

Configurar uma instância não efêmera

spring:
  cloud:
      nacos:
        server-addr: localhost:8848
        discovery:
          cluster-name: HZ
          namespace: 7c20c8b7-1a7b-46f2-8451-5190cf114fcb
          ephemeral: false

O que Nacos e eureka têm em comum

  • Ambos suportam registro de serviço e extração de serviço.
  • Todos os métodos de pulsação dos provedores de serviços de suporte para testes de saúde.

A diferença entre Nacos e Eureka

  • O Nacos oferece suporte ao servidor para detectar ativamente o status do provedor: instâncias temporárias usam o modo de pulsação e instâncias não temporárias usam detecção ativa.
  • As instâncias temporárias com pulsações anormais serão removidas, enquanto as instâncias não temporárias não serão removidas.
  • Nacos suporta o modo push de mensagem para alterações na lista de serviços, e a lista de serviços é atualizada em tempo hábil
spring:
  cloud:
      nacos:
        server-addr: localhost:8848
        discovery:
          cluster-name: HZ
          namespace: 7c20c8b7-1a7b-46f2-8451-5190cf114fcb
          ephemeral: false

O que Nacos e eureka têm em comum

  • Ambos suportam registro de serviço e extração de serviço.
  • Todos os métodos de pulsação dos provedores de serviços de suporte para testes de saúde.

A diferença entre Nacos e Eureka

  • O Nacos oferece suporte ao servidor para detectar ativamente o status do provedor: instâncias temporárias usam o modo de pulsação e instâncias não temporárias usam detecção ativa.
  • As instâncias temporárias com pulsações anormais serão removidas, enquanto as instâncias não temporárias não serão removidas.
  • Nacos suporta o modo push de mensagem para alterações na lista de serviços, e a lista de serviços é atualizada em tempo hábil
  • O cluster Nacos usa o modo AP por padrão. Quando há instâncias não temporárias no cluster, o modo CP é usado; Eureka usa o modo AP.

Acho que você gosta

Origin blog.csdn.net/xcxcxcxx1/article/details/130586922
Recomendado
Clasificación