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
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
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
Comparação de tecnologia de microsserviços
necessidades de negócios
SpringCloud
Site oficial: https://spring.io/projects/spring-cloud
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:
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
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
Código fonte
estratégia de balanceamento de carga
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
Problema de chamada entre clusters de serviço
cloud:
nacos:
server-addr: localhost:8848
# 集群配置
discovery:
cluster-name: HZ #集群名称
centro de controle nacos
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.
Se ocorrer um erro 500, então:
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.
Configuração
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
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.