springcloud组件之四:Zuul(zuul网关&网关过滤器)

四、Zuul实现微服务统一网关

1. 微服务网关介绍

为什么需要网关?

  • 客户端多次请求不同的微服务,增加客户端的复杂性
  • 每个服务都需要独立认证,过于复杂
  • 存在跨域请求,在特殊场景下处理比较复杂
  • 难以重构

Zuul

  • 身份认证和安全(如:将token认证暂存到zuul中)
  • 审查与监控
  • 动态路由
  • 静态响应处理
  • 弹性负载均衡

2.创建网关服务器进行模拟练习

2.1 创建springboot项目zuul-server,类型选择web。

2.2 pom降版本为1.5.9,导依赖springcloud、Eureka client、zuul server

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.5.RELEASE</version>
</dependency>
       
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>1.3.5.RELEASE</version>
</dependency>

2.3 编写yml配置

添加微服务名称,自定义网关

zuul:
  routes:
    eureka-consumer-demo: /user/**

在这里插入图片描述
2.4 启动类增加注解

@EnableDiscoveryClient
@EnableZuulProxy
@EnableFeignClients

2.5 启动项目,访问网址,成功

3. 网关过滤器

问题产生:
每个服务在处理请求的时候都要判断是否验证token
需要验证token是否有效

问题分析:
效率低
每个请求都需要转发到具体的微服务后再判断,然后将判断的结果回转给网关

问题解决:
在网关转发前就行进过滤处理

3.1 过滤器分类

**过滤器分类**

PRE
请求被路由转发到微服务之前调用的过滤器

ROUTING
请求被路由转发到微服务时调用的过滤器

POST
请求被路由转发到微服务之后调用的过滤器

ERROR
在其他阶段发生错误时调用的过滤器

3.2 添加过滤器的步骤

(1) 创建过滤器类,继承ZuulFilter,重写方法

filterType():过滤器类型
filterOrder():过滤顺序
shouldFilter():是否进行拦截过滤
run():确定需要拦截之后执行的方法

(2) 编辑重写的方法如下:

public class PreFilter extends ZuulFilter {

//    filterType():过滤器类型
    @Override
    public String filterType() {
        return "pre";
    }

//    filterOrder():过滤顺序 0代表第一个
    @Override
    public int filterOrder() {
        return 0;
    }

//    shouldFilter():是否进行拦截过滤  true:拦截
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        System.out.println("测试能否拦截到================");
        return null;
    }
}

(3)启动类加注解@bean 或 filter类加注解@Component

   @Bean
    public PreFilter preFilter(){
        return new PreFilter();
    }

(4)启动项目,刷新请求网址http://localhost:8086/user/login,测试是否有拦截,成功

内容太多了 我做了模块内容分离,springcloud的5个组件:feign、hystrix、ribbon、zuul、config都有博文分别介绍,如有需要请查看:
springcloud组件之一:feign(client)

springcloud组件之二:hystrix(容错&Hystrix处理容错&Feign项目的监控&Hystrix Dashboard可视化监控&Turbine聚合监控)

springcloud组件之三:Ribbon(轮询和随机负载)

springcloud组件之四:Zuul(zuul网关&网关过滤器)

springcloud组件之五:Config实现分布式配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值