• 微服务组件之Zuul


    Zuul

    ZuulNetflix开源的微服务网关组件,负责网络请求路由和过滤;

    概念

    路由

    zuul作为一个外部访问的统一入口,转发网络请求到指定的的微服务实例;

    zuul从服务注册中心eureka获取到所有已经注册的微服务实例的信息,在接收到外部请求时,根据路由规则将匹配到的请求关键字映射到具体的微服务实例接口路径,以此能够调用具体的微服务。

    过滤

    zuul对外部的网络请求进行一个预处理,做一些请求校验等操作;

    zuul的核心是过滤器,大部分功能依赖过滤器来实现

    过滤器

    Zuul中定义了4种标准过滤器类型

    • PRE 在请求之前进行过滤,可以做一些身份认证、参数验证、认证鉴权、限流等
    • ROUTING 将请求路由到微服务
    • POST 请求路由到微服务之后执行
    • ERROR 在其他过滤器发生错误时执行,可以做全局异常处理

    我们也可以通过扩展ZuulFilter抽象类,来自定义过滤器

    @Component
    @Slf4j
    public class CustomizeZuulFilter extends ZuulFilter {
        //返回过滤器的类型(pre、route、post、error)
        @Override
        public String filterType() {
            return FilterConstants.PRE_TYPE;
        }
    
        //指定过滤器的执行顺序
        @Override
        public int filterOrder() {
            return 1;
        }
    
        //该过滤器是否要执行,true表示执行, false表示不执行
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        //过滤器的具体逻辑
        @Override
        public Object run() throws ZuulException {
            log.info("过滤请求...");
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    实战演练

    1.准备eureka服务,用于服务注册管理;

    2.搭建两台业务服务,实例名称分别为producer-serviceconsumer-service,并且注册到eureka

    producer-serviceconsumer-service分别提供接口

    @Controller
    @RequestMapping("/orderService/service")
    public class ProduceController {
        @ResponseBody
        @RequestMapping("/get")
        public String get(){
            return "producer info";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @RequestMapping("/orderService/service")
    public class ConsumeController {
        @ResponseBody
        @RequestMapping("/get")
        public String get(){
            return "consumer info";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.搭建网关服务

    (1)引入依赖

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-zuulartifactId>
        <version>${spring.cloud.netflix.version}version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)配置

    服务自身配置、注册eureka、路由配置

    server.port=8090
    spring.application.name=gateway
    eureka.client.enabled=true
    
    #eureka-config
    spring.security.user.name=admin
    spring.security.user.password=123456
    eureka.client.service-url.defaultZone=http://admin:123456@127.0.0.1:10001/eureka
    eureka.client.fetch-registry=true
    
    #路由配置
    zuul.routes.producer-service.path=/producerService/**
    zuul.routes.consumer-service.path=/consumerService/**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (3)启动类

    使用@EnableZuulProxy注解,启用网关功能

    @EnableZuulProxy
    @SpringBootApplication
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.访问测试

    浏览器请求:http://localhost:8090/producerService/orderService/service/get,返回结果:

    在这里插入图片描述

    浏览器请求:http://localhost:8090/consumerService/orderService/service/get,返回结果:

    在这里插入图片描述

    /producerService/**的请求路由到了producer-service服务;

    /consumerService/**的请求路由到了consumer-service服务;

    如果我们自定义了过滤器,与此同时,控制台会打印过滤器的日志信息;

    2022-11-02 11:14:57.532  INFO 58616 --- [nio-8090-exec-1] c.e.gateway.config.CustomizeZuulFilter   : 过滤请求...
    
    • 1

    总结

    本节主要讲述了微服务网关组件zuul的相关概念,包括zuul的路由和过滤功能,结合代码演练学习zuul在微服务项目中如何使用。

  • 相关阅读:
    【无标题】
    Redis学习笔记(常用数据类型,发布订阅,事务和锁机制,持久化,集群,雪崩,缓存击穿,分布式锁)
    校园综合服务平台V3.9.2 源码修复大部分已知BUG
    STM32:TIM通道输入捕获
    华为eNSP配置专题-OSPF路由协议的配置
    MYSQL索引使用注意事项
    低代码搭建高效管理房屋检测系统案例分析
    分布式概念:编码一个简单分布式系统
    vue与react,angular的区别
    LXMERT:视觉语言跨模态框架
  • 原文地址:https://blog.csdn.net/Wang_Dong_Liang/article/details/127648579