SpringCloud Gateway搭建Gateway 微服务应用实例

😀前言
本篇博文是关于SpringCloud Gateway搭建Gateway 微服务应用实例,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • SpringCloud Gateway
    • 搭建Gateway 微服务
      • 搭建Gateway-应用实例
        • 需求分析/图解
        • 解读
        • 代码实现
        • 测试
          • 浏览器:(通过网关访问) http://localhost:20000/member/get/1
          • Postman 测试添加(走网关)
        • 注意事项和细节
      • 二说Gateway 路由配置
        • 方式1: application.yml 中配置-前面讲过
        • 方式2: 编写配置类注入【了解】
        • 测试
          • 浏览器:(通过网关访问) http://localhost:20000/member/get/1
          • Postman 测试添加(走网关)
      • 动态路由
        • 需求分析/图
        • 代码实现
        • 测试
    • 😄总结
      • -- 代码

SpringCloud Gateway

搭建Gateway 微服务

搭建Gateway-应用实例

需求分析/图解

– 引入Gateway 项目架构

image-20230827223534168

解读
  1. 通过网关暴露的接口,实现调用真正的服务
  2. 网关本身也是一个微服务模块

image-20230827223600614

image-20230827223626019

代码实现
  1. 参考member-service-consumer-80 创建e-commerce-gateway-20000(具体步骤参考以前)
  2. 修改pom.xml, 部分内容可以从member-service-consumer-80 的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>e-commerce-center</artifactId><groupId>com.my.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>member-service-consumer-80</artifactId><!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整--><dependencies><!--引入sleuth + zipkin 依赖 说明 1. 使用的是版本仲裁 2.starter-zipkin包含了sleuth  --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency><!--引入eureka client 场景启动器starter--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- gateway不能引入spring-boot-starter-web 和spring-boot-starter-actuator 否则会冲突,因为gateway 是一个服务网关,不需要web -->	<!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--引入e_commerce_center-common-api--><dependency><groupId>com.my.springcloud</groupId><artifactId>e_commerce_center-common-api</artifactId><version>${project.version}</version></dependency></dependencies></project>

3.创建application.yml(重点核心) 内容如下:

server:port: 20000spring:application:name: e-commerce-gatewaycloud:gateway:routes: #配置路由,可以配置多个路由 List<RouteDefinition> routes- id: member_route01 #路由的id, 程序员自己配置,要求唯一#gateway 最终访问的url 是 url=uri+Path#匹配后提供服务的路由地址: 也可以是外网 http://www.baidu.com#比如: 客户端/浏览器请求 url http://localhost:20000/member/get/1#如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1#如果匹配失败, 则有gateway返回404信息#疑问: 这里配置的 uri 是固定,在当前这种情况其实可以没有有Eureka Server,后面会使用灵活方式#     配置,就会使用到Eureka Serveruri: http://localhost:10000predicates: #断言,可以有多种形式- Path=/member/get/**- id: member_route02 #路由的id, 程序员自己配置,要求唯一uri: http://localhost:10000predicates: #断言,可以有多种形式#这时如果客户端/浏览器 访问gateway 的url http://localhost:20000/member/save#匹配Path成功 最终访问的url 就是 http://localhost:10000/member/save- Path=/member/save#配置Eureak-Client
eureka:instance:hostname: e-commerce-service #先配置着client:register-with-eureka: true #将自己注册到Eureka-Serverfetch-registry: trueservice-url:#表示将自己注册到哪个eureka-server#这里为了方便,使用Eureka Server的单机环境测试defaultZone: http://eureka9001.com:9001/eureka

4.创建主启动类com/my/springcloud/GateWayApplication20000.java

@SpringBootApplication
@EnableEurekaClient
public class GateWayApplication20000 {public static void main(String[] args) {SpringApplication.run(GateWayApplication20000.class, args);}
}
测试

启动e-commerce-eureka-server-9001

启动member-service-provider-10000

启动e-commerce-gateway-20000

浏览器:(通过网关访问) http://localhost:20000/member/get/1

浏览器输入: http://localhost:20000/member/get/1

image-20230828124058166

Postman 测试添加(走网关)

请求地址: http://localhost:20000/member/save

json 数据:
{"name": "天山童姥","pwd": "hello","mobile": "110","email": "zz@sohu.com","gender": 2
}

image-20230828124158893

注意事项和细节
  1. 因为我们的member 的controller 的方法参数使用了@RequestBody

image-20230828131857254

  1. 所以,在使用postman 时,需要使用json 格式发送数据, 否则会报400 错误

image-20230828131937264

  1. @RequestBody 的作用是: 将前端发送的json 数据封装成对象, 如果发送的不是json 数据,会报错误

二说Gateway 路由配置

方式1: application.yml 中配置-前面讲过
方式2: 编写配置类注入【了解】
  1. 先注销application.yml 对网关路由部分注销
server:port: 20000#spring:
#  application:
#    name: e-commerce-gateway
#  cloud:
#    gateway:
#      routes: #配置路由,可以配置多个路由 List<RouteDefinition> routes
#        - id: member_route01 #路由的id, 程序员自己配置,要求唯一
#          #gateway 最终访问的url 是 url=uri+Path
#          #匹配后提供服务的路由地址: 也可以是外网 http://www.baidu.com
#          #比如: 客户端/浏览器请求 url http://localhost:20000/member/get/1
#          #如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1
#          #如果匹配失败, 则有gateway返回404信息
#          #疑问: 这里配置的 uri 是固定,在当前这种情况其实可以没有有Eureka Server,后面会使用灵活方式
#          #     配置,就会使用到Eureka Server
#          uri: http://localhost:10000
#          predicates: #断言,可以有多种形式
#            - Path=/member/get/**
#        - id: member_route02 #路由的id, 程序员自己配置,要求唯一
#          uri: http://localhost:10000
#          predicates: #断言,可以有多种形式
#            #这时如果客户端/浏览器 访问gateway 的url http://localhost:20000/member/save
#            #匹配Path成功 最终访问的url 就是 http://localhost:10000/member/save
#            - Path=/member/save
  1. 重启e-commerce-gateway-20000, 再次测试,网关路由失效

image-20230828132335320

  1. 参考官方文档https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#spring-cloud-circuitbreaker-filter-factory ,

创建com/my/springcloud/config/GateWayRoutesConfig.java

image-20230828132416999

@Configuration
public class GateWayRoutesConfig {//配置注入路由/*** 在理解通过配置类注入/配置 路由,可以对照前面的application.yml来对比理解* cloud:*     gateway:*       routes: #配置路由,可以配置多个路由 List<RouteDefinition> routes*         - id: member_route01 #路由的id, 程序员自己配置,要求唯一*           #gateway 最终访问的url 是 url=uri+Path*           #匹配后提供服务的路由地址: 也可以是外网 http://www.baidu.com*           #比如: 客户端/浏览器请求 url http://localhost:20000/member/get/1*           #如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1*           #如果匹配失败, 则有gateway返回404信息*           #疑问: 这里配置的 uri 是固定,在当前这种情况其实可以没有有Eureka Server,后面会使用灵活方式*           #     配置,就会使用到Eureka Server*           uri: http://localhost:10000*           predicates: #断言,可以有多种形式*             - Path=/member/get/***/@Beanpublic RouteLocator myRouteLocator04(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();//方法写完//梳理//1. 下面的方法我们分别指定了id , uri 和path//2. Function<PredicateSpec, Route.AsyncBuilder> fn//(1) 是一个函数式接口//(2) 接收的类型是 PredicateSpec ,返回的类型是 Route.AsyncBuilder//(3) r -> r.path("/member/get/**")//                .uri("http://localhost:10000") 就是lambda表达式//(4) 一会还要用代码进行说明-先使用-再理解//3. 小伙伴们可以理解这是一个规定写法return routes.route("member_route04", r -> r.path("/member/get/**").uri("http://localhost:10000")).build();}@Beanpublic RouteLocator myRouteLocator05(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();return routes.route("member_route05", r -> r.path("/member/save").uri("http://localhost:10000")).build();}
}
测试

​ 启动e-commerce-eureka-server-9001
​ 启动member-service-provider-10000
​ 启动e-commerce-gateway-20000

浏览器:(通过网关访问) http://localhost:20000/member/get/1

浏览器输入: http://localhost:20000/member/get/1

image-20230828164351342

Postman 测试添加(走网关)

请求地址: http://localhost:20000/member/save

json 数据:
{"name": "天山童姥","pwd": "hello","mobile": "110","email": "zz@sohu.com","gender": 2
}

image-20230828124158893

别忘了,将代码恢复成yml 配置

动态路由

需求分析/图

image-20230828164550289

代码实现
  1. 修改e-commerce-gateway-20000 的application.yml
server:port: 20000spring:application:name: e-commerce-gatewaycloud:gateway:discovery:locator:#Flag that enables DiscoveryClient gateway integration#启用了 DiscoveryClient 服务发现enabled: trueroutes: #配置路由,可以配置多个路由 List<RouteDefinition> routes- id: member_route01 #路由的id, 程序员自己配置,要求唯一#gateway 最终访问的url 是 url=uri+Path#匹配后提供服务的路由地址: 也可以是外网 http://www.baidu.com#比如: 客户端/浏览器请求 url http://localhost:20000/member/get/1#如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1#如果匹配失败, 则有gateway返回404信息#疑问: 这里配置的 uri 是固定,在当前这种情况其实可以没有有Eureka Server,后面会使用灵活方式#     配置,就会使用到Eureka Server#uri: http://localhost:10000#解读#1. lb: 协议名 , member-service-provider 注册到eureka server 服务名(小写)#2. 默认情况下,负载均衡算法是轮询uri: lb://member-service-providerpredicates: #断言,可以有多种形式- Path=/member/get/**- id: member_route02 #路由的id, 程序员自己配置,要求唯一#uri: http://localhost:10000uri: lb://member-service-providerpredicates: #断言,可以有多种形式#这时如果客户端/浏览器 访问gateway 的url http://localhost:20000/member/save#匹配Path成功 最终访问的url 就是 http://localhost:10000/member/save- Path=/member/save
测试

​ 启动e-commerce-eureka-server-9001
​ 启动member-service-provider-10000
​ 启动member-service-provider-10002
​ 启动e-commerce-gateway-20000
​ 浏览器:(通过网关访问) http://localhost:20000/member/get/1
image-20230828165053852

image-20230828165110727

😄总结

  1. 配置好动态路由后Gateway 会根据注册中心上微服务名,为请求创建动态路由,实现动态路由功能。

  2. 使用的lb 协议支持负载均衡-轮询算法。

  3. 配置自己的负载均衡算法, 测试完毕恢复成原来的轮询算法。

– 代码

@Configuration
public class RibbonRule {//配置注入自己的负载均衡算法@Beanpublic IRule myRibbonRule() {//这里返回的是RandomRule,当然小伙伴也可以自己指定return new RandomRule();}
}

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

白捡一个存储型XSS

本文由掌控安全学院 - 杳若 投稿 起因 利用fofa搜索时发现 org"China Education and Research Network Center" && body"/register" 任意用户注册 在找到该CMS的时候发现存在任意用户注册的情况 http://xxxx.edu.cn/student/Register.ashx …

在已知的二维坐标里找到最接近的点

一、业务场景 最近在研发的项目&#xff0c;在做可视化层&#xff0c;在全球地图上&#xff0c;对我们的国家的陆地地图经纬度按照步长为1的间隔做了二维处理。在得到一组整数的点位信息后&#xff0c;需要将我们已有的数据库数据(业务项目)按照地址的经纬度&#xff0c;映射到…

肖sir__mysql之存储__012

mysql之存储 一、存储 1、什么是存储过程 定义&#xff1a;存储过程就是实现某个特定功能的sql语句的集合&#xff0c;编译后的存储过程会保存在数据库中&#xff0c;通过存储过程的名称可以反复的调用执行。 2、存储过程的优点? (1)存储创建后&#xff0c;可以反复的调用&am…

python项目127.0.0.1:5000访问失败

Windows环境下启动python项目&#xff0c;接口访问失败 解决&#xff1a; 方法1&#xff1a; 将host配成0.0.0.0&#xff0c;并用本机ip端口号访问 python代码示例&#xff1a; from flask import Flaskapp Flask(__name__)app.route(/index) def index():return helloapp.…

有了Spring为什么还需要SpringBoot呢

目录 一、Spring缺点分析 二、什么是Spring Boot 三、Spring Boot的核心功能 3.1 起步依赖 3.2 自动装配 一、Spring缺点分析 1. 配置文件和依赖太多了&#xff01;&#xff01;&#xff01; spring是一个非常优秀的轻量级框架&#xff0c;以IOC&#xff08;控制反转&…

Elasticsearch 8.10 中引入查询规则 - query rules

作者&#xff1a;Kathleen DeRusso 我们很高兴宣布 Elasticsearch 8.10 中的查询规则&#xff01; 查询规则&#xff08;query rules&#xff09;允许你根据正在搜索的查询词或根据作为搜索查询的一部分提供的上下文信息来更改查询。 什么是查询规则&#xff1f; 查询规则&…

vue框架实现表情打分效果

本来今天要实现这个功能 但是在网上查了一下 就csdn上有一个符合要求的 但是他竟然收费,痛心疾首啊 太伤白嫖党的心的 所以我手写了一个这个类似功能的代码 希望能帮到有这个需求的同学们 技术栈是VUE3 用其他技术栈的也可以看 因为逻辑很简单都一样的 // 问卷的虚拟数据 con…

如何用CRM软件系统管理企业客户

客户对企业的重要程度不言而喻。可以说&#xff0c;客户是企业收益的来源和可持续发展的基础&#xff0c;客户的转化率和保留率也与企业的发展息息相关。企业想要成功转化客户&#xff0c;需要经历客户跟踪、挖掘、维护等一系列过程。下面我们来说说&#xff0c;CRM客户管理系统…

Flask框架-2-[单聊]: flask-socketio实现websocket的功能,实现单对单聊天,flask实现单聊功能

一、概述和项目结构 在使用flask-socketio实现单聊时&#xff0c;需要将会话id(sid) 与用户进行绑定&#xff0c;通过emit(事件,消息,tosid) ,就可以把消息单独发送给某个用户了。 flask_websocket |--static |--js |--jquery-3.7.0.min.js |--socket.io_4.3.1.js |--template…

leetcode543 二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 输入&#xff1a;root [1,2,3,4,5] 输出&#xff1…

jmeterbeanshell调用jsonpath获取对应值

1.jmeter 新建线程组、Java Request、BeanShell Assertion、View Results Tree 2、在BeanShell Assertion中贴入代码&#xff1a; import org.apache.jmeter.extractor.json.jsonpath.JSONManager; import java.util.List; JSONManager js new JSONManager(); String jsonStr…

手机上比较好用的笔记软件使用哪一款?

手机已经成为我们日常生活不可或缺的一部分&#xff0c;它们伴随着我们的方方面面。在这部小小的设备中&#xff0c;我们可以完成许多任务&#xff0c;其中之一就是记录笔记。手机上的笔记软件如今多种多样&#xff0c;但在选择时&#xff0c;敬业签可能是你不容错过的选择。 …

多平台兼容性:跑腿系统开发的移动端和Web端技术选项

随着移动设备和Web浏览器的广泛使用&#xff0c;跑腿系统的开发需要考虑多平台兼容性。本文将讨论一些在开发跑腿系统的移动端和Web端时可用的技术选项&#xff0c;并提供示例代码以帮助您入门。 移动端技术选项&#xff1a; 1. React Native React Native是一个流行的移动应…

YashanDB混合存储揭秘:行式存储如何为高效TP业务保驾护航(下)

上一篇文章https://mp.weixin.qq.com/s/mQLzi2PSZxqwwACSsq49ng为大家讲述了行式存储中事务并发控制的关键设计和优化。YashanDB采用了In-place Update 的块级 MVCC&#xff0c;能极大提高事务并发处理能力。本篇文章&#xff0c;我们将会详解插入性能优化和宽行存储的设计。 插…

查看吾托帮88.47的docker里的tomcat日志

步骤如下 &#xff08;1&#xff09;ssh &#xff08;2&#xff09;ssh root192.168.88.47 等待输入密码&#xff1a;fytest &#xff08;3&#xff09;pwd #注释&#xff1a;输出/root &#xff08;4&#xff09;docker exec -it wetoband_deploy /bin/bash #注释&#xff1…

【记录】Python 之于 C/C++ 区别

记录本人在 Python 上经常写错的一些地方&#xff08;C/C 写多了&#xff0c;再写 Python 有点切换不过来&#xff09; 逻辑判断符号用 and、or、!可以直接 10 < num < 30 比较大小分支语句&#xff1a;if、elif、else使用 、-&#xff0c;Python 中不支持 、- - 这两个…

elk日志某个时间节点突然搜索不到了

elk日志某个时间节点突然搜索不到了,检查filebeat正常 Kibana手动上传数据: 响应: Error: Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [2000]/[2000] maximum shards open 原因:ElasticSearch总分片数量导致的异常,ES…

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…

JAVA面经整理(2)

一)解决哈希冲突的方法有哪些&#xff1f; 哈希冲突指的是在哈希表中&#xff0c;不同的键值映射到了相同的哈希桶&#xff0c;也就是数组索引&#xff0c;导致键值对的冲突 1)设立合适的哈希函数:通过哈希函数计算出来的地址要均匀的分布在整个空间中 2)负载因子调节: 2.1)开放…

【vue】vue+easyPlayer 实现宫格布局及视频播放

由于业务需要&#xff0c;ant-design-vue框架集成easyPlayer.js作为视频播放器。EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC等多种音视频编码格…