进学阁

业精于勤荒于嬉,行成于思毁于随

0%

集成Nacos+SpringCloudGateway实现配置中心以及服务发现

前面已经实现了统一返回以及异常处理,也完成了通用的数据模块,我们已经可以借此来实现服务,但是在微服务中肯定不会只有一个服务,当我们有多个服务的时候,会出现多个痛点:

  1. 当服务多的时候分布在不同的服务器上部署的时候,前端寻址将是困难重重,所以需要一个统一的入口,来帮助前端来访问这些服务
  2. 多个服务分部在不同的主机上,当我们因为某种原因需要修改多个服务的配置文件时,工作量巨大。

而Nacos+SpringCloudGateway可以帮我们解决这个问题

集成Nacos

nacos是做什么的

nacos的官网关于nacos的介绍一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,那他有什么作用呢

官网的描述是这样的,总结一下有两点:服务发现和服务注册以及配置管理,那nacos能做些什么呢

服务注册:

服务提供者在启动时向 Nacos 注册中心注册自己的服务信息,包括服务名称、IP 地址、端口号等。

服务发现:

服务消费者从 Nacos 注册中心获取服务提供者的信息,从而能够调用服务。

健康检查:

Nacos 支持服务实例的健康检查,可以自动剔除不健康的服务实例。

服务元数据管理:

除了基本的服务信息外,还可以附加服务的元数据,如版本、权重等。

服务分组:

支持服务分组,可以根据不同的业务场景将服务划分到不同的组。

服务版本控制:

支持服务版本管理,便于灰度发布和回滚。

配置管理:

动态的配置管理用于集中管理配置文件

在user模块中集成nacos

首先定义pom文件(前文中已经定义了nacos的版本)

1
2
3
4
5
6
7
8
9
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

启动类增加@EnableDiscoveryClient

1
2
3
4
5
6
7
8
9
@EnableDiscoveryClient
@SpringBootApplication
public class PomeloCustomerModulesApplication {

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

}

增加文件bootstrap.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Tomcat
server:
port: 5030

# Spring
spring:
application:
# 应用名称
name: pomelo-customer
profiles:
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 你的nacos地址:8848
namespace: c3477374-9bfd-4c52-a511-8a99468d7759
config:
# 配置中心地址
server-addr: 你的nacos地址:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
namespace: c3477374-9bfd-4c52-a511-8a99468d7759

启动服务

可以看到已经连接到nacos

集成SpringCloudGateway

SpringCloudGateway是做什么的

在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如:
  • 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
  • 认证复杂,每个微服务都有独立认证
  • 存在跨域请求,在一定场景下处理相对复杂

为解决上面的问题所以引入了网关的概念:所谓的API网关,就是指系统的统一入口,提供内部服务的路由中转,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等。

Spring Cloud Gateway就是api网关。官网上对Spring Cloud Gateway如下:

:::info
This project provides a libraries for building an API Gateway on top of Spring WebFlux or Spring WebMVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.

Features

Spring Cloud Gateway features:

  • Built on Spring Framework and Spring Boot
  • Able to match routes on any request attribute.
  • Predicates and filters are specific to routes.
  • Circuit Breaker integration.
  • Spring Cloud DiscoveryClient integration
  • Easy to write Predicates and Filters
  • Request Rate Limiting
  • Path Rewriting

:::

SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring5.0+Spring Boot20和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。

作用

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

通过SpringCloudGateway找到user模块

当了解过概念后我们来动手实践一下

第一步引入pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

第二步引入nacos

按照上面nacos的步驟做一遍

第三步配置路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
- id: pomelo-user
uri: lb://pomelo-user
predicates:
- Path=/user/**
filters:
- StripPrefix=1

第四步测试