springcloud zuul 笔记

79 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

0 环境

  • 操作系统:win10
  • 编辑器:idea
  • springcloud版本:H版

1 前言

每个微服务地址都有可能发生变化 通过API聚合内部服务 分割内外部系统 屏蔽内部实现细节 (可能理解不到位 多多包涵 类比台式机(无外壳) --> 外壳 --> 使用者 直接用无外壳台式机就可以嘿嘿了 但是为了更加耐操 需要安装外壳 再去使用它 相对来说无盖灰尘更容易进去/液体/一激动不小心提到了等 为了保护内部部件嘛 使用者不能直接与其接触)

  • 对外部请求的组件进行处理 -> 服务网关
    • 好处
      • 客户端调用更加简单
      • 权限问题统一处理
      • 数据分割和拼接
      • 不同客户端可提供不同的网关支持
  • 常见的网关
    • zuul
    • gateway

2 zuul简介

  • zuul功能(核心过滤器)
    • 动态路由
    • 监控
    • 权限控制(认证鉴权)
    • 静态资源处理
    • 负载均衡
    • 灰度发布

3 初识zuul

3.1 创建springboot项目(zuul)

  • 用到eureka server和provider还有zuul 说启动就是重启/开启这个3个启动类 之后不在重复说了

3.2 yml配置

设置应用名 端口 连接eureka

spring:
  application:
    name: zuul

server:
  port: 2021

eureka:
  client:
    service-url:
      #      defaultZone: http://localhost:1234/eureka
      defaultZone: http://localhost:8761/eureka

3.3 在启动类上开启路由代理

@SpringBootApplication
// 开启网关代理
@EnableZuulProxy
public class ZuulApplication {

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

}

3.4 启动

3.5 yml路由配置

  • provider --> 太过显眼 我想起个别名去调用它里面的服务
# 路由规则配置 复杂版
#zuul:
#  routes:
#    newbie:
#      path:
#        /newbie/**
#      service-id:
#        provider

# 路由规则配置 精简版
zuul:
  routes:
    provider:
      /newbie/**

3.6 小结

依赖添加 开启zuul代理 yml配置 zuul --> routes --> 服务名 --> 自定义服务名及范围

4 zuul过滤器

  • zuul过滤器 4种类型
    • pre: 在路由请求调用前 做验证
    • routing: 路由请求调用中 做一下自定义逻辑
    • post: 在routing和post之后被调用
    • error: 处理请求调用时的错误

执行顺序 pre --> routing --> post(任何一个过滤器异常 都会进入error)

  • 配置过滤器
// 简单权限过滤器(只是试验而已)
@Component
public class ParmPermissFilter extends ZuulFilter {

    // 过滤器类型 权限判断一般是pre
    @Override
    public String filterType() {
        return "pre";
    }

    // 过滤器优先级
    @Override
    public int filterOrder() {
        return 0;
    }

    // 是否过滤 修改一下(true --> 是)
    @Override
    public boolean shouldFilter() {
        return true;
    }

    // 判断逻辑
    // 在源码已经说过了 该返回值忽略它 无所谓返回了
    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String name = request.getParameter("name");
        if (!"烤肉".equals(name)) {
            // 设置响应返回
            // 设置响应头(乱码)
            context.addZuulResponseHeader("content-type","text/html;charset=utf-8");
            // 响应码
            context.setResponseStatusCode(401);
            context.setResponseBody("请求拦截");
            context.setSendZuulResponse(false);
        }
        return null;
    }
}
  • 启动

访问http://localhost:2021/newbie/hello?name=111 在这里插入图片描述

4 其他配置简介

  • yml配置
# 注意
# /consumer/**与/consumer/hello/**属于包含关系
# 假设我想访问/consumer/hello/ --> 目标是consumer-a
# 但结果不是我们想要的(冲突) 但是我想访问consumer-a(因为yml有优先级的 只要调换它们位置即可)
# 在properties配置属于无序 调也没用
#zuul:
#  routes:
#    consumer:
#      /consumer/**
#    consumer-a:
#      /consumer/hello/**

# 路径忽略
#zuul:
#  # 忽略某类地址
#  ignored-patterns: /**/art/**
#  # 忽略服务
#  ignored-services: provider

#前缀
#zuul:
#  # 加前缀 所有请求地址都会多一个/milk
#  prefix: /milk

# 本地跳转
#zuul:
#  routes:
#   服务名:
#     url:
#       forward:/xxx