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

😀前言

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

🏠个人主页:晨犀主页

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

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰

如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

SpringCloud Gateway

搭建Gateway 微服务

搭建Gateway-应用实例

需求分析/图解

-- 引入Gateway 项目架构

解读
  1. 通过网关暴露的接口,实现调用真正的服务
  2. 网关本身也是一个微服务模块
代码实现
  1. 参考member-service-consumer-80 创建e-commerce-gateway-20000(具体步骤参考以前)
  2. 修改pom.xml, 部分内容可以从member-service-consumer-80 的pom.xml 拷贝
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(重点核心) 内容如下:

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

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

Postman 测试添加(走网关)

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

json 复制代码
json 数据:
{
    "name": "天山童姥",
    "pwd": "hello",
    "mobile": "110",
    "email": "zz@sohu.com",
    "gender": 2
}
注意事项和细节
  1. 因为我们的member 的controller 的方法参数使用了@RequestBody
  1. 所以,在使用postman 时,需要使用json 格式发送数据, 否则会报400 错误
  1. @RequestBody 的作用是: 将前端发送的json 数据封装成对象, 如果发送的不是json 数据,会报错误

二说Gateway 路由配置

方式1: application.yml 中配置-前面讲过
方式2: 编写配置类注入【了解】
  1. 先注销application.yml 对网关路由部分注销
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, 再次测试,网关路由失效
  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

java 复制代码
@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

Postman 测试添加(走网关)

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

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

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

动态路由

需求分析/图
代码实现
  1. 修改e-commerce-gateway-20000 的application.yml
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

😄总结

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

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

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

-- 代码

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

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁

希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

相关推荐
王彬泽4 小时前
【微服务】组件、基础工程构建(day2)
微服务
Cikiss4 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss4 小时前
微服务实战——平台属性
java·数据库·后端·微服务
杨荧7 小时前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源
攸攸太上9 小时前
JMeter学习
java·后端·学习·jmeter·微服务
妍妍的宝贝9 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
架构师吕师傅11 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
sdg_advance13 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
王彬泽13 小时前
【微服务】服务注册与发现、分布式配置管理 - Nacos
微服务·服务注册与发现·分布式配置管理
杨荧14 小时前
【JAVA开源】基于Vue和SpringBoot的旅游管理系统
java·vue.js·spring boot·spring cloud·开源·旅游