微服务实战系列(八)-网关springcloud gateway自定义规则
1. 场景描述
先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路由文件,动态加载路由文件中的路由规则。
2.解决方案
2.1 解决思路
新建总的监控总类,监控网关服务路由规则配置文件,然后每个路由配置文件再监控内容自己文件内容是否变化,动态加载到springcloud gateway中。
2.2 配置规则说明
bc-ruanjianlaowang-all.yaml是需要加载的配置文件名称,创建的有监听,当新增新的自定义路由规则文件,会自动去刷自定义规则。
gateways: bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json
创建自定义路由规则文件,目前已经新建了两个网关服务的文件,bc-ruanjianlaowang-demo.json,bc-ruanjianlaowang-auth.json,只需配置自定义规则即可,后续有其他网关服务,需新增自定义规则json文件,然后在bc-ruanjianlaowang-all.yaml配置下文件名称即可,不用重启网关,会自动实时动态加载生效。
2.2.1 规则示例说明
[
{
"id": "demo-router3","uri":"lb://demo","order": 0,
"filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],
"predicates":
[{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}]
}
]
说明:
(1) "id": "demo-router3",id尽量用本中心名称+router+序号,要唯一;
(2)"uri":"lb://demo",这里可以是其他中心在注册中心的服务名称,假如有多个服务的话,默认负载均衡,轮询访问后面提供的对应服务;也可以这样配置:"uri":"http://10.192.168.10.:8010/",这样的配置是针对老服务没在注册中心注册,需要配置路径。
(3)"filters": [{"name":"StripPrefix","args":{"_genkey_0":"1"}}],这里的含义是默认去掉第一层路径就相当于去掉demo进行访问
(4) [{"args": {"pattern":"/demo/test/v?1"},"name":"Path"}] 这里就是具体的自定义配置规则了,依照下面的规则进行配置。
2.2.2 路径自定义规则说明
因springcloud gateway使用的是spring的AntPathMatcher进行路径匹配,简单把自定义配置规则复制过来说明,也可以直接百度看下。
(1)可以做URLs匹配,规则如下
?匹配一个字符
*匹配0个或多个字符
**匹配0个或多个目录
如果你觉得文章对你有些帮助,欢迎微信搜索「软件老王」第一时间阅读或交流!
(2)用例如下
/trip/api/*x 匹配 /trip/api/x,/trip/api/ax,/trip/api/abx ;但不匹配 /trip/abc/x;
/trip/a/a?x 匹配 /trip/a/abx;但不匹配 /trip/a/ax,/trip/a/abcx
/**/api/alie 匹配 /trip/api/alie,/trip/dax/api/alie;但不匹配 /trip/a/api
/**/*.htmlm 匹配所有以.htmlm结尾的路径
/app/*.x 匹配(Matches)所有在app路径下的.x文件
/app/p?ttern 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
/**/example 匹配(Matches) /app/example, /app/foo/example, 和 /example
/app/**/dir/file. 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo
/bar/dir/file.pdf, 和 /app/dir/file.java
/**/*.jsp 匹配(Matches)任何的.jsp 文件
(3)另外说明
springcloud或者说spring对路径匹配对正则支持的不是太好,但是也可以用,简单拿过来说一下。
符号 {spring:[a-z]+}
示例代码:
@RequestMapping("/index/{username:[a-b]+}")
@ResponseBody
public String index(@PathVariable("username") String username){
System.out.println(username);
return username;
}
结果:
index/ab true 输出 ab
index/abbaaa true 输出 abbaaa
index/a false 404错误
index/ac false 404错误
网关原代码是默认开放全部服务,新代码后会按照自定义规则来,假如未配置,会禁止跳转。
更多知识请关注公众号:「软件老王」,IT技术与相关干货分享,回复关键字获取对应干货,java,送必看的10本“武功秘籍”;图片,送100多万张可商用高清图片;面试,送刚毕业就能月薪“20k”的java面试题,软考,送官方pdf书籍与通关论文,后续会不断更新,比如“工具”,“视频“等,已经在整理中。
微服务实战系列(八)-网关springcloud gateway自定义规则的更多相关文章
- go-zero微服务实战系列(十一、大结局)
本篇是整个系列的最后一篇了,本来打算在系列的最后一两篇写一下关于k8s部署相关的内容,在构思的过程中觉得自己对k8s知识的掌握还很不足,在自己没有理解掌握的前提下我觉得也很难写出自己满意的文章,大家看 ...
- go-zero微服务实战系列(三、API定义和表结构设计)
前两篇文章分别介绍了本系列文章的背景以及根据业务职能对商城系统做了服务的拆分,其中每个服务又可分为如下三类: api服务 - BFF层,对外提供HTTP接口 rpc服务 - 内部依赖的微服务,实现单一 ...
- 微服务实战系列--Nginx官网发布(转)
这是Nginx官网写的一个系列,共七篇文章,如下 Introduction to Microservices (this article) Building Microservices: Using ...
- ASP.NET Core微服务实战系列
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...
- Chris Richardson微服务实战系列
微服务实战(一):微服务架构的优势与不足 微服务实战(二):使用API Gateway 微服务实战(三):深入微服务架构的进程间通信 微服务实战(四):服务发现的可行方案以及实践案例 微服务实践(五) ...
- 微服务实战系列(七)-网关springcloud gateway
1. 场景描述 springcloud刚推出的时候用的是netflix全家桶,路由用的zuul,但是据说zull1.0在大数据量访问的时候存在较大性能问题,2.0就没集成到springcloud中了, ...
- 微服务实战系列(四)-注册中心springcloud alibaba nacos
1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...
- Spring-cloud微服务实战【八】:API网关zuul
在前面的文章中,我们先后使用了eureka/ribbon/feign/hystrix搭建了一个看似完美的微服务了,那是否还有值得继续优化的地方呢?答案肯定是有的,如果从整个微服务内部来看,基本已经 ...
- 微服务实战系列(六)-网关springcloud zuul
1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zuul,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...
随机推荐
- oracle impdp 数据迁移 至RDS 亚马逊云
背景: 公司年底打算将aws rds11.2.0.4 oracle 数据库升级到19c,所以需要进行升级测试,所以需要我把线上的库数据迁移到一台测试的rds oracle 亚马逊云的数据库中,然后升级 ...
- Python发送get、post请求
import json import requests #获取北京天气 # #url= "https://wis.qq.com/weather/common?source=xw&we ...
- 项目介入EF Core
目前.Net主流的ORM有SqlSugar.Entity Framework.Dapper,其它的我就不列举了.其实和Java那边ibatis相比,他们都比较轻量.之前用ibatis开发,真的很麻烦, ...
- PHP - 读取EXCEL内容 存入数据库
<?php //设置请求头 header("Content-Type:text/html;charset=utf8"); header("Access-Contro ...
- Mac本地生成SSHKey的方法
1. 查看秘钥是否存在 打开终端查看是否已经存在SSH密钥:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除, 也可以直接删除, 2.生成新的秘钥, 命令如下 $ssh-keygen ...
- Git在windows上的设置详解
这几天在学习使用Git版本管理工具,发现期间的各种配置还是挺繁琐的,而且好多命令的确记不住,于是写个blog记录下来,方便以后查阅. 1. 首先到GitHub官网上下载最新的Git,然后装上,装的过程 ...
- CodeForces - 1114D-Flood Fill (区间dp)
You are given a line of nn colored squares in a row, numbered from 11 to nn from left to right. The ...
- 实际项目中遇到EF实体类的操作问题及操作方法
之前一直做ASP,都是直接写数据库操作语句,但是现在使用linq或者EF了,具体数据库操作不会了,遇到几个问题,然后经过查找资料解决了,记录一下. 一.遇到序列化问题 遇到循环引用问题,我的项目是一个 ...
- 12 props 传的是数组处理
<template> <div>InfoDetailed</div> </template> <script> export default ...
- C010:书号分解ISBN
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int prefix,groupIndentifier ...