• springcloud之gateway服务网关


    目录

    微服务中网关的作用

    • 统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性
    • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
    • 动态路由:动态的将请求路由到不同的后端集群中
    • 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射

    在这里插入图片描述

    gatewayzuul

    • gatewayspringcloud 微服务平台的一个子项目,属于 spring 开源社区,依赖名叫:spring-cloud-starter-gateway。官网:https://spring.io/projects/spring-cloud-gateway
    • zuulnetflix 公司的开源项目,springcloudnetflix 项目中也已经集成了 zuul,依赖名叫:spring-cloud-starter-netflix-zuul。官网:https://github.com/Netflix/zuul
    • springcloud gateway 基于 spring 5、projec treactor、springboot 2,使用非阻塞式的 API,内置限流过滤器,支持长连接(比如 websockets),在高并发和后端服务响应慢的场景下比 zuul 1 的表现要好
    • zuul 基于 servlet2.x 构建,使用阻塞的 API,没有内置限流过滤器,不支持长连接

    springcloud gateway 简介

    • springcloud gatewayspringcloud 的一个全新项目,该项目是基于 spring 5.0,springboot 2.0Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式
    • springcloud gateway 作为 springcloud 生态系统中的网关,目标是替代 netflix zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流

    相关概念

    • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配
    • Predicate(断言):这是一个 Java 8Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 Http 请求的任何内容,例如 headers 或参数
    • Filter(过滤器):这是 org.springframework.cloud.gateway.filter.GatewayFilter 的实例,我们可以使用它修改请求和响应

    工作流程

    在这里插入图片描述
    客户端向 SpringCloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web HandlerHandler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(pre)或之后(post)执行业务逻辑

    特征

    • 基于 Spring 5,Project ReactorSpringBoot 2.0
    • 动态路由
    • PredicatesFilters 作用于特定路由
    • 集成 Hystrix
    • 集成 SpringCloud 注册中心
    • 易于编写的 PredicatesFilters
    • 限流
    • 路径重写

    快速上手

    继续依赖 上一篇 文章的项目结构,再新建服务网关项目如下

    在这里插入图片描述

    Maven 依赖

    eureka-client-gateway 服务网关添加依赖如下

    
    	org.springframework.cloud
        spring-cloud-starter-gateway
    
    
    • 1
    • 2
    • 3
    • 4

    application.properties 配置文件

    eureka-client-gateway 服务网关的配置文件

    server.port=9000
    
    spring.application.name=eureka-client-gateway
    
    #我们自定义的路由ID,保持唯一
    spring.cloud.gateway.routes[0].id=eureka-client-gateway
    #目标,要路由的服务地址
    spring.cloud.gateway.routes[0].uri=http://localhost:8080
    #路由条件
    spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • id:我们自定义的路由 ID,保持唯一
    • uri:目标,要路由的服务地址。在这里路由的是 eureka-client-producer 提供方地址
    • predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
    • filters:过滤规则,本示例暂时没用
    • /user/**:以 user 开头的接口 url,后面 * 是通配符

    上面这段配置的意思是:配置了一个 ideureka-client-gateway 的路由规则,当访问地址 http://localhost:9000/user/** 时会自动转发路由到地址 http://localhost:8080/user/**

    启动类

    eureka-client-gateway 服务网关的启动类

    @Slf4j
    @SpringBootApplication
    public class AppGateway {
    
        public static void main(String[] args) {
            SpringApplication.run(AppGateway.class, args);
            log.info("------AppGateway Running------");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    eureka-client-producercontroller

    它的端口是 8080

    @Slf4j
    @Controller
    @RequestMapping(path = "/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping(path = "/selectUserById")
        @ResponseBody
        public ResultVo selectUserById(Integer id) {
            return userService.selectOne(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试

    分别启动项目 eureka-client-gatewayeureka-client-producer(不需要启动 eureka 服务端以及 config 服务端),访问接口 http://localhost:9000/user/selectUserById?id=1,如下

    在这里插入图片描述
    说明 gateway 服务网关已经路由成功。在看看接口 http://localhost:8080/user/selectUserById?id=1,也就是被路由转发的原服务地址的返回结果如下

    在这里插入图片描述

    gateway 网关路由的配置方式

    • 在配置文件 propertiesyml 中配置(如上)

    • 通过 @Bean 自定义 RouteLocator,在启动主类 Application 中配置(如下)

      @SpringBootApplication
      public class GateWayApplication {

      public static void main(String[] args) {
      	SpringApplication.run(GateWayApplication.class, args);
      }
      
      @Bean
      public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
      	return builder.routes()
      			.route("path_route", r -> r.path("/about")
      					.uri("http://ityouknow.com"))
      			.build();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      }

    • 上面配置了一个 idpath_route 的路由,当访问地址 http://localhost:8080/about 时会自动转发到地址:http://www.ityouknow.com/about,只是这里转发的是以项目地址 /about 格式的请求地址

    gateway 网关的动态路由(通过注册中心获取路由服务实例)

    • 上述路由的配置是写死了的,要路由的 uri 是固定的;而往往在微服务环境中,一个服务可能是要有多个实例的,这时就要有一种动态的路由机制,实现一种类似于 ribbon 的负载均衡机制,让其路由到某个服务的不同实例上
    • 动态配置路由是通过服务注册名来实现的,路由的配置不再是配置固定的访问端口,可以动态来实现。默认情况下 gateway 会根据注册中心注册的服务列表,以注册中心上服务名为路由创建动态路由进行转发,从而实现动态路由的功能

    Maven 依赖

    eureka-client-gateway 服务网关添加依赖如下

    
    	org.springframework.cloud
    	spring-cloud-starter-netflix-eureka-client
    
    
    	org.springframework.cloud
    	spring-cloud-starter-gateway
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    application.properties 配置文件

    eureka-client-gateway 服务网关的配置文件修改如下

    server.port=9000
    
    spring.application.name=eureka-client-gateway
    
    eureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
    eureka.instance.prefer-ip-address=true
    
    #我们自定义的路由ID,保持唯一
    spring.cloud.gateway.routes[0].id=eureka-client-producer-1
    #目标,要路由的服务地址
    spring.cloud.gateway.routes[0].uri=lb://eureka-client-producer
    #路由条件
    spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
    #网关服务注册进eureka,开启根据serviceId创建路由的功能
    spring.cloud.gateway.discovery.locator.enabled=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • id:我们自定义的路由 ID,保持唯一
    • uri:目标,要路由的服务地址。lbLoadBalancer 负载均衡的意思,eureka-client-producer 是注册在服务中心的服务名
    • predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
    • /user/**:以 user 开头的接口 url,后面 * 是通配符

    启动类

    eureka-client-gateway 服务网关的启动类

    @Slf4j
    @EnableEurekaClient
    @SpringBootApplication
    public class AppGateway {
    
        public static void main(String[] args) {
            SpringApplication.run(AppGateway.class, args);
            log.info("------AppGateway Running------");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试

    • 我们分别启动 eureka-client-oneeureka-client-producereureka-client-gateway 服务
    • 其中 eureka-client-producer 启动两个实例,端口分别为 80808081,用于测试 gateway 网关

    在这里插入图片描述

    • 使用 postman 向接口 http://localhost:9000/user/selectUserById?id=1 发送 5 次请求,查看控制台日志如下

    端口 8080 日志

    在这里插入图片描述
    端口 8081 日志

    在这里插入图片描述

    • 从结果日志上可以看到:gateway 网关成功路由到了服务 eureka-client-producer 的不同实例上了,并且默认使用了轮询的负载均衡策略

    gateway 网关的过滤器,熔断,限流

    可以参考文章:http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    rabbitMQ的Topic模式的生产者与消费者使用案例
    盘点美军的无人机家底
    还分不清摘要、加密?一文带你辨析密码学中的各种基本概念
    复习计算机网络——第一章
    上海理工大学第二届“联想杯”全国程序设计邀请赛
    新品发布!无人机装调检修实训系统
    springboot实战(四)之整合mybatis-plus
    Shiro【散列算法、过滤器 、Shiro会话、会话管理器、权限表设计】(三)-全面详解(学习总结---从入门到深化)
    免疫浸润计算方法是CIBERSORT和ssgsea 画图
    私有化的即时通讯工具能为企业带来哪些帮助?
  • 原文地址:https://blog.csdn.net/m0_54849806/article/details/126064263