这篇文章将从gateway的搭建、自动路由匹配、路由数组、跨域和路由过滤器五个方面对gateway项目展开讨论。

1、gateway的搭建

gateway的项目基本的搭建过程与消费者的搭建过程基本一致,细节部分可参考《nacos(四): 创建第一个消费者Conumer(单体)》

搭建完成后,在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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
<artifactId>gateway</artifactId>
<packaging>jar</packaging> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencies> <!-- 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <!--消费者-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.5</version>
</dependency> <!--⽹关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>

</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.gateway.GatewayApplication</mainClass>
<skip>false</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

注意:在gateway项目中,不能引入spring mvc或者start web类的关于web的依赖,否则会报错“Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.”。

另外,gateway的版本也需要进行匹配,在前几篇文章中,我们也一再强调微服务项目对于库的版本要求非常精细。版本稍微不一致可能会报出奇怪的问题,比如”Error processing condition on org.springframework.cloud.gateway.config.GatewayAutoConfiguration.propertiesRouteDefinitionLocator“。

接下来,在application.yml中,开启自动路由匹配:

server:
port: 8087 spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
file-extension: properties
username: nacos
password: nacos
loadbalancer:
nacos:
enabled: true
gateway:
discovery:
locator:
enabled: true
application:
name: gateway

最后,我们在启动类上添加@EnableDiscoveryClient注解。

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

配置完成后,启动gateway,可以看到nacos的管理后台里gateway已经注册成功。

2、路由自动匹配

在文章的第1部分里,application.yml中开启的路的自动匹配功能。

如个例子:

当前在nacos中有一个product1服务,服务提提供了/hello的地址。

通过gateway,我们可以访问http://127.0.0.1:8087/product1/hello,通过gateway访问到product1的hello地址。如下图:

其中:

127.0.0.1:8087:分别是gateway的IP地址和端口号;

product1: 是注册在nacos的里的服务名;

/hello:则是product1服务提供的资源地址。

3、路由数组

在application.yml中配置routes配置节,可开启路由数组,如下

server:
port: 8087 spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
file-extension: properties
username: nacos
password: nacos
loadbalancer:
nacos:
enabled: true
gateway:
discovery:
locator:
enabled: true
routes:
- id: product1_hello
uri: lb://product1 # 指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
order: 1 # 路由优先级 数字越低优先级越高
predicates: # 断言
- Path= /p1/** # 当请求路径满⾜Path指定的规则时,才进⾏路由换发
filters:
- StripPrefix=1 # 拼接好url之后去掉1层路径也就是p1
- id: order_route
uri: lb://server-order
order: 1
predicates:
- Path=/order/**
filters:
- StripPrefix=1
- AddRequestHeader=msg,abc
application:
name: gateway

上面的这个配置文件例子中,路由数组里配置了两个路由。各项配置的具体配置的意义,看文件中的注释。其中- StripPrefix=1配置项需要注意。

这一项的意思是,当用户访问http://127.0.0.1:8087/p1/hello,因为/p1/路径触发了第一个路由规则,路由去掉p1这一项,重新拼接为lb://product1/hello去获取访问的结果。

断言proeicates还有如果规则可以使用:

过滤器filters还有如下规则可以使用:

4、跨域

可以通过对application.yml的配置进行跨域项的设置,如下:

spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些⽹站的跨域请求
- "http://localhost:8090"
allowedMethods: # 允许的跨域ajax的请求⽅式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期

5、路由过滤器

gateway也可以自定义自己的filter,下面用两个例子来说明过如何自定义filter。

示例一:判断请求参数中是否有authorization, authorization参数值是否为admin。如果同时满⾜则放⾏,否则拦截。

@Component
@Order(-1) // 用来控制优先级 数字越小优先级越高
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().get("authorization").get(0);
if (token.equals("admin")){
// 放行
return chain.filter(exchange);
}
// 拦截 禁止访问
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}

示例二:判断请求参数中是否有token,如果没有则拦截并报错。

@Component
public class TokenFilter implements GlobalFilter, Ordered { @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest req= exchange.getRequest();
ServerHttpResponse resp= exchange.getResponse(); MultiValueMap<String, String> params= req.getQueryParams();
if(!params.containsKey("token")){
//输出错误信息
Map<String, Object> map = new HashMap<>();
map.put("msg", "Not Logged in!!!!");
map.put("code", 4000); /*
//3.3作JSON转换
byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8
);
//3.4调用bufferFactory方法,生成DataBuffer对象
DataBuffer buffer = response.bufferFactory().wrap(bytes);
*/ //4.调用Mono中的just方法,返回要写给前端的JSON数据
DataBuffer buffer =resp.bufferFactory().wrap("error".getBytes(StandardCharsets.UTF_8)); return resp.writeWith(Mono.just(buffer));
}
return chain.filter(exchange);
} @Override
public int getOrder() {
return 0;
}
}

本文关于gateway的内容到这里就结束了,下一篇我们将一起讨论哨兵sentinel的使用: )

nacos(七): gateway(单体)的更多相关文章

  1. 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  2. 微服务时代之网关相关技术选型及部署(nacos+gateway)

    1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...

  3. Spring Cloud GateWay基于nacos如何去做灰度发布

    如果想直接查看修改部分请跳转 动手-点击跳转 本文基于 ReactiveLoadBalancerClientFilter使用RoundRobinLoadBalancer 灰度发布 灰度发布,又称为金丝 ...

  4. Spring Cloud Alibaba学习笔记(15) - 整合Spring Cloud Gateway

    Spring Cloud Gateway 概述 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Netty.Reactor以及WEbFlux构建,它 ...

  5. 微服务实战系列(四)-注册中心springcloud alibaba nacos

    1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...

  6. Linux部署Nacos

    此处演示Nacos在Linux(CentOS7)环境中单机版部署,此处演示1.3.0版本. 一.官网下载压缩包 https://github.com/alibaba/nacos/releases 二. ...

  7. Gateway服务网关 (入门到使用)

    Gateway服务网关 Gateway也要作为微服务注册到nacos中 Zuul也是网关但比较老是一种阻塞式编程:Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 ...

  8. Gateway服务网关+过滤器

    为什么需要网关 Gateway网关是我们服务的守门神,所有微服务的统一入口. 网关的核心功能特性: 请求路由 权限控制 限流 架构图: 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果 ...

  9. 微服务学习计划——SpringCloud

    微服务学习计划--SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服务的要求也越来 ...

  10. JavaScript高级 引用类型(二)《JavaScript高级程序设计(第三版)》

    五.Function类型 是JS中最重要的一种引用类型 构造方式:(三种) 函数声明: 函数表达式定义: 函数构造器: 没有重载: 如果有两个相同函数名的函数,执行时,执行最近被定义的一次. 函数声明 ...

随机推荐

  1. 鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换

    鸿蒙应用开发从入门到入行 第八天 - Tabs选项卡 导读:在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件 首先说一声抱歉,比较忙很久没更新了.但放心吧,目前该忙 ...

  2. idea 2023.1.2 破解/激活

    参考:(感谢作者提供的破解教程,谢谢) IntelliJ IDEA 2023.1.1最新激活破解教程(永久激活,亲测有效) - 异常教程 (exception.site) 下载idea : 链接:ht ...

  3. 浅谈 IoT 如何助力制造业企业实现数字化落地

    物联网作为新一代信息技术的重要组成部分,正在加速渗透到各行各业,成为经济社会数字化转型的关键支撑.根据中商产业研究院发布的<2022-2027 年中国物联网市场需求预测及发展趋势前瞻报告> ...

  4. 多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用

    一.功能特点 组件同时集成了导出数据到csv.xls.pdf和打印数据. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便. 同时支持QTableView.QTab ...

  5. 即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 24 期. [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://w ...

  6. JVM实战—5.G1垃圾回收器的原理和调优

    大纲 1.G1垃圾回收器的工作原理 2.G1分代回收原理-性能为何比传统GC好 3.使用G1垃圾回收器时应如何设置参数 4.如何基于G1垃圾回收器优化性能 5.问题汇总 1.G1垃圾回收器的工作原理 ...

  7. MSM8953/SDM450 去PMI的USB3.0 TYPE-C Micro USB OTG功能适配

    提前说明一下有哪些"坑". 1.PM8953 GPIO_8的TZ权限 2.PM8953 GPIO_8寄存器的写入保护 3.去掉高通默认的ID检测 4.增加dwc3的ID检测 5.增 ...

  8. Python 安装package 问题汇总

    1. pip 命令使用国内源安装 pip install torch==1.8.1 -i https://mirrors.aliyun.com/pypi/simple/腾讯云: https://mir ...

  9. WPF 透明背景窗体

    <Window x:Class="WpfApplication8.MainWindow" xmlns="http://schemas.microsoft.com/w ...

  10. Practical Secure Aggregation for Privacy-Preserving Machine Learning

    1 介绍 本文是谷歌团队发在CCS2017上的文章,旨在解决联邦学习中安全聚合的问题. 安全聚合:多方参与者将信息传递给聚合者,聚合者除了知道这个信息的总和不能知道任何一个特定参与者的信息. 在这篇文 ...