Zuul 笔记补充

1. 服务网关

由于每个微服务的地址都有可能发生变化,无法直接对外公布这些服务地址,基于安全以及高内聚低耦合等设计,我们有必要将内部系统与外部系统做一个切割。
一个专门用来处理外部请求的组件就是服务网关。

  • 好处:
  • 客户端调用更加简单
  • 权限问题统一处理
  • 数据分割和拼接
  • 不同客户端可提供不同的网关支持

Spring Cloud 中,常见的网关:

  • Zuul
  • Spring Cloud Gateway

2. Zuul 简介

Zuul 的功能

  • 监控
  • 权限控制(认证和授权)
  • 动态路由
  • 负载均衡
  • 静态资源处理

Zuul 中的功能基本上都是基于过滤器实现,它的过滤器有几种不同的类型:

  1. PRE (前置过滤器,比如要做声明校验)
  2. ROUTING (过滤器将请求路由到微服务上面)
  3. POST (请求的微服务执行完之后,这个过滤器才执行)
  4. ERROR (过滤器执行出错时进入error)

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

2.1 初识 Zuul

首选创建项目,添加依赖:
在这里插入图片描述
创建成功后,将项目注册到Eureka上:

spring.application.name=zuul
server.port=2020
eureka.client.service-defaultZone=http://localhost:1111/eureka

然后在启动类上开启路由代理:

@SpringBootApplication
// 开启网关代理
@EnableZuulProxy
public class ZuulApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

配置完成后,重启 Eureka 、Provider、Zuul ,接下来在浏览器中,通过 Zuul 的代理就可以访问到 provider 了。访问:http://localhost:2020/provider/hello 与直接访问 http://localhost:1113/hello
的结果是一样的。在这个访问中, provider 就是要访问的服务名称,/hello 则是要访问的服务接口。
以上是一个简单的例子,Zuul 中的路由规则也可以自己配置。如下:

zuul.routes.javaboy-a.path=/javaboy-a/**
zuul.routes.javaboy-a.service-id=provider

此时。重启服务后,直接访问 http://localhost:2020/javaboy-a/hello 即可。与上述访问结果一致。
对于上面的配置也可以进行简化:

zuul.routes.provider=/javaboy-a/**

2.2 zuul过滤

对于来自客户端的请求,可以在 Zuul 中进行预处理,例如权限判断等。
定义一个简单的权限过滤器:

@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;
    }
}

重启 Zuul ,然后访问请求必须带上 name 参数,否则请求不通过。如下:
http://127.0.0.1:2020/javaboy-a/hello?name=烤肉

访问:http://127.0.0.1:2020/javaboy-a/hello 会被拦截。如下:

在这里插入图片描述

2.3 Zuul 中的其他配置

2.3.1 匹配规则

例如有两个服务,一个叫 consumer ,另一个叫 consumer-hello ,在做路由规则设置时,假如出现了如下配置:

zuul.routes.consumer=/consumer/**
zuul.routes.consumer-hello=/consumer/hello/**

此时如果访问 http://localhost:2020/consumer/hello/123 ,会出现冲突。这时,只需将配置文件改为 yml 格式就可以了(yml 是有优先级的,只要调换它们位置即可。properties文件是无序的)。

2.3.2 忽略路径

默认情况下,zuul 注册到 eureka 上之后, eureka 上的所有注册服务都会被代理。如果不想给某一个服务做代理,可忽略该服务,配置如下:

# 表示忽略 provider 服务,此时就不会自动代理
zuul.ignored-services=provider

也可以忽略某一类地址:

# 表示请求路径中如果包含 hello ,则不做代理
zuul.ignored-patterns=/**/hello/**
2.3.3 前缀

也可以给路由加前缀。

zuul.prefix=/javaboy

这样所有的请求地址自动多了前缀: /javaboy

项目地址:https://github.com/astronger/springcloud-simple-samples

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李多肉同学

长得好看的人一般都喜欢发红包

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

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

打赏作者

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

抵扣说明:

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

余额充值