zoukankan      html  css  js  c++  java
  • SpringCloud微服务(05):Zuul组件,实现路由网关控制

    本文源码:GitHub·点这里 || GitEE·点这里

    一、Zuul组件简介

    1、基础概念

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

    2、Zuul的作用

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

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

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

    3、案例结构

    启动顺序如下:

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

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

    二、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 =
                            "{
    " +
                                ""code": 200,
    " +
                                ""message": "微服务飞出了地球"
    " +
                            "}";
                    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/spring-cloud-base
    GitEE·地址
    https://gitee.com/cicadasmile/spring-cloud-base
    

  • 相关阅读:
    sql 一对多变成一对多的最后一条记录的做法
    2.如何优化操作大数据量数据库(改善SQL语句)
    asp数据操作类DB
    4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
    【转】asp中记录集对象的getrows和getstring用法
    用DB类写新闻系统1
    Apache+Tomcat配置负载均衡
    C# CAD 几何图形周围创建尽可能小的圆 使用 .NET 在 2D AutoCAD
    C# Cad 2007 工具栏 工具条创建
    C# Cad 拉伸 关键 GetStretchPoints MoveStretchPointsAt
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/11355224.html
Copyright © 2011-2022 走看看