SpringCloud的Zuul网关

  • 网关的作用相当于一个过虑器、拦截器,它可以拦截多个系统的请求.
  • Zuul:
    • 服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服
      务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。

    •  

      使用方法:

      • 使用@EnableZuulProxy注解

        • 注意在启动类上使用@EnableZuulProxy注解标识此工程为Zuul网关

           

      • 路由配置

        • zuul:
            routes:
              manage‐course: #路由名称,名称任意,保持所有路由名称唯一
              path: /course/**
              serviceId: service‐menu #指定服务id,从Eureka中找到服务的ip和端口
              #url: http://localhost:8080#也可指定url
              strip‐prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀
              sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
              # ignoredHeaders: Authorization
          
          
          serviceId:推荐使用serviceId,zuul会从Eureka中找到服务id对应的ip和端口。
          strip-prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀,例如,为true请
                        求/course/menu/get/..,代理转发到/coursebase/get/,如果为false则代理转发    
                        到/course/menu/get
          sensitiveHeaders:敏感头设置,默认会过虑掉cookie,这里设置为空表示不过虑
          ignoredHeaders:可以设置过虑的头信息,默认为空表示不过虑任何头
          

           

        • 网关配置文件
          • zuul:
              routes:
                xc‐service‐learning: #路由名称,名称任意,保持所有路由名称唯一
                  path: /menu/**
                  serviceId: service‐menu#指定服务id,从Eureka中找到服务的ip和端口
                  strip‐prefix: false
                  sensitiveHeaders:
            
            网关的配置可以是/**/user,但是这样配置的路径就不会被截取了.就是直接按照地址转发了.
        • 测试:

          • 使用postman访问网关,看看网关是否把请求转发到你的微服务上.

        • 过滤器

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

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

            • 1、 shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true表示要执行此过虑器,否则不执行。

            • 2、 run:过滤器的业务逻辑。

            • 3、 filterType:返回字符串代表过滤器的类型,如下 pre:请求在被路由之前执行 routing:在路由请求时调用 post:在routing和errror过滤器之后调用 error:处理请求时发生错误调用
              4、 filterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。

        • 测试

          • 过虑所有请求,判断头部信息是否有Authorization,如果没有则拒绝访问,否则转发到微服务。

          • 定义过虑器,使用@Component标识为bean

          • @Component
            public class LoginFilterTest extends ZuulFilter {
              private static final Logger LOG = LoggerFactory.getLogger(LoginFilterTest.class);
              @Override
              public String filterType() {
                return "pre";
              }
              @Override
              public int filterOrder() {
                return 2;//int值来定义过滤器的执行顺序,数值越小优先级越高
              }
              @Override
              public boolean shouldFilter() {// 该过滤器需要执行
                return true;
              }
              @Override
              public Object run() {
                RequestContext requestContext = RequestContext.getCurrentContext();
                HttpServletResponse response = requestContext.getResponse();
                HttpServletRequest request = requestContext.getRequest();
                //取出头部信息token
                String token= request.getHeader("token");
                if(StringUtils.isEmpty(token)){
                  requestContext.setSendZuulResponse(false);// 拒绝访问
                  requestContext.setResponseStatusCode(200);// 设置响应状态码
                  ResponseResult unauthenticated = new ResponseResult("此操作需要登录.请登录后再试!");
                  String jsonString = JSON.toJSONString(unauthenticated);
                  requestContext.setResponseBody(jsonString);
                  requestContext.getResponse().setContentType("application/json;charset=UTF‐8");
                  return null;
                }
                return null;
              }
            }
    • 网关超时: com.netflix.zuul.exception.ZuulException: Forwarding error

      • 在配置文件中增加
        zuul:
          host:
            connect-timeout-millis: 300000
            socket-timeout-millis: 60000
          retryable: true

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值