最新要闻
- 环球热资讯!公司装修费用计入哪里(公司装修费用计入什么科目)
- 外卖小哥骑车摔倒被雨棚刺脖身亡:擅自加装极其危险 北京已禁止_当前热议
- 【全球速看料】女孩考上清华:家人放烟花前向邻居报备 收到满满祝福
- 希捷发布首款PCIe 5.0 SSD:残血10GB/s但写不死!1TB只需1300元 天天即时
- 云南陇川发现恐龙时代植物:蕨类植物之王 当前聚焦
- 中汽协副秘书长陈士华:目前仍维持全年汽车市场3%的增长目标-前沿热点
- 分享!宁波正规的人流医院【2023精选】宁波人流医院哪家好 天天观点
- 网贷逾期会有罚息吗?网贷逾期多久会被起诉
- 东安动力:诉请天际汽车支付公司欠款,涉及货款1611.23万元及利息
- 东至县经开区:村企共建奏响发展和美之音 头条焦点
- 世界新资讯:全市生态环境“美丽指数”稳步提升
- 环球快看点丨吃错药可能有生命危险?不同类型的药到底该怎么吃?
- 海南自贸港法律法规普法云直播宣讲麻精药品滥用危害-全球短讯
- 世界看点:国盾量子(688027.SH):拟与中科大就5项专利及2项专有技术续签相关实施许可合同
- 福特董事长坦言美国无法与中国电动汽车竞争
- 【世界速看料】AI赋能文明发展 文明铸魂技术创新
广告
手机
环球视点!津膜科技(300334.SZ):控股股东完成增持1.43%股份
2022年便携式储能行业发展策略以及项目规划原则
- 环球视点!津膜科技(300334.SZ):控股股东完成增持1.43%股份
- 2022年便携式储能行业发展策略以及项目规划原则
- 环球热门:重庆咔嚓影视文化传媒有限公司_重庆清一色影视传媒有限公司
- 全球连线 | 中国工程助力巴巴多斯粮食安全
- 有空来下成三棋(对于有空来下成三棋简单介绍)
- 世界要闻:银行23H1上市行业绩前瞻:业绩U型底部
家电
Spring Cloud Gateway编码实现任意地址跳转
(相关资料图)
欢迎访问我的GitHub本篇概览作为《Spring Cloud Gateway实战》系列的第十四篇,本文会继续发掘Spring Cloud Gateway的潜力,通过编码体验操控网关的乐趣,开发出一个实用的功能:让Spring Cloud Gateway应用在收到请求后,可以按照业务的需要跳转到任意的地址去一般路由规则先来看一个普通的路由规则,如下所示,意思是将所有/hello/**的请求转发到http://127.0.0.1:8082这个地址去:这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
spring: application: name: hello-gateway cloud: gateway: routes: - id: path_route uri: http://127.0.0.1:8082 predicates: - Path=/hello/**
上述规则的功能如下图所示,假设这就是生产环境的样子,192.168.50.99:8082是提供服务的后台应用:特殊规则以上是常规情况,但也有些特殊情况,要求SpringCloud Gateway把浏览器的请求转发到不同的服务上去如下图所示,在之前的环境中增加了另一个服务(即蓝色块),假设蓝色服务代表测试环境浏览器发起的/hello/str请求中,如果header中带有tag-test-user,并且值等于true,此时要求SpringCloud Gateway把这个请求转发到测试环境如果浏览器的请求header中没有tag-test-user,SpringCloud Gateway需要像以前那样继续转发到192.168.50.99:8082很明显,上述需求难以通过配置来实现,因为转发的地址和转发逻辑都是围绕业务逻辑来定制的,这也就是本篇的目标:对同一个请求path,可以通过编码转发到不同的地方去实现上述功能的具体做法是:自定义过滤器设计编码之前先设计,把关键点想清楚再动手今天咱们要开发一个SpringCloud Gateway应用,里面新增一个自定义过滤器实现这个功能需要三个知识点作为基础,也就是说,您会通过本篇实战掌握以下知识点:自定义过滤器自定义过滤器的配置参数和bean的映射编码构造Route实例用思维导图将具体工作内容展开,如下图所示,咱们就按部就班的实现吧:源码下载本篇实战中的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
spring-cloud-tutorials com.bolingcavalry 1.0-SNAPSHOT 4.0.0 gateway-dynamic-route com.bolingcavalry common ${project.version} org.springframework.cloud spring-cloud-starter-gateway org.springframework.boot spring-boot-maven-plugin com.bolingcavalry.gateway.GatewayDynamicRouteApplication repackage
启动类是普通的SpringBoot启动类:package com.bolingcavalry.gateway;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class GatewayDynamicRouteApplication { public static void main(String[] args) { SpringApplication.run(GatewayDynamicRouteApplication.class,args); }}
接下来是本篇的核心,自定义过滤器类,代码中已经添加了详细的注释,有几处要注意的地方稍后会提到:package com.bolingcavalry.gateway.filter;import lombok.Data;import lombok.ToString;import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.cloud.gateway.route.Route;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;import org.springframework.util.MultiValueMap;import org.springframework.web.util.UriComponentsBuilder;import java.net.URI;import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;@Component@Slf4jpublic class BizLogicRouteGatewayFilterFactory extends AbstractGatewayFilterFactory { private static final String TAG_TEST_USER = "tag-test-user"; public BizLogicRouteGatewayFilterFactory() { super(BizLogicRouteConfig.class); } @Override public GatewayFilter apply(BizLogicRouteConfig config) { return (exchange, chain) -> { // 本次的请求对象 ServerHttpRequest request = exchange.getRequest(); // 调用方请求时的path String rawPath = request.getURI().getRawPath(); log.info("rawPath [{}]", rawPath); // 请求头 HttpHeaders headers = request.getHeaders(); // 请求方法 HttpMethod httpMethod = request.getMethod(); // 请求参数 MultiValueMap queryParams = request.getQueryParams(); // 这就是定制的业务逻辑,isTestUser等于ture代表当前请求来自测试用户,需要被转发到测试环境 boolean isTestUser = false; // 如果header中有tag-test-user这个key,并且值等于true(不区分大小写), // 就认为当前请求是测试用户发来的 if (headers.containsKey(TAG_TEST_USER)) { String tageTestUser = headers.get(TAG_TEST_USER).get(0); if ("true".equalsIgnoreCase(tageTestUser)) { isTestUser = true; } } URI uri; if (isTestUser) { log.info("这是测试用户的请求"); // 从配置文件中得到测试环境的uri uri = UriComponentsBuilder.fromHttpUrl(config.getTestEnvUri() + rawPath).queryParams(queryParams).build().toUri(); } else { log.info("这是普通用户的请求"); // 从配置文件中得到正式环境的uri uri = UriComponentsBuilder.fromHttpUrl(config.getProdEnvUri() + rawPath).queryParams(queryParams).build().toUri(); } // 生成新的Request对象,该对象放弃了常规路由配置中的spring.cloud.gateway.routes.uri字段 ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).method(httpMethod).headers(httpHeaders -> httpHeaders = httpHeaders).build(); // 取出当前的route对象 Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); //从新设置Route地址 Route newRoute = Route.async().asyncPredicate(route.getPredicate()).filters(route.getFilters()).id(route.getId()) .order(route.getOrder()).uri(uri).build(); // 放回exchange中 exchange.getAttributes().put(GATEWAY_ROUTE_ATTR,newRoute); // 链式处理,交给下一个过滤器 return chain.filter(exchange.mutate().request(serverHttpRequest).build()); }; } /** * 这是过滤器的配置类,配置信息会保存在此处 */ @Data @ToString public static class BizLogicRouteConfig { // 生产环境的服务地址 private String prodEnvUri; // 测试环境的服务地址 private String testEnvUri; }}
上述代码中要注意的地方如下:BizLogicRouteConfig是过滤器的配置类,可以在使用过滤器时在配置文件中配置prodEnvUri和testEnvUri的值,在代码中可以通过这两个字段取得配置值过滤器的工厂类名为BizLogicRouteGatewayFilterFactory,按照规则,过滤器的名字是BizLogicRoute在apply方法中,重新创建ServerHttpRequest和Route对象,它们的参数可以按照业务需求随意设置,然后再将这两个对象设置给SpringCloud gateway的处理链中,接下来,处理链上的其他过滤拿到的就是新的ServerHttpRequest和Route对象了配置假设生产环境地址是http://127.0.0.1:8082,测试环境地址是http://127.0.0.1:8087,整个SpringCloud Gateway应用的配置文件如下,可见使用了刚刚创建的过滤器,并且为此过滤器配置了两个参数:server: #服务端口 port: 8086spring: application: name: gateway-dynamic-route cloud: gateway: routes: - id: path_route uri: http://0.0.0.0:8082 predicates: - Path=/hello/** filters: - name: BizLogicRoute args: prodEnvUri: http://127.0.0.1:8082 testEnvUri: http://127.0.0.1:8087
至此,编码完成了,启动这个服务开发和启动后台服务,模拟生产和测试环境接下来开始验证功能是否生效,咱们要准备两个后台服务:模拟生产环境的后台服务是provider-hello,监听端口是8082,其/hello/str接口的返回值是Hello World, 2021-12-12 10:53:09模拟测试环境的后台服务是provider-for-test-user,监听端口是8087,其/hello/str接口的返回值是Hello World, 2021-12-12 10:57:11 (from test enviroment)(和生产环境相比,返回内容多了个(from test enviroment)),对应Controller参考如下:package com.bolingcavalry.provider.controller;import com.bolingcavalry.common.Constants;import org.springframework.web.bind.annotation.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;@RestController@RequestMapping("/hello")public class Hello { private String dateStr(){ return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); } /** * 返回字符串类型 * @return */ @GetMapping("/str") public String helloStr() { return Constants.HELLO_PREFIX + ", " + dateStr() + " (from test enviroment)"; }}
以上两个服务,对应的代码都在我的Github仓库中,如下图红框所示:启动gateway-dynamic-route、provider-hello、provider-for-test-user服务此时,SpringCloud gateway应用和两个后台服务都启动完成,情况如下图,接下来验证刚才开发的过滤器能不能像预期那样转发:验证用postman工具向gateway-dynamic-route应用发起一次请求,返回值如下图红框所示,证明这是provider-hello的响应,看来咱们的请求已经正常到达:再发送一次请求,如下图,这次在header中加入键值对,得到的结果是provider-for-test-user的响应至此,过滤器的开发和验证已经完成,通过编码,可以把外部请求转发到任何咱们需要的地址去,并且支持参数配置,这个过滤器还有一定的可配置下,减少了硬编码的比率,如果您正在琢磨如何深度操控SpringCloud Gateway,希望本文能给您一些参考;欢迎关注博客园:程序员欣宸学习路上,你不孤单,欣宸原创一路相伴...
关键词:
Spring Cloud Gateway编码实现任意地址跳转
【全球新视野】6月27日上海瑞洵天然橡胶主流报价小幅上调
天天热资讯!6月27日国内黄金期货收平
中国免费听课网-短讯
康熙三十二年精美壁画墓现世!河南考古又有新发现 当前资讯
天天新动态:供给侧结构性改革的重点是什么准确答案_供给侧结构性改革的重点任务包括
海伦哲:上半年净利润预增51.61%-61.55%_快讯
三川智慧:公司水表产品在国内多个省、市、区广泛应用,市场没有明显的区域性和垄断性
扬杰科技:公司MOS、二三极管等功率器件产品已供货英伟达,主要运用在显卡上
联合水务(603291)龙虎榜数据(06-27)
永州一中举行2023年高校见面会
环球视点!津膜科技(300334.SZ):控股股东完成增持1.43%股份
腾达建设(600512.SH):子公司竞得11.27亿元土地使用权|焦点讯息
苹果手机怎么定位查找_苹果手机怎么定位_环球关注
A股日报|6月26日沪指收跌1.48%,两市成交额达9773亿元
环球热资讯!公司装修费用计入哪里(公司装修费用计入什么科目)
中铁建设集团有限公司领导名单(中铁建设集团有限公司)
环球热推荐:折纸盒子的折法(折纸盒)
中文传媒:截至本公告日,公司为所属子公司银行授信提供担保合同累计余额为13.2亿元 环球今热点
国内在建最长干线公路湖底隧道-竺山湖隧道无锡段主体完工
全球速讯:助力科技型企业与文化类产业深度融合 厦门科技文化产业创新基地揭牌
《真人快打1》惩罚怒退玩家终结技仍保留 怒退后所用角色将自我了断 前沿热点
【全球独家】钧达股份:公司及控股子公司对外提供的担保累计金额为人民币约75.24亿元
每日焦点!火上浇油是化学性质吗_火上浇油在化学中什么意思简介介绍
外卖小哥骑车摔倒被雨棚刺脖身亡:擅自加装极其危险 北京已禁止_当前热议
昆山张浦:“回头客”追投扩建-世界速递
虎跳崖的故事_虎跳崖
世界报道:证券之星ESG联盟:江南奕帆,勇于开拓、精益制造
四川大学强基计划2022_四川大学贴吧-当前热闻
2022年便携式储能行业发展策略以及项目规划原则
中国跨境电商逐鹿世界舞台-最新消息
铁艺围墙图集 12j9_铁艺围墙图集15j001
选专业,到底听谁的? 天天亮点
全球头条:资产负债表的编制依据及查错方法
环球热门:重庆咔嚓影视文化传媒有限公司_重庆清一色影视传媒有限公司
全球看点:做强电网 为保山市经济社会发展充电赋能
每日讯息!双生视界wiki图鉴_双生视界剧情媚宅
全球连线 | 中国工程助力巴巴多斯粮食安全
全球快看:下半年“翻身”要看新能源?相关主题基金已强势反弹20%
菏泽市公安局党委副书记、政委庞少杰接受纪律审查和监察调查
环球快资讯:巧用叠词写出优美句子:写人记事、写景状物都精彩
天津津南城投完成发行6亿超短期融资券 利率为6.9%-环球关注
有空来下成三棋(对于有空来下成三棋简单介绍)
全球最资讯丨达产营收4.65亿元!嘉定氢能港引入新项目
【全球速看料】女孩考上清华:家人放烟花前向邻居报备 收到满满祝福
希捷发布首款PCIe 5.0 SSD:残血10GB/s但写不死!1TB只需1300元 天天即时
云南陇川发现恐龙时代植物:蕨类植物之王 当前聚焦
今日贵金属行情分析:黄金价格面临坚实支撑 白银价格上涨明显
赴中建西部建设新疆调研绿色低碳混凝土技术|全球关注
中汽协副秘书长陈士华:目前仍维持全年汽车市场3%的增长目标-前沿热点
分享!宁波正规的人流医院【2023精选】宁波人流医院哪家好 天天观点
环球聚焦:张勇:“构建安全可信的人工智能”逐步成为行业共识 相关法律法规正在完善
世界要闻:银行23H1上市行业绩前瞻:业绩U型底部
上海崇明东滩鸟类国家级自然保护区科普教育基地7月1日开放 世界热议
三五天就涨一轮价!一个月,涨幅超72%!经销商疯狂抢货!什么这么火?
拥抱达沃斯 天津准备好了!以饱满热情和全新姿态亮相世界舞台-世界信息
上海市交通发展研究中心是事业单位吗 世界速递
2023年成都中考成绩查询网站入口(官网+小程序) 天天快看点
观点:天天最资讯丨厦门地铁规划图2030 结合新一轮地铁规划-快讯
当前视点!鹤峰县住建局全力推进老旧小区改造工作
许昌经济技术开发区召开经济运行分析会-环球速递
聚焦:离职后是否还要遵循保密协议
热点!雷暴大风!冰雹!刚刚,洛阳发布重要天气报告
河南省兰考县沿黄高质量发展搬迁安置项目封顶仪式举行-世界今日报
开封市顺河回族区政务服务和大数据管理局打造15分钟便民服务圈 提升服务精准度-环球今日报
预告:上海市政府29日10时举行新闻发布会介绍2023世界人工智能大会筹备等有关情况|热议
网贷逾期会有罚息吗?网贷逾期多久会被起诉
邮储银行举办2023年资本市场开放日活动 详解深耕三农金融蓝海
《中国智能卫浴电器产业发展研究报告(2023) 》正式发布|每日速递
外媒:卢卡申科称,“瓦格纳叛乱”期间白俄罗斯军队进入全面战备状态 全球资讯
环球热推荐:欧普康视:视光服务和产品的总需求还是在增长的
东安动力:诉请天际汽车支付公司欠款,涉及货款1611.23万元及利息
微动态丨宾川县多举措筑牢防汛备汛“安全堤”
当前热点-广西壮族自治区北流市发布雷电橙色预警
郑嘉颖开游艇趴为娇妻庆生!32岁陈凯琳穿泳衣秀身材,拥吻太甜蜜
焦点日报:磕糖又氪金,女性向游戏在「她世界」里捞金
在果园养鸡对果树有伤害吗? 焦点消息
东至县经开区:村企共建奏响发展和美之音 头条焦点
【环球聚看点】青出于蓝胜于蓝出自哪篇文章?青出于蓝而胜于蓝是什么颜色?
即时:省教育考试院提醒明起填志愿
焦点速递!每日视点!彩礼返还限制性原则是什么?彩礼钱一般给多少?
焦点热文:国网无棣供电公司:两个延伸 一个协同 提升物资计划管理水平
天天简讯:记者:里尔依然拒绝放主帅丰塞卡去利雅得新月
网信办开展暑期未成年人网络环境整治行动
当前视讯!桐柏县法院举办特邀调解组织及特邀调解员业务技能培训会_世界即时
上海新一轮重点产业领域人才专项奖励申报启动 涉生物医药、人工智能等八个领域 天天信息
环球简讯:win10开机转圈卡死怎么修复?
上市不到一年 海正生材财务总监张本胜辞职 环球观焦点
每日快报!西蒙·温切斯特:中国并没有对美国构成威胁
每日快报!陆家嘴国际会计中心启动 金融城发布全球会计服务商支持引领计划
世界新资讯:全市生态环境“美丽指数”稳步提升
全球看热讯:中央网信办:“清朗·2023年暑期未成年人网络环境整治”专项行动启动
北京市石景山区部分道路被指定作为自动驾驶车辆测试道路
环球快看点丨吃错药可能有生命危险?不同类型的药到底该怎么吃?
海南自贸港法律法规普法云直播宣讲麻精药品滥用危害-全球短讯
世界经济论坛总裁:与会嘉宾对中国经济充满期待
科技感爆棚 互动性拉满 这个沉浸式禁毒宣传教育基地开馆! 天天微资讯
筑友智造科技(00726)6月26日斥2.69万港元回购13万股-天天新资讯
湖北碾盘山水利水电枢纽工程首台机组正式投产发电
环球快播:山东省烟台市福山区市场监管局开展汛期电梯安全应急演练