微服务组件:路由网关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); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗