(四)API网关zuul

Zuul的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:

  • 动态路由:动态地将客户端的请求路由到后端不同的服务,做一些逻辑处理,比如聚合多个服务的数据返回。
    请求监控:可以对整个系统的请求进行监控,记录详细的请求响应日志,可以实时统计出当前系统的访问量以及监控状态。
  • 认证鉴权:对每一个访问的请求做认证,拒绝非法请求,保护好后端的服务。
  • 压力测试:压力测试是一项很重要的工作,像一些电商公司需要模拟更多真实的用户并发量来保证重大活动时系统的稳定。通过Zuul可以动态地将请求转发到后端服务的集群中,还可以识别测试流量和真实流量,从而做一些特殊处理。
  • 灰度发布:灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
使用Zuul构建微服务网关
  1. 基本环境
    参考:https://blog.csdn.net/admin_15082037343/article/details/107134802

  2. 新建子模块:demo-zuul,添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. 启动类
package com.demo.zuul;

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

@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulApplication {

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

}
  1. application.yml
server:
  port: 8080

spring:
  application:
    name: demo-zuul
zuul:
  routes:
    demo-client:
      path: /user/**

eureka:
  client:
    service-url:
      defaultZone: http://admin:123456@127.0.0.1:8761/eureka/

这里表示对/user/**的访问会转发到demo-client上
访问http://127.0.0.1:8080/user/user/4028a881727903dc017279105f520002

Zuul过滤器类型

Zuul中的过滤器总共有4种类型,每种类型都有对应的使用场景。

  • pre:可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。
  • route:在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。
  • post:在route和error过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。
  • error:处理请求时发生错误时被调用。在执行过程中发送错误时会进入error过滤器,可以用来统一记录错误信息。

定义一个pre类型的过滤器

package com.demo.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

@Component
public class MyFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";
    }

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

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        // 当前请求上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        String name = requestContext.getRequest().getParameter("name");
        if (name == null || name.trim().isEmpty()) {
            // 不需要将当前请求转发到后端
            requestContext.setSendZuulResponse(false);
            // 客户端响应
            requestContext.setResponseBody("error");
        }
        return null;
    }

}

filterOrder():当前过滤器的执行顺序,数字越小越先执行
shouldFilter():true代表执行当前过滤器,false代表不执行
run():逻辑处理,RequestContext.getCurrentContext()获取当前请求上下文。
RequestContext对象的set()方法可以向下一个过滤器传递参数,如下:

// 存值
requestContext.set("name", "zhangsan");
// 取值
requestContext.get("name")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流年ln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值