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

news2025/1/2 15:03:48

😀前言
本篇博文是关于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: 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


#配置Eureak-Client
eureka:
  instance:
    hostname: e-commerce-service #先配置着
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-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/**
     */
    @Bean
    public 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();


    }

    @Bean
    public 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: 20000

spring:
  application:
    name: e-commerce-gateway
  cloud:
    gateway:
      discovery:
        locator:
          #Flag that enables DiscoveryClient gateway integration
          #启用了 DiscoveryClient 服务发现
          enabled: true
      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
          #解读
          #1. lb: 协议名 , member-service-provider 注册到eureka server 服务名(小写)
          #2. 默认情况下,负载均衡算法是轮询
          uri: lb://member-service-provider
          predicates: #断言,可以有多种形式
            - Path=/member/get/**
        - id: member_route02 #路由的id, 程序员自己配置,要求唯一
          #uri: http://localhost:10000
          uri: lb://member-service-provider
          predicates: #断言,可以有多种形式
            #这时如果客户端/浏览器 访问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 {
    //配置注入自己的负载均衡算法
    @Bean
    public IRule myRibbonRule() {
        //这里返回的是RandomRule,当然小伙伴也可以自己指定
        return new RandomRule();
    }
}

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

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

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

相关文章

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(三)

思维导图 一、循环-for 1.1 for 循环-基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

scryptTS文档搜索功能上线!

在 scryptTS 文档中搜索 随着 scryptTS 文档的内容越来越丰富&#xff0c;从大量资料中快速定位感兴趣的部分变得越来越困难。 现在&#xff0c;你可以使用搜索功能&#xff0c;快速查找想了解的内容。

金蝶云星空与聚水潭对接集成物料查询连通商品上传(新)(物料主数据同步策略)

金蝶云星空与聚水潭对接集成物料查询连通商品上传&#xff08;新&#xff09;(物料主数据同步策略) 数据源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#x…

肖sir__项目环境之全流程__005

一、测试流程&#xff08;h模型&#xff09; 1、需求文档&#xff08;产品&#xff09; 需求文档&#xff08;软件需求规格说明书srs&#xff09; &#xff08;1&#xff09;如何分析需求 a、显示需求&#xff08;主流程、功能&#xff0c;业务&#xff09; b、隐性需求&#x…

java Spring Boot2.7实现一个简单的爬虫功能

首先 我们要在 pom.xml 中注入Jsoup 这是一个简单的java爬虫框架 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.1</version> </dependency>然后这里我们直接用main吧 做简单一点 我…

NSDT孪生场景编辑器系统介绍

一、产品背景 数字孪生的建设流程涉及建模、美术、程序、仿真等多种人才的协同作业&#xff0c;人力要求高&#xff0c;实施成本高&#xff0c;建设周期长。如何让小型团队甚至一个人就可以完成数字孪生的开发&#xff0c;是数字孪生工具链要解决的重要问题。考虑到数字孪生复杂…

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…

脑电相关临床试验及数据分析01

临床试验设计01–04 作为一个医疗器械公司的开发–>算法–>项目–>产品&#xff0c;还是想在这里记录一下工作。 直接开始吧 临床试验的设计&#xff0c;主要分为20个部分&#xff0c;分别是 封面 一、申办者信息 二、所有临床试验机构和研究者列表 三、临床试验的…

基础算法--位运算

位运算理解&#xff1a; n >> k&#xff1a;代表n右移k位 比如 000011 >> 1 000001 前面会补零&#xff08;所以第几位是从0开始计算&#xff09; n & 1&#xff1a;表示最后一位是否为1 比如&#xff1a;n 3 0011 而 1 0001 则3 & 1 0011 & 000…

本地Docker Registry远程连接,为你带来高效便捷的镜像管理体验!

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出

多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多输入多输出 1.data为数据集&#xff0c…

Python 判断三位水仙花数

"""判断是否为三位水仙花数知识点&#xff1a;0、水仙花满足条件&#xff1a;(1 ** 3) (5 ** 3) (3 ** 3) 1531、字符串索引&#xff0c;例如&#xff1a;name zhouhua name[0] z2、变量类型转换函数3、双目运算符幂**,例如&#xff1a;3 ** 2 3 * 3 94、…

【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

《关于如何防止edge浏览器偷取chrome浏览器的账号》 前段时间edge自动更新了&#xff0c;我并没有太在意界面的问题。但是由于我使用同一个网站平台时&#xff0c;例如b站&#xff0c;甚至是邮箱&#xff0c;edge的账号和chrome的账号会自动同步&#xff0c;这就导致我很难短时…

Linux su sudo命令

1、su命令——切换用户 1.1、切换到root用户(需要密码) su - root 1.2、切换到其他用户&#xff0c;比如jackma&#xff08;无需密码&#xff09; su - jackma 2、sudo命令——给普通用户添加root权限 2.1、用法 切换到root用户&#xff0c;执行visudo命令&#xff0c;会自动…

Leetcode 951. 翻转等价二叉树

文章目录 题目代码&#xff08;9.22 首刷部分看解析&#xff09; 题目 Leetcode 951. 翻转等价二叉树 代码&#xff08;9.22 首刷部分看解析&#xff09; class Solution { public:bool flipEquiv(TreeNode* root1, TreeNode* root2) {if(!root1 && !root2)return tr…

AI也需要透明度?是的,需要

文章目录 什么是AI透明度为什么需要AI透明度AI透明度的弱点如何做好AI透明度推荐阅读 什么是AI透明度 AI透明度指的是人工智能&#xff08;AI&#xff09;系统的工作原理和决策过程能够被理解、解释和追踪的程度。它包括以下几个方面&#xff1a; 可解释性&#xff08;Explai…

安装nvm 切换不同nodejs版本号

1.下载nvm:NVM下载 - NVM中文网 2.卸载node&#xff08;没有安装的可以直接跳过&#xff09; 3.安装 nvm list available 查看可安装的node版本nvm install 12.16.0 安装指定版本node nvm ls 查看已安装的node版本nvm use 16.13.0 切换…

第二证券:个人开证券账户要开户费吗?

随着互联网和移动端东西的遍及&#xff0c;越来越多的人开端涉足股票投资&#xff0c;开立证券账户也成为一个热门话题。但是&#xff0c;许多初学者或许会有疑问&#xff0c;个人开证券账户是否需求支付开户费呢&#xff1f;这个问题的答案并不是那么简略&#xff0c;需求考虑…

使用企业订货系统的原因和考虑|网上APP订单管理软件

使用企业订货系统的原因和考虑|网上APP订单管理软件 企业要用订货系统主要如下原因&#xff1a; 第一、在线订货系统能让销售即时看到商品信息。商品售价多少&#xff0c;进货价多少&#xff0c;上次跟客户的成交价是多少&#xff0c;最低可以卖多少钱&#xff0c;用个本子记录…

【论文阅读 05】图像异常检测研究现状综述

1 图像异常检测任务 图像异常检测任务根据异常的形态可以分为定性异常的分类和定量异常的定位两个类别. 定性异常的分类&#xff1a;整体地给出是否异常的判断&#xff0c;无需准确定位异常的位置。 如图2左上图所示, 左侧代表正常图像, 右侧代表异常图像, 在第1行中,模…