spring-cloud-gateway静态路由
为什么引入 API 网关
使用 API 网关后的优点如下:
- 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
- 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
- 减少了客户端与各个微服务之间的交互次数。
基本环境见 spring-cloud-gateway 简介, 项目中 provider1 的 maven 配置在此做下更正
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-learning</artifactId>
<groupId>cn.idea360</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>idc-provider1</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
静态路由基本实现
静态路由比较简单,这里做简单实现。
更改路由模块 application.yml 配置,更改后的配置文件如下:
server:
port: 2000
spring:
application:
name: idc-gateway
redis:
host: localhost
port: 6379
timeout: 6000ms # 连接超时时长(毫秒)
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
cloud:
consul:
host: localhost
port: 8500
gateway:
discovery:
locator:
enabled: true # gateway可以通过开启以下配置来打开根据服务的serviceId来匹配路由,默认是大写
routes:
- id: provider1 # 路由 ID,保持唯一
uri: lb://idc-provider1 # uri指目标服务地址,lb代表从注册中心获取服务
predicates: # 路由条件。Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
- Path=/p/**
filters:
- StripPrefix=1 # 过滤器StripPrefix,作用是去掉请求路径的最前面n个部分截取掉。StripPrefix=1就代表截取路径的个数为1,比如前端过来请求/test/good/1/view,匹配成功后,路由到后端的请求路径就会变成http://localhost:8888/good/1/view
- id: provider2 # 路由 ID,保持唯一
uri: lb://idc-provider2 # uri指目标服务地址,lb代表从注册中心获取服务
predicates: # 路由条件。Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
- Path=/p2/**
filters:
- StripPrefix=1 # 过滤器StripPrefix,作用是去掉请求路径的最前面n个部分截取掉。StripPrefix=1就代表截取路径的个数为1,比如前端过来请求/test/good/1/view,匹配成功后,路由到后端的请求路径就会变成http://localhost:8888/good/1/view
测试
执行以下请求测试路由 1
curl http://localhost:2000/p/provider1/1
结果 返回 2001 。说明成功路由到了 provider1 服务。
执行以下请求测试路由 2
curl http://localhost:2000/p2/provider2
返回 {"port":"2002"} 。说明成功路由到了 provider2 服务。
Predicate 断言条件
1 通过请求参数匹配
Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。
...
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Query=username
filters:
- StripPrefix=1
这样配置,只要请求中包含 username 属性的参数即可匹配路由。否则 404
测试
curl http://localhost:2000/p/provider1/1?username=admin
经过测试发现只要请求汇总带有 username 参数即会匹配路由,不带 username 参数则不会匹配。
还可以将 Query 的值以键值对的方式进行配置,这样在请求过来时会对属性值和正则进行匹配,匹配上才会走路由。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Query=username, ad.
filters:
- StripPrefix=1
这样只要当请求中包含 username 属性并且参数值是以 admin 开头的长度为三位的字符串才会进行匹配和路由。
测试
curl http://localhost:2000/p/provider1/1?username=adm
测试可以返回页面代码,将 username 的属性值改为 admin 再次访问就会报 404,证明路由需要匹配正则表达式才会进行路由。
2 通过 Header 属性匹配
Header Route Predicate 和 Cookie Route Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Header=token, \d+
filters:
- StripPrefix=1
测试
curl http://localhost:2000/p/provider1/1 -H "token:11"
则返回页面代码证明匹配成功。将参数-H "token:11"改为-H "token:spring"再次执行时返回 404 证明没有匹配。
3 通过 Cookie 匹配
Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Cookie=sessionId, test
filters:
- StripPrefix=1
使用 curl 测试,命令行输入:
curl http://localhost:2000/p/provider1/1 --cookie "sessionId=test"
则会返回页面代码,如果去掉--cookie "sessionId=test",后台会报 404 错误。
4 通过 Host 匹配
Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Host=**.baidu.com
filters:
- StripPrefix=1
使用 curl 测试,命令行输入:
curl http://localhost:2000/p/provider1/1 -H "Host: www.baidu.com"
curl http://localhost:2000/p/provider1/1 -H "Host: md.baidu.com"
经测试以上两种 host 均可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。
5 通过请求方式匹配
可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- Method=GET
filters:
- StripPrefix=1
使用 curl 测试,命令行输入:
curl http://localhost:2000/p/provider1/1
测试返回页面代码,证明匹配到路由,我们再以 POST 的方式请求测试。
curl -X POST http://localhost:2000/p/provider1/1
返回 404 没有找到,证明没有匹配上路由
6 通过请求路径匹配
Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/{segment}
- Method=POST
filters:
- StripPrefix=1
如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。
7 通过请求 ip 地址进行匹配
Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为 1),例如 192.168.124.5/16 (其中 192.168.124.5 是 IP 地址,16 是子网掩码)。
- id: provider1
uri: lb://idc-provider1
predicates:
- Path=/p/**
- RemoteAddr=192.168.124.5/16
filters:
- StripPrefix=1
可以将此地址设置为本机的 ip 地址进行测试。
curl http://192.168.124.5:2000/p/provider1/1
如果请求的远程地址是 192.168.124.5,则此路由将匹配。
8 组合使用
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发
结语
本篇到此结束,欢迎大家关注公众号【当我遇上你】。
spring-cloud-gateway静态路由的更多相关文章
- 通过Nacos动态刷新Spring Cloud Gateway的路由
通过Nacos动态刷新Spring Cloud Gateway的路由 一.背景 二.解决方案 三.实现功能 四.实现步骤 1.网关服务的实现 1.pom文件 2.bootstrap.yml配置文件 3 ...
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...
- springcloud3(五) spring cloud gateway动态路由的四类实现方式
写这篇博客主要是为了汇总下动态路由的多种实现方式,没有好坏之分,任何的方案都是依赖业务场景需求的,现在网上实现方式主要有: 基于Nacos, 基于数据库(PosgreSQL/Redis), 基于Mem ...
- spring cloud gateway网关路由分配
1, 基于父工程,新建一个模块 2,pom文件添加依赖 <dependencies> <dependency> <groupId>org.springframewo ...
- Spring Cloud Alibaba学习笔记(16) - Spring Cloud Gateway 内置的路由谓词工厂
Spring Cloud Gateway路由配置的两种形式 Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务,在上文博客的示例中我们就已经使 ...
- Spring cloud gateway 如何在路由时进行负载均衡
本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...
- Spring cloud gateway
==================================为什么需要API gateway?==================================企业后台微服务互联互通, 因为 ...
- Spring Cloud Gateway服务网关
原文:https://www.cnblogs.com/ityouknow/p/10141740.html Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gatewa ...
- 网关服务Spring Cloud Gateway(一)
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- 微服务架构之spring cloud gateway
Spring Cloud Gateway是spring cloud中起着非常重要的作用,是终端调用服务的入口,同时也是项目中每个服务对外暴露的统一口径,我们可以在网关中实现路径映射.权限验证.负载均衡 ...
随机推荐
- java基础进阶篇(四)_HashMap------【java源码栈】
目录 一.前言 二.特点和常见问题 二.接口定义 三.初始化构造函数 四.HashMap内部结构 五.HashMap的存储分析 六.HashMap的读取分析 七.常用方法 八.HashMap 的jav ...
- 谈谈集合.Stream Api
1. 什么是stream API Java8提供的stream API可以让程序员像操作数据库一样操作集合.Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码 ...
- promise迷你书-读书笔记
Promise三种类型 Constructor 使用Promise构造器来实例化一个promise对象 var promise = new Promise(function(resolve,rejec ...
- call 和 apply 和 bind的区别
有些东西说忘就往,每天记录自己忘记的东西重新学习一遍,挺好 作用:call()和apply()用法都是一样的,改变this的指向问题 区别:接收参数的方式不同, (bind 方法是附加在函数调用后面使 ...
- deepin15.11安装N卡驱动,实测!!!(可解决N卡电脑关机卡屏)
前言:deepin(深度)是一款由武汉深之度公司研发的一款适合国人日常学习的linux系统,其UI精美,美过Mac.它对于中国用户的一个亮点就是QQ微信等国软件傻瓜式安装(类似安卓应用商店安装),如果 ...
- 关于form表单:hover没有修改表单子元素样式
原来在写todolist的时候遇到的一个问题 是关于form表单的hover属性设置背景颜色 想要实现的效果如下: 但是一开始直接给form加hover选择器的时候是这样: 可以看到这样子直接加会使得 ...
- 编译putty 源码去掉 Are you sure you want to close this session? 提示
0, 为什么要编译 putty ?在关闭窗口的时候,会弹出一个 Are you sure you want to close this session?要把这个去掉.当然也可以用 OD 之类的来修改. ...
- 如何创建一个自定义的`ErrorHandlerMiddleware`方法
在本文中,我将讲解如何通过自定义ExceptionHandlerMiddleware,以便在中间件管道中发生错误时创建自定义响应,而不是提供一个"重新执行"管道的路径. 作者:依乐 ...
- 我要打十个!详解建造者模式(builder pattern)
前言 "我要打十个",其实是我要打十个野怪! 这十个野怪呢,它们有不同的技能.装备和武器,长得也不一样.这里野怪是一个蛮复杂的对象,由各个不同的部分组成(技能.装备.武器等),不同 ...
- Python 执行 javascript PyExecJS 模块
PyExecJS 安装 pip install PyExecJS PyExecJS 的基本使用: >>> import execjs >>> execjs.eval ...