SpringCloud微服务(05):Zuul组件,实现路由网关控制

Easter79
• 阅读 811

一、Zuul组件简介

1、基础概念

Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。

2、Zuul的作用

1)按照不同策略,将请求转发到不同的服务上去;

2)聚合API接口,统一对外暴露,提高系统的安全性;

3)实现请求统一的过滤,以及服务的熔断降级;

3、案例结构

SpringCloud微服务(05):Zuul组件,实现路由网关控制

启动顺序如下:

# 注册中心
node05-eureka-7001
# 两个服务提供者
node05-provider-6001
node05-provider-6002
# 网关控制
node05-zuul-7002

启动成功后,注册中心展示如下:

SpringCloud微服务(05):Zuul组件,实现路由网关控制

二、Zuul使用详解

1、核心依赖

<!-- 路由网关 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

2、核心配置文件

server:
  port: 7002
spring:
  application:
    name: cloud-node05-parent
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://registry01.com:7001/eureka/
zuul:
  # 前缀,可以用来做版本控制
  prefix: /v1
  # 禁用默认路由,执行配置的路由
  ignored-services: "*"
  routes:
    # 配置6001接口微服务
    pro6001:
      serviceId: node05-provider-6001
      path: /api-6001/**
    # 配置6002接口微服务
    pro6002:
      serviceId: node05-provider-6002
      path: /api-6002/**
  • 启动类注解:@EnableZuulProxy

3、统一服务降级

实现FallbackProvider接口,自定义响应提示。

@Component
public class FallBackConfig implements FallbackProvider {
    private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;
    @Override
    public ClientHttpResponse fallbackResponse(Throwable cause) {
        // 捕获超时异常,返回自定义信息
        if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return fallbackResponse();
        }
    }
    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() {
                return status;
            }
            @Override
            public int getRawStatusCode() {
                return status.value();
            }
            @Override
            public String getStatusText() {
                return status.getReasonPhrase();
            }
            @Override
            public void close() {
                LOGGER.info("close");
            }
            @Override
            public InputStream getBody() {
                String message =
                        "{\n" +
                            "\"code\": 200,\n" +
                            "\"message\": \"微服务飞出了地球\"\n" +
                        "}";
                return new ByteArrayInputStream(message.getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
    @Override
    public String getRoute() {
        return "*";
    }
    @Override
    public ClientHttpResponse fallbackResponse() {
        return response(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

4、统一过滤器

继承ZuulFilter类,自定义过滤动作。

@Component
public class FilterConfig extends ZuulFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;
    @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() ;
        try {
            doBizProcess(requestContext);
        } catch (Exception e){
            LOGGER.info("异常:{}",e.getMessage());
        }
        return null;
    }

    public void doBizProcess (RequestContext requestContext) throws Exception {
        HttpServletRequest request = requestContext.getRequest() ;
        String reqUri = request.getRequestURI() ;
        if (!reqUri.contains("getAuthorInfo")){
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            requestContext.getResponse().getWriter().print("Path Is Error...");
        }
    }
}

5、测试流程

1)测试网关配置

访问如下接口,响应正常,说明网关配置生效:

http://localhost:7002/v1/api-6001/getAuthorInfo/1
http://localhost:7002/v1/api-6002/getAuthorInfo/2

2)测试服务降级

关闭6001服务,再次访问接口,提示信息如下,说明服务降级策略生效:

{
    "code": 200,
    "message": "微服务飞出了地球"
}

3)测试过滤器

因为请求URI不匹配getAuthorInfo,所以被拦截,说明过滤器略生效:

http://localhost:7002/v1/api-6001/
响应提示:
Path Is Error...

三、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile
码云地址:知了一笑
https://gitee.com/cicadasmile

SpringCloud微服务(05):Zuul组件,实现路由网关控制

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springboot2.0下的zuul路由网关初探
Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由、过滤、监控、弹性伸缩和安全。为什么需要ZuulZuul、Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能;网关将所有服务的API接口统一聚合,统一对外暴露。外界调用API接口时,不需要知道微服务系统中各服务相互调用的复杂性,保护了内部微服务单元的API接口;网关可以做
Stella981 Stella981
3年前
Spring Cloud系列教程(九):服务网关Zuul(Finchley版本)
一、前言Zuul是netflix开源的一个API网关服务器,其本质上是一个webservlet应用。Zuul是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul相当于是PC、APP、H5等客户端和Netflix流应用的Web网站后端所有请求的前门,Zuu
Easter79 Easter79
3年前
SpringCloud系列——Zuul 动态路由
  前言  Zuul是在SpringCloudNetflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和Netflix流应用的Web网站后端所有请求的前门。本文基于上篇(SpringCloud系列——Ribbon负载均衡(https://www.
Stella981 Stella981
3年前
Nepxion Discovery 5.5.0 发布
!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度
Easter79 Easter79
3年前
SpringCloud之zuul搭建
一、zuul简介Zuul的主要功能是路由和过滤器。路由功能是微服务的一部分,比如/api/user映射到user服务,/api/shop映射到shop服务。zuul实现了负载均衡。zuul有以下功能:AuthenticationInsightsStressTestingCanaryTesting
Stella981 Stella981
3年前
Netflix正式开源其API网关Zuul 2
微信公众号:聊聊架构5月21日,Netflix在其官方博客上宣布正式开源微服务网关组件Zuul2。Netflix公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相当多的微服务组件(详见GitHub主页),受到了业内同行的高度认可。Zuul是Netflix于2013年6月12日开源的网关组件,目前在
Easter79 Easter79
3年前
SpringCloud学习之Zuul路由转发、拦截和熔断处理(七)
SpringCloudZuul服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供RESTAPI的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。SpringCloudNetflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制
Easter79 Easter79
3年前
SpringCloud(第 018 篇)Zuul 服务 API 网关微服务之代理与反向代理
SpringCloud(第018篇)Zuul服务API网关微服务之代理与反向代理一、大致介绍1、API服务网关顾名思义就是统一入口,类似nginx、F5等功能一样,统一代理控制请求入口,弱化各个微服务被客户端记忆功能;
Easter79 Easter79
3年前
SpringCloud学习笔记(七)之路由网关Zuul
是什么Zuul包含了对请求路由和过滤两个最主要的功能:其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微
Easter79 Easter79
3年前
SpringCloud 微服务 (十三) 服务网关 Zuul 路由
壹本篇延续上篇Zuul基础学习,做一个实践测试在之前学习的篇章中,一直积累学习,所以这边已经存在注册中心,product服务,order服务,config配置中心等等服务,每次写demo,注册中心和配置中心都是一直先启动,本次学习Zuul也不例外贰新建一个服务,第一步利用IDEA创建!(https://oscimg.osch
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k