计算机系统应用教程网站

网站首页 > 技术文章 正文

Zuul 路由网关

btikc 2024-11-22 11:11:19 技术文章 47 ℃ 0 评论

什么是 Zuul

  • Spring Cloud Zuul 是整合Netflflix公司的 Zuul开源项目(官方:https://github.com/Netflflix/zuul);
  • Zuul 包含了对请求路由和校验过滤两个最主要的功能:

其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,

客户端请求网关/api/product,通过路由转发到 product 服务

客户端请求网关/api/order,通过路由转发到 order 服务

而过滤功能则负责对请求的处理过程进行干预,是实现请求校验等功能的基础.

  • Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

注意:Zuul服务最终还是会注册进Eureka

Zuul 路由功能实战

新建 cyz-cloud-zuul-gateway

配制pom.xml文件

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--zuul路由网关依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
</dependencies>

配置application.properties文件

server.port=7001
spring.application.name=zuul-gateway
#服务注册,false表示不将自已注册到Eureka服务中
eureka.client.register-with-eureka=true
#服务发现,false表示自己不从Eureka服务中获取注册信息
eureka.client.fetch-registry=true
#Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
eureka.client.service-url.defaultZone=http://cyz01.com:6001/eureka/,http://cyz02.com:6002/eureka/

eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true

#路由名称,名称任意,路由名称唯一# 访问路径
zuul.routes.provider-product.path=/product/**
#指定服务ID,会自动从Eureka中找到此服务的ip和端口
zuul.routes.provider-product.service-id=cyz-provider
#代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时 请求 /product/get/1,代理转发到/get/1
zuul.routes.provider-product.strip-prefix=false

# 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
# provider-order: #path: /order/** #serviceId: microservice-order #stripPrefix: false

配置启动类

//开启zuul的功能
@EnableZuulProxy
@SpringBootApplication
public class ZuulGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulGatewayApplication.class,args);
    }
}

测试zuul是否已被注册

测试zuul路由服务是否注册进Eureka注册中心

1. 启动2个 eureka

2. 启动服务提供者:cyz-cloud-provider-hystrix

3. 启动路由:cyz-cloud-zuul-gateway

4. 效果如下:http://cyz01.com:6001/

5. 不用路由直接访问

访问:http://localhost:8001/product/get/1

6. 使用路由访问 (注意是 7001 端口), 当前要加上服务名

访问:http://localhost:7001/cyz-provider/product/get/1?token=uieie

路由转发映射配置

在 application.properties配置文件中追加部分

#路由名称,名称任意,路由名称唯一# 访问路径
zuul.routes.provider-product.path=/product/**
#指定服务ID,会自动从Eureka中找到此服务的ip和端口
zuul.routes.provider-product.service-id=cyz-provider
#代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时 请求 /product/get/1,代理转发到/get/1
zuul.routes.provider-product.strip-prefix=false

# 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
#zuul.routes.provider-order.path=/order/**
#zuul.routes.provider-order.service-id=cyz-order
#zuul.routes.provider-order.strip-prefix=false

测试zuul路由功能

1. 基于上面8.2.5测试启动的服务中, 重启路由:microservice-cloud-10-zuul-gateway-7001

2. 未配置路由转发映射, 通过路由请求方式 :

http://localhost:7001/cyz-provider/product/get/1

3. 已配置路由转发映射, 通过路由请求方式 :

http://localhost:7001/product/get/1

只要接收到/product开头的路径,就会转发到 cyz-cloud-provider-hystrix 服务。

Zuul 过滤器实战

Zuul核心就是过虑器,通过过虑器实现请求过虑,身份校验等。

自定义过滤器

  • 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的4个方法,如下:

fifilterType:返回字符串代表过滤器的类型,返回值有:

pre:在请求路由之前执行

route:在请求路由时调用

post:请求路由之后调用,也就是在route和errror过滤器之后调用

error:处理请求发生错误时调用

fifilterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。

shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。

run:过滤器的业务逻辑。

  • 自定义过滤器 LoginFilter

继承 ZuulFilter

在类上添加 @Component 注解 (一定不要少了)

实现抽象方法

package com.cyz.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;


/**
 * @author Cyz
 * @description
 * @date 2022/5/4 20:58
 */
@Component
public class LoginFilter extends ZuulFilter {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public String filterType() {
        //请求路由前调用
        return "pre";
    }

    @Override
    public int filterOrder() {
        //int值来定义过滤器的执行顺序,数值越小优先级越高
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        //该过滤器是否执行,true执行,false不执行
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        //获取请求参数token的值
         String token = request.getParameter("token");
         if (token == null) {
             logger.warn("此操作需要先登录系统...");
             context.setSendZuulResponse(false);
//           拒绝访问
             context.setResponseStatusCode(200);
//           设置响应状态码
         try {
//           响应结果
             context.getResponse().getWriter().write("token is empty"); }
         catch (IOException e) {
            e.printStackTrace(); }
            return null;
         }
         logger.info("ok");
         return null;
    }
}

测试功能

1. 启动2个 eureka

2. 启动服务提供者:cyz-cloud-provider-hystrix

3. 启动路由:cyz-cloud-zuul-gateway

4. 通过路由(7001)访问服务提供者:

不带 token参数访问:http://localhost:7001/product/get/1

带 token参数访问:http://localhost:7001/product/get/1?token=cyz

带上token校验通过放行。

参考源码:https://gitee.com/cyzgw/spring-cloud.git

原文链接:cyz

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表