Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

在上一篇《Spring Cloud构建微服务架构:服务网关(基础)》一文中,我们通过使用Spring Cloud Zuul构建了一个基础的API网关服务,同时也演示了Spring Cloud Zuul基于服务的自动路由功能。在本文中,我们将进一步详细地介绍关于Spring Cloud Zuul的路由功能,以帮助读者可以更好的理解和使用它,以完成更复杂的路由配置。

传统路由配置

所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由。

没有Eureka和Consul的服务治理框架帮助的时候,我们需要根据服务实例的数量采用不同方式的配置来实现路由规则:

  • 单实例配置:通过一组zuul.routes.<route>.pathzuul.routes.<route>.url参数对的方式配置,比如:
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.url=http://localhost:8080/

该配置实现了对符合/user-service/**规则的请求路径转发到http://localhost:8080/地址的路由规则,比如,当有一个请求http://localhost:1101/user-service/hello被发送到API网关上,由于/user-service/hello能够被上述配置的path规则匹配,所以API网关会转发请求到http://localhost:8080/hello地址。

  • 多实例配置:通过一组zuul.routes.<route>.pathzuul.routes.<route>.serviceId参数对的方式配置,比如:
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service

ribbon.eureka.enabled=false
user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/

该配置实现了对符合/user-service/**规则的请求路径转发到http://localhost:8080/http://localhost:8081/两个实例地址的路由规则。它的配置方式与服务路由的配置方式一样,都采用了zuul.routes.<route>.pathzuul.routes.<route>.serviceId参数对的映射方式,只是这里的serviceId是由用户手工命名的服务名称,配合<serviceId>.ribbon.listOfServers参数实现服务与实例的维护。由于存在多个实例,API网关在进行路由转发时需要实现负载均衡策略,于是这里还需要Spring Cloud Ribbon的配合。由于在Spring Cloud Zuul中自带了对Ribbon的依赖,所以我们只需要做一些配置即可,比如上面示例中关于Ribbon的各个配置,它们的具体作用如下:

  • ribbon.eureka.enabled:由于zuul.routes.<route>.serviceId指定的是服务名称,默认情况下Ribbon会根据服务发现机制来获取配置服务名对应的实例清单。但是,该示例并没有整合类似Eureka之类的服务治理框架,所以需要将该参数设置为false,不然配置的serviceId是获取不到对应实例清单的。
  • user-service.ribbon.listOfServers:该参数内容与zuul.routes.<route>.serviceId的配置相对应,开头的user-service对应了serviceId的值,这两个参数的配置相当于在该应用内部手工维护了服务与实例的对应关系。

不论是单实例还是多实例的配置方式,我们都需要为每一对映射关系指定一个名称,也就是上面配置中的<route>,每一个<route>就对应了一条路由规则。每条路由规则都需要通过path属性来定义一个用来匹配客户端请求的路径表达式,并通过urlserviceId属性来指定请求表达式映射具体实例地址或服务名。

服务路由配置

服务路由我们在上一篇中也已经有过基础的介绍和体验,Spring Cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的自动化维护,所以在使用服务路由配置的时候,我们不需要向传统路由配置方式那样为serviceId去指定具体的服务实例地址,只需要通过一组zuul.routes.<route>.pathzuul.routes.<route>.serviceId参数对的方式配置即可。

比如下面的示例,它实现了对符合/user-service/**规则的请求路径转发到名为user-service的服务实例上去的路由规则。其中<route>可以指定为任意的路由名称。

zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service

对于面向服务的路由配置,除了使用pathserviceId映射的配置方式之外,还有一种更简洁的配置方式:zuul.routes.<serviceId>=<path>,其中<serviceId>用来指定路由的具体服务名,<path>用来配置匹配的请求表达式。比如下面的例子,它的路由规则等价于上面通过pathserviceId组合使用的配置方式。

zuul.routes.user-service=/user-service/**

传统路由的映射方式比较直观且容易理解,API网关直接根据请求的URL路径找到最匹配的path表达式,直接转发给该表达式对应的url或对应serviceId下配置的实例地址,以实现外部请求的路由。那么当采用pathserviceId以服务路由方式实现时候,没有配置任何实例地址的情况下,外部请求经过API网关的时候,它是如何被解析并转发到服务具体实例的呢?

在Spring Cloud Netflix中,Zuul巧妙的整合了Eureka来实现面向服务的路由。实际上,我们可以直接将API网关也看做是Eureka服务治理下的一个普通微服务应用。它除了会将自己注册到Eureka服务注册中心上之外,也会从注册中心获取所有服务以及它们的实例清单。所以,在Eureka的帮助下,API网关服务本身就已经维护了系统中所有serviceId与实例地址的映射关系。当有外部请求到达API网关的时候,根据请求的URL路径找到最佳匹配的path规则,API网关就可以知道要将该请求路由到哪个具体的serviceId上去。由于在API网关中已经知道serviceId对应服务实例的地址清单,那么只需要通过Ribbon的负载均衡策略,直接在这些清单中选择一个具体的实例进行转发就能完成路由工作了。

示例仓库

  • Github:https://github.com/dyc87112/SpringCloud-Learning
  • 码云:https://gitee.com/didispace/SpringCloud-Learning/

推荐阅读

  • Spring Cloud构建微服务架构:服务网关(基础)【Dalston版】
  • Spring Cloud源码分析(四)Zuul:核心过滤器
  • Spring Cloud实战小贴士:Zuul处理Cookie和重定向
  • Spring Cloud实战小贴士:Zuul统一异常处理(一)
  • Spring Cloud实战小贴士:Zuul统一异常处理(二)
  • Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】

money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术动态 | Neo4j知识图谱的技术解析及案例分享

转载公众号 | DataFunTalk 合作分享&#xff1a;Jesus Barrasa-Neo4j-欧洲区售前和技术总监合作分享&#xff1a;丁可-Neo4j-亚太区高级技术顾问编辑整理&#xff1a;吴祺尧-加州大学圣地亚哥分校出品平台&#xff1a;DataFunTalk导读&#xff1a;Neo4j近年来与众多公司合作&am…

哈工大博士历时半年整理的《Pytorch常用函数函数手册》开放下载!内含200余个函数!...

近期有很多小伙伴在公众号后台咨询有没有关于Pytorch函数使用的学习资料。Pytorch是目前常用的深度学习框架之一&#xff0c;深受学生党的喜爱&#xff0c;小白本人也是使用的Pytorch框架。为了帮助更多小伙伴&#xff0c;小白学视觉团队整理了这份目前最全的Pytorch常用函数手…

LeetCode 984. 不含 AAA 或 BBB 的字符串(贪心)

1. 题目 给定两个整数 A 和 B&#xff0c;返回任意字符串 S&#xff0c;要求满足&#xff1a; S 的长度为 A B&#xff0c;且正好包含 A 个 ‘a’ 字母与 B 个 ‘b’ 字母&#xff1b;子串 ‘aaa’ 没有出现在 S 中&#xff1b;子串 ‘bbb’ 没有出现在 S 中。 示例 1&…

Spring Cloud构建微服务架构:服务网关(基础)【Dalston版】

通过之前几篇Spring Cloud中几个核心组件的介绍&#xff0c;我们已经可以构建一个简略的&#xff08;不够完善&#xff09;微服务架构了。比如下图所示&#xff1a; 我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现&#xff1b;而服务间通过Ribbo…

论文浅尝 | PASSLEAF:基于样本池的不确定性知识图谱嵌入半监督学习框架

笔记整理&#xff1a;陈一林&#xff0c;东南大学硕士&#xff0c;研究方向为不确定性知识图谱规则与推理。论文引用&#xff1a;Citation: Chen, Z.M., Yeh, M.Y. and Kuo, T.W., 2021, May. PASSLEAF: A Pool-bAsed Semi-Supervised LEArning Framework for Uncertain Knowle…

扔掉老破V100、A100,英伟达新一代计算卡H100来了

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

LeetCode 725. 分隔链表

1. 题目 给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1&#xff0c;也就是说可能有些部分为 null。 这k个部分应该按照在链表中出现的顺序进行输出&#xff0c;并且排在前面的…

会议交流 | 知识工程/知识图谱教学研讨会 暨 知识工程课程群虚拟教研室第一次教学研讨会...

日程安排时 间&#xff1a;2022年10月11日&#xff08;周二&#xff09;19:40-21:00地 点&#xff1a;虚拟教研室&#xff08;B版&#xff09;/ 腾讯会议&#xff1a;287 808 963主持人&#xff1a;知识工程课程群虚拟教研室带头人 天津大学教授 王鑫教学研讨会会议议程&#x…

@FeignClient中的@RequestMapping也被SpringMVC加载的问题解决

问题描述 在之前发布的《Spring Cloud实战小贴士&#xff1a;Feign的继承特性(伪RPC模式)》一文中&#xff0c;我们介绍了如果使用Feign的继承特性来完成服务的提供以及服务的消费&#xff0c;实现了类似RPC的编程模式。但是&#xff0c;仔细一些的读者可能已经发现一个问题&a…

GIF发明者感染新冠后去世,没有他就没有表情包

文 | 金磊 发自 凹非寺源 | 量子位GIF&#xff08;图形交换格式&#xff09;发明人Stephen Wilhite&#xff0c;被曝去世&#xff0c;享年74岁。▲Stephen Wilhite据The Verge表示&#xff0c;在经过与Wilhite的妻子Kathaleen交流之后&#xff0c;确认他是于上周因感染新冠病毒…

LeetCode 1073. 负二进制数相加(负数进制)

1. 题目 给出基数为 -2 的两个数 arr1 和 arr2&#xff0c;返回两数相加的结果。 数字以 数组形式 给出&#xff1a;数组由若干 0 和 1 组成&#xff0c;按最高有效位到最低有效位的顺序排列。例如&#xff0c;arr [1,1,0,1] 表示数字 (-2)3 (-2)2 (-2)0 -3。数组形式 的…

图谱实战 | 真实世界医疗知识图谱及临床事件图谱构建

转载公众号 | DataFunTalk分享嘉宾&#xff1a;李林峰博士 医渡云 技术创新副总裁编辑整理&#xff1a;田育珍 搜狗出品平台&#xff1a;DataFunTalk导读&#xff1a;今天介绍的主题是真实世界医疗知识图谱及临床事件图谱的构建。数据源主要来自于医院的EMR、HIS、LIS、RIS等系…

Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)

通过之前发布的《Spring Cloud构建微服务架构&#xff1a;服务消费者&#xff08;Feign&#xff09;》&#xff0c;我们已经学会如何使用Spring MVC的注解来绑定服务接口。我们几乎完全可以从服务提供方的Controller中依靠复制操作&#xff0c;来构建出相应的服务接口客户端&am…

这个北航妹子也太卷了...

大家好&#xff0c;今天介绍一位好朋友&#xff0c;毕业于北航的AI算法小姐姐 rumor。rumor刚毕业时从事量化工作&#xff0c;后来转岗到互联网做算法&#xff0c;斩获了众多大厂offer&#xff0c;下面是她跳槽时整理的算法工程师面试知识点&#xff1a;就拿其中的数据结构节点…

LeetCode 1138. 字母板上的路径

1. 题目 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]. 我们可以按下面的指令规则行动&#xff1a;如果方格存在&#xff0c;U…

开源开放 | 中药说明书实体识别数据集TCM-NER

OpenKG地址&#xff1a;http://openkg.cn/dataset/tcm-ner阿里云天池&#xff1a;https://tianchi.aliyun.com/dataset/dataDetail?dataId86819开放许可协议&#xff1a;CC BY-SA 4.0 &#xff08;署名相似共享&#xff09;贡献者&#xff1a;阿里云&#xff08;陈漠沙&#x…

【公益】开放一台Eureka注册中心给各位Spring Cloud爱好者

这是一篇博客福利&#xff01; 相信很多关注Spring Cloud的爱好者们&#xff0c;不论是读我的系列文章和书籍还是看其他朋友们写的博客佳文&#xff0c;都不可避免的启动多个项目来体验Spring Cloud带来的整套微服务架构方案。其中&#xff0c;Eureka注册中心几乎是每个试验都必…

首个视觉-语言预训练综述来了!

文 | Feilong Chen等编 | 陈萍源 | 机器之心一文了解视觉 - 语言预训练最新进展和新领域。让机器做出与人类相似的反应一直是 AI 研究不懈追求的目标。为了让机器具有感知和思考的能力&#xff0c;研究人员进行了一系列相关研究&#xff0c;如人脸识别、阅读理解和人机对话&…

LeetCode 1233. 删除子文件夹

1. 题目 你是一位系统管理员&#xff0c;手里有一份文件夹列表 folder&#xff0c;你的任务是要删除该列表中的所有 子文件夹&#xff0c;并以 任意顺序 返回剩下的文件夹。 我们这样定义「子文件夹」&#xff1a; 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下&…

学术会议 | 欢迎注册参加第21届国际语义网大会ISWC-会议日程发布

ISWC(International Semantic Web Conference)是语义网和知识图谱领域的国际顶级学术会议&#xff0c;2022年10月23-27日&#xff0c;ISWC将通过线上的方式举办&#xff0c;汇聚全世界相关的科研工作者、从业者和领域专家&#xff0c;共同探讨、推进、塑造知识图谱与语义网技术…