介绍

使用微服务时,通常具有对系统的统一访问点(也称为API Gateway )。 消费者仅与API网关交谈,而不与服务直接交谈。 这掩盖了您的系统由多个较小的服务组成的事实。 API网关还可帮助解决常见的挑战,例如身份验证,管理跨域资源共享( CORS )或请求限制。

Zuul是由Netflix开发和开源的基于JVM的API网关。 在本文中,我们将创建一个小的Spring应用程序,其中包括一个zuul代理,用于将请求路由到其他服务。

启用zuul代理

要在项目中使用zuul,我们必须添加spring-cloud-starter-netflix-zuul依赖项。 如果我们要使用spring zuul执行器端点(稍后会详细介绍),我们还需要添加spring-boot-starter-actuator依赖项。

< dependency > 
     < groupId >org.springframework.cloud</ groupId > 
     < artifactId >spring-cloud-starter-netflix-zuul</ artifactId >  </ dependency >  <!-- optional -->  < dependency > 
     < groupId >org.springframework.boot</ groupId > 
     < artifactId >spring-boot-starter-actuator</ artifactId >  </ dependency >

接下来,我们必须在我们的Spring Boot应用程序类(或任何其他spring @Configuration类)中使用@EnableZuulProxy启用zuul代理。

@SpringBootApplication  @EnableZuulProxy  public class ZuulDemoApplication { 
     ...  }

现在,我们可以开始配置路线了。

配置路线

路由描述了zuul应该如何路由传入的请求。 要配置zuul路由,我们只需要向Spring Boot application.yml (或application.properties )文件添加几行:

application.yml:

zuul: 
   routes: 
     users: 
       path: /users/** 
       url: https: //users.myapi.com 
     projects: 
       path: /projects/** 
       url: https: //projects.myapi.com

在这里,我们定义了两个端点的路由: / users/ projects/ users的请求将路由到https://users.myapi.com,/ projects的请求将路由到https://projects.myapi.com

假设我们在本地启动此示例应用程序,并将GET请求发送到http:// localhost:8080 / users / john 。 该请求与zuul路由/ users / **匹配,因此zuul会将请求转发至https://users.myapi.com/john

当使用服务注册中心(例如Eureka )时,我们可以替代地配置服务ID而不是URL:

zuul: 
   routes: 
     users: 
       path: /users/** 
       serviceId: user_service

另一个有用的选项是sensitiveHeaders ,它使我们可以在将请求路由到另一个服务之前删除标头。 这可以用来避免敏感头泄漏到外部服务器(例如,安全令牌或会话ID)。

zuul: 
   routes: 
     users: 
       path: /users/** 
       url: https: //users.myapi.com 
       sensitiveHeaders: Cookie,Set-Cookie,Authorization

请注意,显示的示例标头( Cookie,Set-Cookie,Authorization )是sensitiveHeaders属性的默认值。 因此,即使未指定sensitiveHeaders ,也不会传递这些标头。

使用过滤器修改请求/响应

我们可以使用过滤器自定义zuul路由。 为了创建一个zuul过滤器,我们创建一个新的spring bean(标记为@Component),它从ZuulFilter扩展:

@Component  public class MyFilter extends ZuulFilter { 
     @Override 
     public String filterType() { 
         return FilterConstants.PRE_TYPE; 
     } 
     @Override 
     public int filterOrder() { 
         return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1 ; 
     } 
     @Override 
     public boolean shouldFilter() { 
         return true ; 
     } 
     @Override 
     public Object run() { 
         RequestContext context = RequestContext.getCurrentContext(); 
         context.addZuulRequestHeader( "my-auth-token" , "s3cret" ); 
         return null ; 
     }  }

ZuulFilter需要定义四个方法:

  • 在filterType()中,我们定义过滤器应在(PRE_TYPE)实际路由之前运行。 如果我们想在将服务的响应发送回客户端之前对其进行修改,则可以在此处返回POST_TYPE。
  • 使用filterOrder()我们可以影响过滤器执行的顺序
  • shouldFilter()指示是否应执行此过滤器(=调用run()方法)
  • 在run()中,我们定义实际的过滤器逻辑。 在这里,我们将简单的标头my-auth-token添加到路由到另一个服务的请求。

过滤器使我们能够在将请求发送到指定服务之前对其进行修改,或者在将服务发送回客户端之前修改该服务的响应。

执行器端点

Spring cloud zuul暴露了一个额外的Spring Boot执行器端点。 要使用此功能,我们需要在类路径中有spring-boot-starter-actuator

默认情况下,执行器端点是禁用的。 在application.yml中,我们使用management.endpoints.web.exposure.include属性启用特定的执行器端点:

management: 
   endpoints: 
     web: 
       exposure: 
         include: '*'

在这里,我们仅启用所有执行器端点。 可以在Spring Boot执行器文档中找到更多详细的配置选项。

启用zuul执行器端点后,我们可以将GET请求发送到http:// localhost:8080 / actuator / routes以获取所有已配置路由的列表。

一个示例响应可能如下所示:

{ 
     "/users/**" : " https://users.myapi.com " , 
     "/projects/**" : "project_service"  }

摘要

使用Spring Cloud,您可以轻松地在您的应用程序中集成zuul代理。 这使您可以在.yml.properties文件中配置路由。 可以使用过滤器自定义路由行为。

可以在官方的Spring Cloud zuul文档中找到有关spring对zuul的支持的更多详细信息。 与往常一样,您可以在GitHub上找到本文中显示的示例。

翻译自: https://www.javacodegeeks.com/2020/01/creating-an-api-gateway-with-zuul-and-spring-boot.html