介绍
使用微服务时,通常具有对系统的统一访问点(也称为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