SpringCloud不归路——Zuul

Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

作者:dalaoyang
链接:https://www.imooc.com/article/44600
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

作者:dalaoyang
链接:https://www.imooc.com/article/44600
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

思维导图

 

 

 

在微服务架构中,Zuul就是守门的大Boss!一夫当关,万夫莫开!

POM引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

开启Zuul

@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class ZuulDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulDemoApplication.class, args);
    }
}

配置文件编写

server:
  port: 10010 #服务端口
spring: 
  application:  
    name: api-gateway #指定服务名
//1 静态路由,无Eureka
zuul:
  routes:
    user-service: # 这里是路由id,随意写
      path: /user-service/** # 这里是映射路径
      url: http://127.0.0.1:8081 # 映射路径对应的实际url地址
//2 动态路由,有Eureka
zuul:
  routes:
    user-service: # 这里是路由id,随意写
      path: /user-service/** # 这里是映射路径
      serviceId: user-service # 指定服务名称
//3 动态路由一次简化(推荐使用)
zuul:
 prefix: /api # 添加路由前缀
  routes:
    user-service: /user-service/** # 这里是映射路径

//4 最简化,默认无需配置
按服务名约定

  

如果不把Zuul注册到注册中心就无法做到负载均衡,所以要引入Eureka,在此不做详述

 Zuul过滤

继承ZuulFilter抽象类

Zuul过滤器的类型和执行情况

抽象类解析

public abstract ZuulFilter implements IZuulFilter{
   
  //filterType:返回字符串,代表过滤器的类型。包含以下4种:pre:请求在被路由之前执行routing:在路由请求时调用post:在routing和errror过滤器之后调用error:处理请求时发生错误调用
abstract public String filterType();   
  //filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。
abstract public int filterOrder();
  //shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
boolean shouldFilter();// 来自IZuulFilter

  //run:过滤器的具体业务逻辑,返回值为null代表该过滤器什么都不做 Object run() throws ZuulException;// IZuulFilter }

 

自定义业务过滤器写法

@Component
public class LoginFilter extends ZuulFilter{
    @Override
    public String filterType() {
        // 登录校验,肯定是在前置拦截
        return "pre";
    }

    @Override
    public int filterOrder() {
        // 顺序设置为1
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        // 返回true,代表过滤器生效。
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 登录校验逻辑。
        // 1)获取Zuul提供的请求上下文对象,上下文中有request、response
        RequestContext ctx = RequestContext.getCurrentContext();
        // 2) 从上下文中获取request对象
        HttpServletRequest req = ctx.getRequest();
        // 3) 从请求中获取token
        String token = req.getParameter("access-token");
        // 4) 判断
        if(token == null || "".equals(token.trim())){
            // 没有token,登录校验失败,拦截
            ctx.setSendZuulResponse(false);
            // 返回401状态码。也可以考虑重定向到登录页。
            ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
        }
        // 校验通过,可以考虑把用户信息放入上下文,继续向后执行
        return null;
    }
}

 Zuul对于熔断机制和负载均衡的配置

zuul:
  retryable: true
ribbon:
  ConnectTimeout: 250 # 连接超时时间(ms)
  ReadTimeout: 2000 # 通信超时时间(ms)
  OkToRetryOnAllOperations: true # 是否对所有操作重试
  MaxAutoRetriesNextServer: 2 # 同一服务不同实例的重试次数
  MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:
  command:
      default:
        execution:
          isolation:
            thread:
              timeoutInMillisecond: 6000 # 熔断超时时长:6000ms

 

Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

作者:dalaoyang
链接:https://www.imooc.com/article/44600
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
posted @ 2020-12-02 20:03  别无所求---  阅读(122)  评论(0)    收藏  举报