当前位置 博文首页 > 文章内容

    三分恶的博客:SpringCloud Alibaba实战(11:引入服务网关Gateway)

    作者:shunshunshun18 栏目:未分类 时间:2021-11-26 7:15:45

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    源码地址:https://gitee.com/fighter3/eshop-project.git

    持续更新中……

    大家好,我是三分恶。

    在前面的章节中,我们已经完成了服务间的调用、统一配置等等,在这一章节里,我们会引入微服务体系的一个重要组件——网关。

    网关概述

    为什么要引入网关

    大家都知道,我们服务端的各个服务调用是从服务注册中心拉取服务列表,再由负载均衡策略去调用对应的服务提供方。

    那么,在什么都不做的情况下,看看我们的客户端,包括PC、移动端等等是怎么访问我们的服务端的呢?

    无网关客户端访问服务

    这么办有什么问题呢?

    • 客户端需要维护后端服务的地址,如果我们集群部署,一个服务有数十上百个节点呢?

    • 日志、鉴权等等逻辑,我们每个服务都得搞一套。

    • 服务端的服务都得能被客户端访问,所以需要外网ip,但是ip资源实在太宝贵了。

      ……

    这时候就需要在客户端和服务端之间加一个统一的入口,而在微服务的体系中,承担这个角色的就是网关。

    引入网关

    我们加入一个网关,来作为请求的统一接入。我们只需要将网关的机器ip配置到DNS,或者接入层负载,那么客户端的服务最终通过我们的网关,再转发给对应的服务端服务。

    常见微服务网关

    目前市面上根据技术栈实现的不同大概有如下一些网关:

    常见网关

    简单介绍一下这些网关:

    • Nginx: Nginx由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行 URL 匹配,用于启动不同的模块去完成相应的工作。
    • Kong: Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
    • **Netfilx Zuul:**Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型之一。
    • **Spring Cloud GetWay:**Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1。Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能,并且Gateway还内置了限流过滤器,实现了限流的功能。

    Spring Cloud GetWay实践

    在上面我们已经简单介绍了各种常见的微服务网关,接下来引入我们今天的主角——SpringCloud Gateway。

    创建网关服务

    • 创建网关子module esop-gateway

    eshop-gateway

    • 引入相关依赖,注意啊,因为网关服务作为一个服务,同样需要配置中心和注册中心,所以,我们也引入了相关依赖
      <!--Spring Cloud Alibaba-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
            </dependency>
            <!-- spring cloud alibaba nacos config 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
            <!--gateway网关-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
    • bootstap.yml:在配置文件里除了应用名称,我们还配置了Nacos的相关配置,不太清楚的同学可以查看上一节。
    spring:
      application:
        name: gateway-service # 应用名称
      profiles:
        active: dev      # 当前环境对应的 profile
      cloud:
        nacos:
          config:
            enabled: true     # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
            server-addr: 127.0.0.1:8848   # Nacos Server 地址
            group: DEFAULT_GROUP     # 组,默认为 DEFAULT_GROUP
            file-extension: yaml    # 配置内容的数据格式,默认为 properties
            namespace: dev_space    # 指定命名空间,默认为public
    

    路由配置

    我们在nacos中来完成gateway的相关路由的配置。

    gateway服务配置

    server:
      port: 9000
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
        gateway:
          discovery:
            locator:
              enabled: true
          routes:
          - id: user-service
            uri: lb://user-service
            predicates:
              - Path=/user/**
            filters:
              - StripPrefix=1  
    

    我们在里面进行了路由转发的配置,也就是routes,我们来看一看这些配置项都是什么意思:

    • id: 路由的唯一标识,用以和其它Route区分
    • uri: 请求要转发到的地址,lb 指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
    • predicates: 路由需要满足的条件,也是个数组(这里是的关系)
    • filters: 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改

    在这个配置项里,我们定义了user 开头的请求,分发到user-service这个服务。

    接下来我们看看效果吧!

    路由转发效果

    回忆一下,在用户服务里有一个get请求的根据 id 获取用户的接口,访问一下:

    获取用户信息接口

    OK,我们现在不直接访问用户服务的接口,而是改成访问网关服务,我们来看看效果:

    网关访问获取用户信息接口

    我们访问的地址是:http://localhost:9000/user/shop-user/user/get-by-id?id=1 ,简单解析一下:

    网关请求路径解析


    到此,我们已经引入了Spring Cloud Gateway作为微服务网关,并完成了基本的路由转发的功能。

    除了基本的路由转发,服务网关还可以完成权限校验、限流、API校验等功能,后续我们会继续深入,敬请期待!


    “简单的事情重复做,重复的事情认真做,认真的事情有创造性地做!”——

    我是三分恶,可以叫我老三/三分/三哥/三子,一个能文能武的全栈开发,咱们下期见!



    参考:

    【1】:SpringCloud Cloud Gateway官方文档

    【2】:微服务下的网关如何选择

    【3】:小专栏 SpringCloudAlibaba微服务实战

    【4】: SpringCloud gateway (史上最全)

    【5】:SpringCloud Alibaba微服务实战十 - 服务网关

    【6】:《吃透微服务》 - 服务网关之Gateway

    cs