文章目录
- Spring Cloud Alibaba系列三:集成Gateway实现路由管理
- 前言
- 1、改造父项目 pom 文件
- 2、创建 gateway 子 module
- 3、配置yml文件
Spring Cloud Alibaba系列三:集成Gateway实现路由管理
spring cloud alibaba 版本对照
spring cloud alibaba 有严格的版本要求,所以一定要选对 spring cloud 版本,以及 spring boot 的版本
此系列文章的版本选取如下:
- Spring Cloud 版本:Spring Cloud 2021.0.1
- Spring Boot 版本:2.6.3
- Spring Cloud Alibaba 版本:2021.0.1.0
Spring Cloud Alibaba系列一:nacos 注册中心
Spring Cloud Alibaba系列二:openFeign 实现服务间的通信
Spring Cloud Alibaba系列三:集成Gateway实现路由管理
前言
前两篇整合了nacos做为注册中心,openFeign实现服务间的通信,这篇记录整合Gateway做为整个路由的管理。
那么什么是Gateway?
网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同层–应用层。
Gateway能用来干什么?
常见的作用有:
- 鉴权校验:验证是否认证和授权
- 统一入口:提供所有微服务的入口点,起到隔离作用,保障服务的安全性
- 限流熔断
- 路由转发
- 负载均衡
- 链路追踪
1、改造父项目 pom 文件
由于引入了Gateway,所以我们要把父项目的 pom文件里的 spring-boot-starter-web 的依赖删掉,一次在 customer,provider模块的pom文件里引入该依赖。否则启动 gateway 模块会报错。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、创建 gateway 子 module
创建方式同创建其他两个module一样。创建完成之后修改该模块的 pom 文件。需要注意的是,由于common模块引入了mybatis-plus的依赖,所以在gateway的pom文件里如果要添加common模块的依赖,需要移除掉mybatis-plus,否则启动会报DataSource异常。
pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>alibaba</artifactId>
<groupId>cn.xzf</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.xzf</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--gateway依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Feign Client for loadBalancing -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
另外一个要注意的是,如果在 yml 的配置文件里,配置 routes.uri 为 lb:// 的形式,需要加上loadbalance的依赖,否则启动访问,会 503
<!-- Feign Client for loadBalancing -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
原因如下:
由于从springcloud2020版本开始,弃用了Ribbon,因此Alibaba在2021及之后版本的 nacos 中删除了 Ribbon 的 jar 包,因此无法通过 loadbalancer 路由到指定微服务。
3、配置yml文件
dev 的配置文件内容如下
url:
base-url: 192.168.2.213
spring:
cloud:
nacos:
discovery:
#注册中心地址
server-addr: ${url.base-url}
username: nacos
password: nacos
config:
#命名空间
namespace: ${spring.profiles.active}
file-extension: yaml
#配置中心地址
server-addr: ${url.base-url}
gateway:
routes:
- id: provider
uri: lb://provider
predicates:
- Path=/provider/**
# 过滤器
filters:
# - StripPrefix=1 #转发之前去掉第一层路由
- id: customer
uri: lb://customer
predicates:
- Path=/customer/**
# 过滤器
filters:
# - StripPrefix=1 #转发之前去掉第一层路由
- routes:配置路由相关的内容
- id:保持唯一即可
- uri:可以是http://的形式,也可以是 lb://服务名称(lb://provider)。lb 指使用负载均衡的模式调用对应的服务
- predicates:路由断言,判断那些url会转发到对应的服务去
- filters:过滤器,对请求或响应做处理。
更多的配置可以参考 网关GateWay的使用详解、路由、过滤器、跨域配置
上述做完之后,就可以浏览器测试看看了。gateway 服务配置的端口号是8084
依次启动 gateway、provider、customer 服务。
浏览器访问
1、http://localhost:8082/provider/demo/test
2、http://localhost:8084/customer/demo/test
3、http://localhost:8084/provider/demo/test
8082 是正常访问 provider 服务的接口,8084 是 gateway 服务的端口,分别访问customer,provider的接口,返现都正确访问到了,自此集成gateway结束了。
实际上gateway还有更多的作用,这里只是简单的路由功能,而且路由功能里还可以传参数等操作,更多的功能值得你去挖掘。
上述就是 集成gateway的快速过程。
SpringCloudAlibaba系列demo (github.com)