随笔 - 28  文章 - 0  评论 - 0  阅读 - 6430

微服务组件:路由网关zuul

1. zuul介绍

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

 

zuul主要功能:

① zuul URL映射

② zuul serviceId映射;

③ zuul过滤器;

 

github代码地址:

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

  

2. zuul使用

2-1 启动服务提供端

1
2
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服务提供端

1
2
3
4
5
6
7
8
9
10
11
12
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过滤器,可以实现对外服务的安全机制,通过安全措施保护客户端只能访问它应该访问到的资源;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@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;
    }
}

  

1
2
3
4
5
6
7
8
@Configuration 
public class AppConfig { 
   
    @Bean 
    public AccessFilter accessFilter() { 
        return new AccessFilter(); 
    
}

  

1
2
3
4
5
6
7
8
9
@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   rabbit-xf  阅读(248)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示