微服务组件:路由网关zuul

1. zuul介绍

  zuul是在微服务中提供动态路由、监控、弹性和安全等边缘服务的框架。实现了开放服务的控制权限机制,而不去破坏微服务无状态的特点。

 

zuul主要功能:

① zuul URL映射

② zuul serviceId映射;

③ zuul过滤器;

 

github代码地址:

https://github.com/sanqianyuejiamk/zuul-consul-demo

  

2. zuul使用

2-1 启动服务提供端

java -jar springboot-mvc-consul-s1-1.0-SNAPSHOT.jar
java -jar springboot-mvc-consul-s2-1.0-SNAPSHOT.jar

  

2-2 serviceId映射

zuul查询consul服务注册信息,将所有/user/**的访问都映射到microservice-provider-user服务提供端

spring:
  application:
    name: microservice-api-gateway
server:
  port: 8050

zuul:
#  ignored-services: microservice-provider-user                        # 需要忽视的服务(配置后将不会被路由)
  routes:
    movie:                                                            # 可以随便写,在zuul上面唯一即可;当这里的值 = service-id时,service-id可以不写。
      path: /user/**                                                 # 想要映射到的路径
      service-id: microservice-provider-user 

  

访问:

http://127.0.0.1:8050/user/app/v1/hystrix/t_fallback

 

2-3 过滤器

  利用zuul过滤器,可以实现对外服务的安全机制,通过安全措施保护客户端只能访问它应该访问到的资源;

@Slf4j
public class AccessFilter extends ZuulFilter {

    /**
     *  返回一个字符串代表过滤器的类型,在zuul中定义了四种不同的生命周期过滤器类型
     *  1)pre:在请求被路由之前调用;
     *  2)routing:在路由请求时候被调用;
     *  3)post:在routing和error过滤器之后被调用;
     *  4)error:处理请求时发生错误时被调用;
     *
     * @return
     */
    @Override
    public String filterType() {
        return ZuulFilterTypeEnums.PRE.getName();
    }

    /**
     *  通过int值来定义过滤器的执行顺序
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 50000;
    }

    /**
     *  返回一个boolean类型来判断该过滤器是否要执行
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return RequestContext.getCurrentContext().getRequest().getRequestURI().matches("/user/.*");
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("accessToken");
        if (accessToken == null) {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);//令zuul过滤该请求,不对其进行路由
            ctx.setResponseStatusCode(401);//返回的错误码
            return null;
        }
        log.info("access token ok");
        return null;
    }
}

  

@Configuration  
public class AppConfig {  
  
    @Bean  
    public AccessFilter accessFilter() {  
        return new AccessFilter();  
    }  
} 

  

    @Test
    public void test_zuul_token_filter_01() {
        log.info("test_zuul_token_filter_01..");
        Response response = RestAssured.get("http://127.0.0.1:8050/user/app/v1/hystrix/t_fallback?orgCode=123456&accessToken=123456");
        assertEquals(200, response.getStatusCode());

        String result = response.getBody().asString();
        assertEquals("success", result);
    }

  

posted on 2022-01-09 15:33  rabbit-xf  阅读(265)  评论(0)    收藏  举报