Primeiros passos com Gateway e Nacos
1. Análise de arquitetura
Se houver muito mais microsserviços em um projeto, haverá desvantagens no método de solicitação direta de microsserviços do front-end. O front-end configura um caminho absoluto para cada endereço de solicitação, o que não conduz à manutenção do sistema. Por exemplo, o solicite o gerenciamento do sistema no código a seguir O endereço do serviço usa localhost
Quando o sistema fica online, ele precisa ser alterado para o nome de domínio da rede pública. Se houver muitos desses endereços, será muito problemático.
Com base neste problema, um gateway pode ser utilizado para resolvê-lo, conforme mostrado abaixo:
Então, com base no gateway, o front-end solicita diretamente o endereço do microsserviço e só precisa especificar o caminho relativo de cada interface.
Além disso, o backend também pode alterar o endereço de acesso ao microsserviço para o endereço de acesso ao gateway, e então o gateway realiza o roteamento.
O gateway pode rotear solicitações para microsserviços específicos, reduzindo o custo de microsserviços externos.Além disso, o gateway também pode implementar funções como controle de autoridade e limitação de corrente.
Então pode-se ver na figura que o gateway está implantadoprocessodo seguinte modo:
1. Inicie o microsserviço e registre-se no Nacos. O Nacos registra o endereço de cada instância do microsserviço.
2. O gateway lê a lista de serviços do Nacos, incluindo nome do serviço, endereço do serviço, etc.
3. A solicitação chega ao gateway e o gateway encaminha a solicitação para o microsserviço específico.
2. Construa Nacos
Centro de descoberta de serviços
Para usar o gateway, primeiro construa o Nacos. O Nacos tem duas funções:
1. Centro de descoberta de serviços.
O microsserviço se registra no Nacos e o gateway obtém a lista de microsserviços do Nacos.
2. Centro de configuração.
Existem muitos microsserviços e suas informações de configuração também são muito complexas.Para fornecer manutenção do sistema, as informações de configuração dos microsserviços são unificadas na configuração do Nacos.
Existem dois conceitos que precisam ser entendidos antes de construir o centro de descoberta de serviços Nacos:namespace e grupo
namespace: usado para distinguir ambientes, como ambiente de desenvolvimento, ambiente de teste e ambiente de produção.
grupo: usado para distinguir projetos, como: projeto xuecheng-plus, projeto xuecheng2.0
Primeiro configure o namespace no nacos:
Após fazer login no Nacos, clique em "Namespace" no menu esquerdo para entrar na interface de gerenciamento de namespace.
Clique em “Novo Namespace” e preencha as informações relevantes do namespace. Como mostrado abaixo:
Registre mensagens de microsserviço no Nacos
- Primeiro adicione o gerenciamento de dependências
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Nacos服务注册依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
2. Configure o endereço dos nacos
Configure as seguintes informações no arquivo de configuração:
spring:
application:
name: content-api #微服务名称
cloud:
nacos:
server-addr: 192.168.101.65:8848 #Nacos地址
discovery:
namespace: dev #命名空间
group: xuecheng-plus-project #组
Reinicie o serviço.
Entre no serviço Nacos para visualizar a lista de serviços e descobrir que há mensagens de microsserviços registradas
Centro de configuração
Configurar três elementos
Após a construção do centro de descoberta de serviços Nacos, o Nacos é construído abaixo como centro de configuração, cujo objetivo é gerenciar todas as configurações do projeto através do Nacos.
Primeiro classifique os arquivos de configuração no projeto:
1. Configuração única para cada projeto
Significa que a configuração só precisa ser definida em alguns projetos, ou a configuração possui valores diferentes em cada projeto.
Por exemplo: spring.application.name precisa ser configurado para cada projeto, mas o valor é diferente, e alguns projetos precisam se conectar ao banco de dados, mas outros não, e alguns projetos precisam configurar filas de mensagens, mas outros não.
2. Configuração comum ao projeto
Refere-se à configuração em que o conteúdo da configuração é o mesmo em vários projetos. Por exemplo: configuração do redis, muitos projetos usam o mesmo conjunto de serviços redis, então a configuração é a mesma.
Além disso, você precisa saber como o nacos localiza um arquivo de configuração específico, a saber:namespace, grupo, dataid.
1. Encontre o ambiente específico e os projetos específicos por meio de namespace e grupo.
2. Encontre o arquivo de configuração específico por meio do dataid, o dataid consiste em três partes
Por exemplo: o arquivo de configuração content-service-dev.yaml consiste em três partes (content-service)-(dev).(yaml)
content-service: A primeira parte, que é o nome da aplicação configurada em application.yaml, ou seja, o valor de spring.application.name.
dev: A segunda parte, é o nome do ambiente, especificado por spring.profiles.active,
Yaml: A terceira parte é o sufixo do arquivo de configuração. Atualmente, nacos suporta propriedades, yaml e outros tipos de formato. Este projeto escolhe o tipo de formato yaml.
Aprovado quando iniciamos o projetoprimavera.perfis.ativosO parâmetro determina qual arquivo de configuração do ambiente é referenciado. Por exemplo, passar spring.profiles.active=dev significa usar o arquivo de configuração do ambiente de desenvolvimento, ou seja, content-service-dev.yaml.
Por exemplo
1. Clique no sinal de mais para adicionar configuração
2. Editar configuração
3. Adicione dependências
<!--微服务配置依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
Modificar configuração no arquivo de configuração
(Veja a frente para detalhes)
YAML
spring:
application:
name: content-service
cloud:
nacos:
server-addr: 192.168.101.65:8848
discovery:
namespace: dev
group: xuecheng-plus-project
config:
namespace: dev
group: xuecheng-plus-project
file-extension: yaml
refresh-enabled: true
#profiles默认为dev
profiles:
active: dev
Após a conclusão da configuração, execute o arquivo de teste de unidade do projeto para ver se ele pode ser testado normalmente.O método de teste de unidade de rastreamento pode ler os dados do banco de dados normalmente, indicando que as informações de configuração lidas do nacos são normais.
Configuração comum
Se houver configurações a serem escritas repetidamente ou configurações públicas, como configurar as configurações públicas do projeto no nacos?
nacos fornece configurações compartilhadas para introduzir configurações comuns.
Por exemplo, se o swagger estiver configurado na API de conteúdo, todos os projetos de interface precisam ser configurados com o swagger. Aqui, a configuração do swagger pode ser definida como uma configuração pública e qualquer projeto pode ser importado.
Crie a configuração pública de xuecheng-plus separadamente no grupo xuecheng-plus-common, entre no ambiente de desenvolvimento de nacos e adicione a configuração pública de swagger-dev.yaml
[Falha na transferência de imagem do link externo, o site de origem pode ter um mecanismo anti-leeching, é recomendado salvar a imagem e carregá-la diretamente (img-OSLuJRO1-1689594280792)(file:///C:/Users/a2262/Pictures /Typedown/c50152f7-1c78 -4a9a-aca4-139482cc8dc8.png)]
Em seguida, marque as informações de configuração compartilhada no arquivo de configuração
YAML
spring:
application:
name: content-api
cloud:
nacos:
server-addr: 192.168.101.65:8848
discovery:
namespace: dev
group: xuecheng-plus-project
config:
namespace: dev
group: xuecheng-plus-project
file-extension: yaml
refresh-enabled: true #开启自动更新配置
extension-configs: #扩展配置,下面是扩展配置的信息(Nacos中的配置)
- data-id: content-service-${
spring.profiles.active}.yaml
group: xuecheng-plus-project
refresh: true
shared-configs: #共享配置,下面是共享配置的信息
- data-id: logging-${
spring.profiles.active}.yaml
group: xuecheng-plus-common
refresh: true
profiles:
active: dev #环境,也是后缀
Nova configuração
[Falha na transferência de imagem do link externo, o site de origem pode ter um mecanismo de link anti-roubo, é recomendado salvar a imagem e carregá-la diretamente (img-PxnA3s17-1689594280793)(file:///C:/Users/a2262/ Imagens/Typedown/67e1ad57-181d -4bfd-b5a6-0e2800fb4022.png)]
Após a conclusão da configuração, reinicie o projeto para ver se há um resultado de configuração correspondente, se houver, significa que a configuração foi bem-sucedida
Configurar prioridade
A ordem em que o SpringBoot lê os arquivos de configuração é a seguinte:
As formas de introdução dos arquivos de configuração são:
1. Introduzir pelo nome do aplicativo do projeto
2. Introduzir através do arquivo de configuração estendido
3. Introduzir via arquivo de configuração compartilhado
4. Arquivo de configuração local
A prioridade de cada arquivo de configuração: arquivo de configuração do nome do aplicativo do projeto > arquivo de configuração estendido > arquivo de configuração compartilhado > arquivo de configuração local.
Se quisermos dar prioridade ao local, podemos configurá-lo no arquivo de configuração do nacos da seguinte forma:
#配置本地优先
spring:
cloud:
config:
override-none: true
3. Construir portal
Precisamos criar um projeto de gateway.
1. Crie um novo projeto de gateway.
2. Estrutura do projeto
3. Adicione dependências
<artifactId>xuecheng-plus-gateway</artifactId>
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!--服务发现中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<!-- 排除 Spring Boot 依赖的日志包冲突 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.7.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Boot 集成 log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
</dependencies>
4. Configure o arquivo de configuração bootstrap.yaml do gateway
YAML
#微服务配置
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.101.65:8848
discovery:
namespace: dev
group: xuecheng-plus-project
config:
namespace: dev
group: xuecheng-plus-project
file-extension: yaml
refresh-enabled: true
shared-configs:
- data-id: logging-${
spring.profiles.active}.yaml
group: xuecheng-plus-common
refresh: true
profiles:
active: dev
5. Configure a política de roteamento do gateway em nacos:
A configuração é a seguinte
YAML
server:
port: 63010 # 网关端口
spring:
cloud:
gateway:
# filter:
# strip-prefix:
# enabled: true
routes: # 网关路由配置,这下面是我的几个微服务信息
- id: content-api # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
# filters:
# - StripPrefix=1
- id: system-api
# uri: http://127.0.0.1:8081
uri: lb://system-api
predicates:
- Path=/system/**
# filters:
# - StripPrefix=1
- id: media-api
# uri: http://127.0.0.1:8081
uri: lb://media-api
predicates:
- Path=/media/**
# filters:
# - StripPrefix=1
6. Altere o endereço que solicita o microsserviço para o endereço do gateway
por exemplo
ou
Inicie o teste de engenharia, se a solicitação for normal, a implantação foi bem-sucedida