「 从0到1学习微服务SpringCloud 」10 服务网关Z

作者: KenDoEverything | 来源:发表于2019-04-18 15:51 被阅读0次
    系列文章(更新ing):

    「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config
    「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
    「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream

    为什么需要服务网关

    假如当前有十几个微服务服务,订单,商品,用户等等,那客户端需要和每个服务逐一打交道?这显然是不现实的,这就需要有一个统一入口,它就是服务网关。

    image

    常用的网关方案

    • Nginx + Lua

    • Kong

    • Tyk

    • Spring Cloud Zuul

    这里就不一一介绍了,感兴趣的可自行查资料。今天的主角是Zuul。

    Zuul虽然在性能上和nginx没法比,但它也有它的优点。Zuul 提供了认证鉴权,动态路由,监控,弹性,安全,负载均衡等边缘服务,在团队规模不大的情况下,没有专门负责路由开发时,使用Zuul当网关是一个快速上手的好方案。

    nginx和Zuul是可以配合使用的,发挥各自的优点,使用nginx作为负载均衡实现高并发的请求转发,Zuul用作网关

    Zuul的特点

    • 路由+过滤器 = Zuul

    • 核心是一系列过滤器

    Zuul的工作原理

    zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。
    过滤器之间没有直接进行通信,而是通过Request Context(上下文)进行数据传递。

    Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。

    image

    四种过滤器
    (1) PRE(前置):这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现鉴权、限流、参数校验调整等。

    (2) ROUTING(路由):这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

    (3) POST(后置):这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端、日志等。

    (4) ERROR(错误):在其他阶段发生错误时执行该过滤器。

    过滤器的生命周期

    image

    HTTP请->一系列过滤器->微服务->HTTP响应

    Zuul的基本使用

    1.新建一个子模块,勾选eureka discovery和zull
    (我们这里后面的练习就不用config组件了,因为在github修改配置有点麻烦)

    image

    并添加父子模块的关联,把子模块中多余的声明删掉

    2.yml文件添加相关配置,入口类添加@EnableEurekaClient和@EnableZuulProxy注解

    server:
      port: 8900
    spring:
        application:
              name: api-gateway
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    3.现在已经可以做到路由的功能了,我们来试试。启动service-hi应用,通过网关入口进行访问,访问规则:网关域名/目标服务/目标接口名,下面调用service-hi服务的hi接口

    image

    4.可自定义路由,设置自定义的路径。
    配置如下,两种方式

    zuul:
      routes:
        # 方法1
        # 声明一个路由规则,名称随意取名就行
        # 该规则为 /myHi/**  路由到 /service-hi/** (**为任意匹配)
        myHi:
          # 路由路径 (路由到哪个路径)
          path: /myHi/**
          # 服务名 (需要路由的服务)
          serviceId: service-hi
          # 这里需要注意一下,使用zuul进行路由,默认不传递cookie
          # 若要传递,添加下面的配置(内容为空就行)
          sensitivedHeaders:
    
    
        # 方法2
        # 路由声明 简洁写法 服务名: 路由路径
        service-hi: /myHi/**
    
      # 忽略路径,不做路由
      ignored-patterns:
       - /service-hi/hi
       # 也可以使用通配符
       - /**/hi
    

    访问配置的路由路径,即可访问到相应接口啦~

    image

    Zuul的高可用

    • 多个Zuul节点注册到Eureka Server上,不需要其他的配置

    • Nginx和Zuul"混搭"使用,取长补短

    已将代码上传到github

    https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1

    如果觉得不错,分享给你的朋友!

    image image

    THANDKS

    • End -

    一个立志成大腿而每天努力奋斗的年轻人

    伴学习伴成长,成长之路你并不孤单!

    扫描二维码,关注公众号

    相关文章

      网友评论

        本文标题:「 从0到1学习微服务SpringCloud 」10 服务网关Z

        本文链接:https://www.haomeiwen.com/subject/zdrtgqtx.html