前面已经实现了统一返回以及异常处理,也完成了通用的数据模块,我们已经可以借此来实现服务,但是在微服务中肯定不会只有一个服务,当我们有多个服务的时候,会出现多个痛点:
- 当服务多的时候分布在不同的服务器上部署的时候,前端寻址将是困难重重,所以需要一个统一的入口,来帮助前端来访问这些服务
- 多个服务分部在不同的主机上,当我们因为某种原因需要修改多个服务的配置文件时,工作量巨大。
而Nacos+SpringCloudGateway可以帮我们解决这个问题
集成Nacos
nacos是做什么的
nacos的官网关于nacos的介绍一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,那他有什么作用呢
官网的描述是这样的,总结一下有两点:服务发现和服务注册以及配置管理,那nacos能做些什么呢
服务注册:
服务提供者在启动时向 Nacos 注册中心注册自己的服务信息,包括服务名称、IP 地址、端口号等。
服务发现:
服务消费者从 Nacos 注册中心获取服务提供者的信息,从而能够调用服务。
健康检查:
Nacos 支持服务实例的健康检查,可以自动剔除不健康的服务实例。
服务元数据管理:
除了基本的服务信息外,还可以附加服务的元数据,如版本、权重等。
服务分组:
支持服务分组,可以根据不同的业务场景将服务划分到不同的组。
服务版本控制:
支持服务版本管理,便于灰度发布和回滚。
配置管理:
动态的配置管理用于集中管理配置文件
在user模块中集成nacos
首先定义pom文件(前文中已经定义了nacos的版本)
1 | <!--nacos--> |
启动类增加@EnableDiscoveryClient
1 | @EnableDiscoveryClient |
增加文件bootstrap.yml
1 | # Tomcat |
启动服务
可以看到已经连接到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 | <dependency> |
第二步引入nacos
按照上面nacos的步驟做一遍
第三步配置路由
1 | spring: |