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

2023-09-22 10:32:55

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

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

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

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连支持一下,创造不易您们的支持是我的动力🤞

更多推荐

prometheus+node+process-exporter+grafans

安装Prometheus要在Ubuntu18.04上安装Prometheus,您可以按照以下步骤进行:sudoapt-getupdate安装依赖:sudoapt-getinstallwgettar下载最新的Prometheus版本:wgethttps://github.com/prometheus/prometheus

第34章_瑞萨MCU零基础入门系列教程之SR04超声波测距实验

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

在Java中,类型通配符(TypeWildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。什么是类型通配符?类型通配符是一个用问号?表示的通配符,它可以用于泛型类、方法和通配符边界。类型通配符的主要作用是让我们能够接受各

OpenCV之cvtColor颜色空间转换

大多数彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:C++:voidcvtColor(InputArraysrc,OutputArraydst,intcode,intdstCn

PyTorch深度学习(一)【线性模型、梯度下降、随机梯度下降】

这个系列是实战(刘二大人讲的pytorch)建议把代码copy下来放在编译器查看(因为很多备注在注释里面)线性模型(LinearModel):importnumpyasnpimportmatplotlib.pyplotasplt#绘图的包​x_data=[1.0,2.0,3.0]#这两行代表数据集,一般x_data,y

输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

效果视频:输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)_哔哩哔哩_bilibili项目文件code.py装载的是英文版本,图上显示英文标签及坐标,Chinese.py装载的是中文版本,图上显示中文标签等等,以及每一行代码几乎都有中文注释。code.py和C

【学习笔记】POJ 3834 graph game

点这里结论题😅,图一乐结论:如果原图中存在两个边集不交的生成树,那么Bob\text{Bob}Bob必胜;否则Alice\text{Alice}Alice必胜证明有点难😅首先,考虑维护两颗不存在红边的生成树,如果Alice\text{Alice}Alice断掉了其中一颗树上的一条边,将这个树分成两个连通块,那么Bo

求函数f(x,y)在曲线C上的最大方向导数问题

方向导数:在许多问题中,不仅要知道函数在坐标轴方向上的变化率(即偏导数),而且要设法求得函数在某点沿着其他特定方向上的变化率,这就是方向导数方向导数的定义式和计算公式定义式:前提:三元函数u=u(x,y,z)u=u(x,y,z)u=u(x,y,z)在点P0(x0,y0,z0)P_0(x_0,y_0,z_0)P0​(x0

2023华为杯研究生数学建模D题思路代码分析

完整的分析查看文末名片获取!问题一:区域碳排放量以及经济、人口、能源消费量的现状分析(1)建立指标与指标体系要求1:指标能够描述某区域经济、人口、能源消费量和碳排放量的状况;要求2:指标能够描述各部门(能源供应部门、工业消费部门、建筑消费部门、交通消费部门、居民生活消费、农林消费部门)的碳排放状况;要求3:指标体系能够

命令模式简介

概念:命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许您将不同的请求参数化、队列化,并且能够在不同的时间点执行。通过引入命令对象(Command)来解耦发送者(Invoker)和接收者(Receiver),使得发送者无需知道具体的接收者或操作细节。命令对象封装了一系列操作,并提供了一个统一的方法(如exec

Delaunay三角剖分算法

目录一.简介1.1三角剖分1.2Delaunay三角剖分二.Delaunay三角剖分的相关理论2.1Delaunay三角形和(局部)Delaunay边的概念2.2Delaunay引理2.3翻转边算法(flipalgorithm)2.4Delaunay三角剖分的最优性质三.Delaunay三角剖分的构造算法3.1Laws

热文推荐