SpringCloud微服务(05):Zuul组件,实现路由网关控制

  

本文源码:GitHub·点这里| | GitEE·点这里

  

一、Zuul组件简介

  

1,基础概念

  
  

Zuul网关主要提供动态路,由监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过Zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。

     

2, Zuul的作用

  
  

1)按照不同策略,将请求转发到不同的服务上去;

  

2)聚合API接口,统一对外暴露,提高系统的安全性;

  

3)实现请求统一的过滤,以及服务的熔断降级;

     

3,案例结构

  

 SpringCloud微服务(05):Zuul组件,实现路由网关控制

  

启动顺序如下:

  
 <代码> #注册中心
  node05 -尤里卡- 7001
  #两个服务提供者
  node05 -供应商- 6001
  node05 -供应商- 6002
  #网关控制
  node05 - zuul - 7002  
  

启动成功后,注册中心展示如下:
 SpringCloud微服务(05):Zuul组件,实现路由网关控制

  

二,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组件,实现路由网关控制