八:Spring Cloud 之服务路由网关-zuul

文章目录

  • 1. 简介
  • 2. 代码实现
    • 2.1涉及的模块及关系图谱
      • 2.1.1 涉及的模块
      • 2.1.2 模块关系图谱
    • 2.2 源代码
      • 2.2.1 Github地址
      • 2.2.2 切换
    • 2.3 eureka-server-singleton
    • 2.4 eureka-service
    • 2.5 eureka-service-feign
    • 2.6 eureka-service-ribbon
    • 2.7 eureka-service-zuul
      • 2.7.1 整体实现
      • 2.7.2 pom.xml
      • 2.7.3 application.yml
      • 2.7.4 EurekaServiceZuulApplication
      • 2.7.5 PreFilter
  • 3. 验证
    • 3.1 创建SpringBoot启动类
      • 3.1.1 EurekaServerSingletonApplication
      • 3.1.2 EurekaServiceApplication-8762
      • 3.1.3 EurekaServiceApplication-8763
      • 3.1.4 EurekaServiceFeignApplication
      • 3.1.5 EurekaServiceRibbonApplication
    • 3.2 启动
    • 3.3 访问服务信息界面
    • 3.4 调用服务
      • 3.4.1 访问 /api-ribbon/
      • 3.4.2 访问 /api-feign/
      • 3.4.3 验证过滤器生效
        • 3.4.3.1 不生效
        • 3.4.3.2 生效
  • 4. 思考
  • 5. 补充
    • 5.1 资料
    • 5.2 Zuul的Filter类型
    • 5.2 lombok插件安装

1. 简介

Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.


Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

2. 代码实现

2.1涉及的模块及关系图谱

2.1.1 涉及的模块

  • eureka-server-singleton:服务注册中心,端口8761
  • eureka-service: 服务提供者,通过profile指定不同端口模拟一组微服务,端口8762、8763
  • eureka-service-feign:通过Feign调用服务提供者提供的服务
  • eureka-service-ribbon:通过Feign调用服务提供者提供的服务
  • eureka-service-zuul:服务路由功能,实现请求路由,网关功能

2.1.2 模块关系图谱

八:Spring Cloud 之服务路由网关-zuul_第1张图片

2.2 源代码

2.2.1 Github地址

https://github.com/andyChenHuaYing/spring-cloud-demo

2.2.2 切换

通过tag切换git tag -d v1.0,若想修改,可根据此tag创建新的分支。

2.3 eureka-server-singleton

与Spring Cloud 之服务发现与调用-Ribbon#2.3 eureka-server-singleton 没有任何区别

2.4 eureka-service

与Spring Cloud 之服务发现与调用-Ribbon#2.4 eureka-service 没有任何区别

2.5 eureka-service-feign

与五:Spring Cloud 之服务发现与调用-Feign#2.5 eureka-service-feign没有任何区别

2.6 eureka-service-ribbon

与四:Spring Cloud 之服务发现与调用-Ribbon#2.5 eureka-service-ribbon 没有任何区别

2.7 eureka-service-zuul

2.7.1 整体实现

  1. pom.xml中引入spring-cloud-starter-netflix-eureka-clientspring-cloud-starter-netflix-zuul依赖
  2. application.yml中指定配置项
    1. 端口:8768
    2. 应用名称:eureka-serivce-zuul
    3. 指定路由规则:
      1. /api-ribbon/**请求转发到eureka-service-ribbon处理
      2. /api-feign/**请求转发到eureka-serivce-feign处理
  3. SpringBoot 启动类添加启用Zuul的注解@EnableZuulProxy
  4. 添加继承ZuulFilter的Filter,并指定filterType实现请求过滤
  5. 根据路由规则访问访问API网关,观察请求是否正确传递到真正服务提供者处理并返回

2.7.2 pom.xml



    
        spring-cloud-finchley-demo
        org.oscar.scd
        1.0.0
    
    4.0.0

    eureka-service-zuul

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
        
    

2.7.3 application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

server:
  port: 8768

spring:
  application:
    name: eureka-serivce-zuul

zuul:
  routes:
    api-ribbon:
      path: /api-ribbon/**
      serviceId: eureka-service-ribbon
    api-feign:
      path: /api-feign/**
      serviceId: eureka-serivce-feign

2.7.4 EurekaServiceZuulApplication

package org.oscar.scd.eureka.service.ribbon.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceZuulApplication.class, args);
    }
}

2.7.5 PreFilter

使用了lombok插件,IDEA需要安装一下lombok插件。见补充部分
package org.oscar.scd.eureka.service.ribbon.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

@Slf4j
@Service
public class PreFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        return "yes".equals(request.getParameter("shouldFilter"));
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String token = request.getParameter("token");
        log.info("Token:{}", token);
        return null;
    }
}

3. 验证

3.1 创建SpringBoot启动类

3.1.1 EurekaServerSingletonApplication

与四:Spring Cloud 之服务发现与调用-Ribbon#3.1.1 EurekaServerSingletonApplication 完全一致

3.1.2 EurekaServiceApplication-8762

与四:Spring Cloud 之服务发现与调用-Ribbon#3.1.2 EurekaServiceApplication-8762 完全一致

3.1.3 EurekaServiceApplication-8763

与四:Spring Cloud 之服务发现与调用-Ribbon#3.1.3 EurekaServiceApplication-8763完全一致

3.1.4 EurekaServiceFeignApplication

最简单的方式添加一个SpringBoot启动类型的启动类就行。

3.1.5 EurekaServiceRibbonApplication

最简单的方式添加一个SpringBoot启动类型的启动类就行。

###3.1.6 EurekaServiceZuulApplication
最简单的方式添加一个SpringBoot启动类型的启动类就行。

3.2 启动

  • EurekaServerSingletonApplication
  • EurekaServiceApplication-8762
  • EurekaServiceApplication-8763
  • EurekaServiceFeignApplication
  • EurekaServiceRibbonApplication
  • EurekaServiceZuulApplication

启动完成后Run Dashboard界面:
八:Spring Cloud 之服务路由网关-zuul_第2张图片

3.3 访问服务信息界面

八:Spring Cloud 之服务路由网关-zuul_第3张图片

3.4 调用服务

3.4.1 访问 /api-ribbon/

  • 多次访问 http://localhost:8768/api-ribbon/ribbon/print?name=oscar ,见到如下两图返回结果切换,表示路由正常工作,且负载均衡功能起作用
    八:Spring Cloud 之服务路由网关-zuul_第4张图片

这里写图片描述

3.4.2 访问 /api-feign/

  • 多次访问 http://localhost:8768/api-ribbon/ribbon/print?name=oscar ,见到如下两图返回结果切换,表示路由正常工作,且负载均衡功能起作用
    这里写图片描述

这里写图片描述

3.4.3 验证过滤器生效

3.4.3.1 不生效

访问:http://localhost:8768/api-ribbon/ribbon/print?name=oscar&shouldFilter=no

八:Spring Cloud 之服务路由网关-zuul_第5张图片

3.4.3.2 生效

访问:http://localhost:8768/api-ribbon/ribbon/print?name=oscar&shouldFilter=yes

八:Spring Cloud 之服务路由网关-zuul_第6张图片

4. 思考

  • zuul过滤器使用场景
  • 如何做分流
  • 能不能动态指定路由规则
  • 处理请求的整体流程
  • 如何做高可用

5. 补充

5.1 资料

5.2 Zuul的Filter类型

  • pre:可以在请求被路由之前调用
  • route:在路由请求时候被调用
  • post:在route和error过滤器之后被调用
  • error:处理请求时发生错误时被调用

5.2 lombok插件安装

打开IDEA的settings,按下图所示搜索并安装Lombok Plugin:
八:Spring Cloud 之服务路由网关-zuul_第7张图片

你可能感兴趣的:(微服务)