Spring Cloud Zuul路由网关服务过滤实现代码
Zuul简介
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/admin转发到到Admin服务,/api/member转发到到Member服务。Zuul默认和Ribbon结合实现了负载均衡的功能。
引入依赖
在pom.xml中主要添加spring-cloud-starter-netflix-eureka-server和spring-cloud-starter-netflix-zuul依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.cloud spring-cloud-starter-netflix-zuul
相关配置
在application.yml中主要添加Zuul路由配置
zuul: routes: api-a: path:/api/ribbon/** serviceId:hello-spring-cloud-web-admin-ribbon api-b: path:/api/feign/** serviceId:hello-spring-cloud-web-admin-feign
路由说明:
以/api/ribbon开头的请求都转发给spring-cloud-web-admin-ribbon服务
以/api/feign开头的请求都转发给spring-cloud-web-admin-feign服务
在Application入口类中添加@EnableZuulProxy注解开启zuul功能
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy publicclassZuulApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(ZuulApplication.class,args); } }
配置网关路由失败时的回调
创建WebAdminFeignFallbackProvider回调类
/** *路由hello-spring-cloud-web-admin-feign失败时的回调 */ @Component publicclassWebAdminFeignFallbackProviderimplementsFallbackProvider{ @Override publicStringgetRoute(){ //ServiceId,如果需要所有调用都支持回退,则return"*"或returnnull return"hello-spring-cloud-web-admin-feign"; } /** *如果请求服务失败,则返回指定的信息给调用者 *@paramroute *@paramcause *@return */ @Override publicClientHttpResponsefallbackResponse(Stringroute,Throwablecause){ returnnewClientHttpResponse(){ /** *网关向api服务请求失败了,但是消费者客户端向网关发起的请求是成功的, *不应该把api的404,500等问题抛给客户端 *网关和api服务集群对于客户端来说是黑盒 *@return *@throwsIOException */ @Override publicHttpStatusgetStatusCode()throwsIOException{ returnHttpStatus.OK; } @Override publicintgetRawStatusCode()throwsIOException{ returnHttpStatus.OK.value(); } @Override publicStringgetStatusText()throwsIOException{ returnHttpStatus.OK.getReasonPhrase(); } @Override publicvoidclose(){ } @Override publicInputStreamgetBody()throwsIOException{ ObjectMapperobjectMapper=newObjectMapper(); Mapmap=newHashMap<>(); map.put("status",200); map.put("message","无法连接"); returnnewByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8")); } @Override publicHttpHeadersgetHeaders(){ HttpHeadersheaders=newHttpHeaders(); //和getBody中的内容编码一致 headers.setContentType(MediaType.APPLICATION_JSON_UTF8); returnheaders; } }; } }
测试路由访问
依次运行EurekaApplication>ServiceAdminApplication>WebAdminRibbonApplication>WebAdminFeignApplication>ZuulApplication各服务
访问:http://localhost:8769/api/ribbon/hi?message=zuul
浏览器显示
port:8763,message:zuul
访问:http://localhost:8769/api/feign/hi?message=zuul
浏览器显示
port:8763,message:zuul
至此说明Zuul的路由功能配置成功。
使用Zuul的服务过滤功能
Zuul不仅仅只是路由,还有很多强大的功能。比如用在安全验证方面。
创建服务过滤器
/** *Zuul的服务过滤演示 */ @Component publicclassLoginFilterextendsZuulFilter{ privatestaticfinalLoggerlogger=LoggerFactory.getLogger(LoginFilter.class); /** *配置过滤类型,有四种不同生命周期的过滤器类型 *1.pre:路由之前 *2.routing:路由之时 *3.post:路由之后 *4.error:发送错误调用 *@return */ @Override publicStringfilterType(){ return"pre"; } /** *配置过滤的顺序 *@return */ @Override publicintfilterOrder(){ return0; } /** *配置是否需要过滤:true/需要,false/不需要 *@return */ @Override publicbooleanshouldFilter(){ returntrue; } /** *过滤器的具体业务代码 *@return *@throwsZuulException */ @Override publicObjectrun()throwsZuulException{ RequestContextcontext=RequestContext.getCurrentContext(); HttpServletRequestrequest=context.getRequest(); Stringtoken=request.getParameter("token"); if(token==null){ logger.warn("Tokenisempty"); context.setSendZuulResponse(false); context.setResponseStatusCode(401); try{ context.getResponse().getWriter().write("Tokenisempty"); }catch(IOExceptione){ } }else{ logger.info("OK"); } returnnull; } }
测试过滤器
访问:http://localhost:8769/api/feign/hi?message=zuul
网页显示
Tokenisempty
访问:http://localhost:8769/api/feign/hi?message=zuul&token=1
网页显示
port:8763,message:zuul
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。