本文源码:GitHub·点这里| | GitEE·点这里
一、Zuul组件简介
1,基础概念
Zuul网关主要提供动态路,由监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过Zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。
引用>2, Zuul的作用
1)按照不同策略,将请求转发到不同的服务上去;
2)聚合API接口,统一对外暴露,提高系统的安全性;
3)实现请求统一的过滤,以及服务的熔断降级;
引用>3,案例结构
启动顺序如下:
<代码> #注册中心 node05 -尤里卡- 7001 #两个服务提供者 node05 -供应商- 6001 node05 -供应商- 6002 #网关控制 node05 - zuul - 7002 代码>启动成功后,注册中心展示如下:
二,Zuul使用详解
1,核心依赖
<代码> & lt; !——路由网关——比; & lt; dependency> & lt; groupId> org.springframework.cloud & lt; artifactId> spring-cloud-starter-zuul & lt;/dependency> 代码>2,核心配置文件
<代码>服务器: 端口:7002 春天: 应用程序: 名称:cloud-node05-parent 尤里卡: 实例: prefer-ip-address:真 客户: 服务url: defaultZone: http://registry01.com: 7001/尤里卡/zuul: #前缀,可以用来做版本控制 前缀:/v1 #禁用默认路,由执行配置的路由 ignored-services:“*” 路线: 6001 #配置接口微服务 pro6001: serviceId: node05 -供应商- 6001 路径:/api - 6001/* * 6002 #配置接口微服务 pro6002: serviceId: node05 -供应商- 6002 路径:/api - 6002/* * 代码><李>启动类注解:@EnableZuulProxy李>
3,统一服务降级
实现FallbackProvider接口,自定义响应提示。
<代码> @ component 公共类FallBackConfig实现FallbackProvider { 私有静态最终日志记录器=LoggerFactory.getLogger (FallBackConfig.class); @Override 引起公众ClientHttpResponse fallbackResponse (Throwable) {//捕获超时异常,返回自定义信息 如果(导致instanceof HystrixTimeoutException) { 返回响应(HttpStatus.GATEWAY_TIMEOUT); 其他}{ 返回fallbackResponse (); } } 私人ClientHttpResponse响应(最终HttpStatus状态){ 返回新ClientHttpResponse () { @Override 公共HttpStatus getStatusCode () { 返回状态; } @Override 公共int getRawStatusCode () { 返回status.value (); } @Override 公共字符串getStatusText () { 返回status.getReasonPhrase (); } @Override 公共空间close () { LOGGER.info(“关闭”); } @Override 公共InputStream getBody () { 字符串消息=皗\ n”+ “\”代码\”:200年,\ n”+ “\”消息\”:\“微服务飞出了地球\“\ n”+ “}”; 返回新ByteArrayInputStream (message.getBytes ()); } @Override 公共HttpHeaders getHeaders () { HttpHeaders header=new HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); 返回头; } }; } @Override 公共字符串getRoute () { 返回“*”; } @Override 公共ClientHttpResponse fallbackResponse () { 返回响应(HttpStatus.INTERNAL_SERVER_ERROR); } }代码>4,统一过滤器
继承ZuulFilter类,自定义过滤动作。
<代码> @ component 公开课FilterConfig延伸ZuulFilter { 私有静态最终日志记录器=LoggerFactory.getLogger (FilterConfig.class); @Override 公共字符串filterType () { 回归“前”; } @Override 公共int filterOrder () { 返回0; } @Override 公共布尔shouldFilter () { 返回true; } @Override 公共对象的run () { RequestContext RequestContext=RequestContext.getCurrentContext (); 尝试{ doBizProcess (requestContext); }捕捉(异常e) { LOGGER.info(“异常:{}”,e.getMessage ()); } 返回null; } 公共空间doBizProcess (RequestContext RequestContext对象){抛出异常 HttpServletRequest请求=requestContext.getRequest (); 字符串reqUri=request.getRequestURI (); 如果(! reqUri.contains (“getAuthorInfo”)) { requestContext.setSendZuulResponse(假); requestContext.setResponseStatusCode (401); .getWriter requestContext.getResponse () ()。打印(“路径错误…”); } } }SpringCloud微服务(05):Zuul组件,实现路由网关控制