zoukankan      html  css  js  c++  java
  • springboot~zuul实现网关

    网关在微服务里的角色

    在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了:

    1. 统一授权
    2. 统一异常处理
    3. 路由导向
    4. 跨域处理
    5. 限流

    实践一下

    1 添加依赖

    dependencies {
    	implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
    	implementation('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
    	testImplementation('org.springframework.boot:spring-boot-starter-test')
        implementation('com.marcosbarbero.cloud:spring-cloud-zuul-ratelimit:1.3.2.RELEASE')
    }
    

    2 添加yml

    server:
      port: 8300
    spring:
      application:
        name: microservice-gateway-zuul
    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:6761/eureka
      instance:
        ip-address: true
    
    zuul:
     routes:
        users:
           path: /lind/** #以lind开头的路径被重定向到lind服务
           serviceId: lind
     add-host-header: true #显示真实的http头
     retryable: false #关闭Hystrix的重试功能
     ratelimit:
        enabled: true
       #  repository: REDIS
        behind-proxy: true
        policies:
           users:
             limit: 5 #限流,每分钟请求5次
             refresh-interval: 60
             type:
               - user
               - origin
               - url
             #       url类型的限流就是通过请求路径区分
             #       origin是通过客户端IP地址区分
             #       user是通过授权用户进行区分,也包括匿名用户
    

    3 添加实现代码
    http拦截器,获取用户ID,为子服务进行传递

    public class PreRequestLogFilter extends ZuulFilter {
      private static final Logger logger = LoggerFactory.getLogger(PreRequestLogFilter.class);
      private final RateLimiter rateLimiter = RateLimiter.create(1000.0);
    
      @Override
      public Object run() {
    
        try {
          RequestContext currentContext = RequestContext.getCurrentContext();
          HttpServletResponse response = currentContext.getResponse();
          HttpServletRequest reqeust = currentContext.getRequest();
    
          currentContext.addZuulRequestHeader("userId","123");//向子系统http头写数据
          currentContext.addZuulRequestHeader("userName","test");
    
          PreRequestLogFilter.logger.info(
              String.format("send %s request to %s",
                  reqeust.getMethod(),
                  reqeust.getRequestURL().toString()));
    
          if (!rateLimiter.tryAcquire()) {
            HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;
            response.setContentType(MediaType.TEXT_PLAIN_VALUE);
            response.setStatus(httpStatus.value());
            response.getWriter().append(httpStatus.getReasonPhrase());
            currentContext.setSendZuulResponse(false);
            throw new ZuulException(
                httpStatus.getReasonPhrase(),
                httpStatus.value(),
                httpStatus.getReasonPhrase()
            );
          }
        } catch (java.lang.Exception e) {
          ReflectionUtils.rethrowRuntimeException(e);
        }
        return null;
    
      }
    
      @Override
      public boolean shouldFilter() {
    
        // 判断是否需要过滤
        return true;
    
      }
    
    
      @Override
    
      public String filterType() {
    
        return FilterConstants.PRE_TYPE;
    
      }
    
    
      @Override
    
      public int filterOrder() {
    
        return Ordered.HIGHEST_PRECEDENCE;
    
      }
    
    
    }
    

    在主程中注入这个过滤器

      @Bean
      public PreRequestLogFilter preRequestLogFilter() {
        return new PreRequestLogFilter();
      }
    

    4 使用它
    在URL上通过localhost:8300/users/home 将进行lind服务里的home控制器下,并在http头上写入了userid和username这个键值对!

  • 相关阅读:
    在Linux下修改图形界面的分辨率
    Linux 常用命令
    读ActiveAndroid源码(三)
    读ActiveAndroid源码(二)
    读ActiveAndroid源码(一)
    Android中图片的文件储存
    构造器内部的多态方法的行为
    摸触事件分发的小实践——关闭View滑动
    【Java】 关于类的初始化
    git配置http代理
  • 原文地址:https://www.cnblogs.com/lori/p/9811526.html
Copyright © 2011-2022 走看看