标签: netflix-zuul

Spring Cloud Gateway与Zuul有何不同?

我一直在使用Zuul作为边缘服务和API网关.最近我注意到Spring Cloud Platform发布了Spring Cloud Gateway.这两个网关有什么区别?为什么Zuul没有扩展到支持SC-Gateway的功能?一个新图书馆的驱动因素是什么?什么时候应该使用?

spring-mvc spring-cloud netflix-zuul spring-cloud-netflix

52
推荐指数
1
解决办法
2万
查看次数

Zuul在长期请求中超时

我正在使用作为zuul代理(@EnableZuulProxy)的前端spring spring应用程序(微服务)将来自外部源的请求路由到使用spring cloud(spring boot)编写的其他内部微服务.
zuul服务器直接位于samples部分的应用程序中

@SpringBootApplication
@Controller
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulServerApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在本地运行这组服务,它似乎工作正常但如果我在网络上运行它有一些负载或通过VPN然后我开始看到zuul转发错误,我在日志中看到客户端超时

有没有办法改变zuul前锋的超时,所以我可以从我的直接关注中消除这个问题.有什么可访问的参数设置.

我正处于发布阶段,这只是出现了:)

spring-cloud netflix-zuul

43
推荐指数
6
解决办法
3万
查看次数

Zuul - Api网关认证

我想在一些服务面前通过Spring Cloud作为API网关介绍Zuul.

我对身份验证有一些设计疑虑.身份验证将由Spring Security处理,它位于servlet过滤器链中的Zuul之前.

我的顾虑:

  • Gateway将坐在许多服务面前

  • 某些服务可能会暴露不需要身份验证的端点

  • 某些服务可能会暴露需要会话ID的端点和一些带有令牌的端点",一个任意的不透明值(例如,如果您知道"难以猜测"的URL,则下载文件)在API网关/ Spring Security中,您可以配置所有具有特定身份验证要求的端点.

在管理API网关方面:

  • 您如何强制实际的服务团队为每个下游服务提供所需的设置?
  • 如何允许网关中的频繁验证设置更改(根据服务需求)而不必停止整个网关?

谢谢,阿德里安

spring-cloud netflix-zuul

35
推荐指数
2
解决办法
3万
查看次数

Spring Cloud Zuul Proxy背后的Spring OAuth授权服务器

我目前正在开发基于微服务架构的应用程序.我们使用使用Spring Cloud Netfix的Zuul Server实现的API网关将请求路由到我们的微服务.

要实现我们所有服务的单点登录,我目前正在使用Spring Cloud Security设置OAuth2服务器.服务器基本上只是在Dave Syer的Repo中实现的复制和过去:https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

主要区别在于我想通过Zuul代理将请求路由到我的OAuth服务器.这样我就不必直接暴露我的OAuth服务器,并可以动态添加和删除Login Server.

问题是我不了解如何正确配置此设置.当我尝试访问OAuth服务器上的受保护资源时,我将转发到登录页面.这当然是预期的.但我无法弄清楚如何设置转发时使用的主机名和端口.我想要发生的是服务器转发到Zuul服务器上的端点,该端点将被代理回到OAuth服务器.(Zuul API-Gateway应该是客户端与之交谈的唯一服务器.其他所有内容都将被隐藏.)

因为它是主机和端口从读HttpServletRequestLoginUrlAuthenticationEntryPoint.但是服务器看到的请求是Zuul代理发送的请求.所以我被转发到内部IP而不是代理端点.

我尝试将登录页面WebSecurityConfigurerAdapter.configure(HttpSecurity)的URL设置为我的Zuul代理的绝对URL.但这只是导致我的应用程序抱怨太多的重定向.(可能会在那里引起循环.)

设置它的最佳方法是什么?

  • 我是否必须通过覆盖bean来实现某种自己的转发策略?
  • 是否有我缺少的配置选项?
  • 我的想法本身是错的吗?(在他如何避免与Zuul重定向到另一个主机的回答中 Dave Syer说你通常不代理这个,但不解释原因.)

java spring-security spring-cloud netflix-zuul

28
推荐指数
1
解决办法
2万
查看次数

使用Zuul作为身份验证网关

背景

我想实现本文中介绍的设计.

它可以通过下图总结: 安全架构

  1. 客户端首先使用IDP进行身份验证(OpenID Connect/OAuth2)
  2. IDP返回访问令牌(不带用户信息的不透明令牌)
  3. 客户端通过API网关进行调用,使用Authorization标头中的访问令牌
  4. API网关使用访问令牌向IDP发出请求
  5. IDP验证访问令牌是否有效并以JSON格式返回用户信息
  6. API网关将用户信息存储在JWT中,并使用私钥对其进行签名.然后将JWT传递给下游服务,该服务使用公钥验证JWT
  7. 如果服务必须调用另一个服务来完成请求,它将通过JWT,该JWT用作请求的身份验证和授权

到目前为止我有什么

我完成了大部分工作:

  • Spring云作为全球框架
  • Spring启动以启动个人服务
  • Netflix Zuul作为API网关

我还编写了一个Zuul PRE过滤器,用于检查访问令牌,联系IDP并创建JWT.然后将JWT添加到转发到下游服务的请求的标头中.

问题

现在我的问题非常具体针对Zuul及其过滤器.如果由于任何原因在API网关中验证失败,我怎样才能停止路由并直接用401响应而不继续过滤链并转发呼叫?

如果验证失败,过滤器将不会将JWT添加到标头,401将来自下游服务.我希望我的网关可以阻止这种不必要的通话.

我试着看看我怎么com.netflix.zuul.context.RequestContext用来做这个,但文档很差,我找不到办法.

gateway spring-boot microservices spring-cloud netflix-zuul

25
推荐指数
2
解决办法
2万
查看次数

Spring Cloud + Zuul + JWT for Value/Reference Tokens

在阅读了文章如何控制微服务中的用户身份后, 我一直在尝试实现这样的访问控制方案(值和参考令牌),但在经历了与Spring Security + OAuth + Zuul相关的GitHub中的多个其他主题和示例后,我找不到如何实现这一目标的具体例子.所有涉及JWT的示例都会在返回令牌时返回用户详细信息,这就是我想要避免的内容.用户详细信息永远不应该直接到达客户端,而应该传递给后端服务.Spring Security + AngularJs教程有很多关于如何将应用程序发展为安全应用程序的信息,但是使用Access Token或者提到了通过JWT直接获取用户详细信息的可能性.

这太问题,使用Zuul作为认证网关通过@ phoenix7360,正是我一直在试图实施办法,但它只提供开展这类的微服务安全方法所需要的配置的简要概述.请参考这个问题中的图像,以便清楚地了解它将如何发展.

我无法完全理解如何配置Zuul预过滤器以及Authorization Server的配置应该是什么样子.如文章和SO问题所述,流程将如下所示:

外部(HTTPS)

  1. 客户端对OAuth2服务器进行身份验证
  2. OAuth服务器返回不透明的访问令牌(没有其他信息的UUID)
  3. 客户端使用授权标头中的访问令牌向API网关发送请求
  4. API网关使用授权标头中的访问令牌向OAuth服务器请求用户详细信息
  5. OAuth服务器检查访问令牌是否有效,并以JSON格式返回用户信息

内部(HTTP/S)

  1. API网关使用用户详细信息创建JWT并使用私钥对其进行签名
  2. API网关添加JWT以请求并将其发送到资源服务器
  3. 资源服务器使用API​​网关的公钥验证JWT

注意:如果OAuth服务器指示访问令牌不再有效,则API网关应返回错误.

ZuulFilter将如何运作?是否需要针对OAuth服务器发出新请求(例如,通过RestTemplate),或者当前实现是否支持这些方案.OAuth和Zuul的JavaConfig条款是否需要任何特定配置?如果有人知道一个真正有用的工作示例,并且对于此主题的未来参考将是很好的.

我正在使用Spring Boot(1.4.0-M3)+ Spring OAuth + Spring Cloud(Eureka,Ribbon,Zuul)

我知道这个问题与以前链接的问题非常相似,如果这不是正确的做法,我道歉,但我认为新的线程比在SO线程上寻求帮助更好,旨在解决其他问题问题.

提前致谢!

oauth spring-security jwt spring-boot netflix-zuul

22
推荐指数
1
解决办法
7837
查看次数

如何使用Spring Cloud和Netflix OSS在微服务之间进行路由

在我们使用Spring Cloud开发微服务的过程中,我们开始使用Zuul作为从外部到微服务的任何连接的代理,以及任何需要联系其他微服务的微服务.

一段时间后,我们得出结论,Zuul被设计为边缘服务(仅从外部到微服务的代理流量),不应该用于跨微服务通信.特别是Spring Cloud建议使用eureka与另一个服务建立直接(可能是负载平衡)连接的方式使我们反对在所有事件之间使用Zuul.

当然,一切都按预期工作得很好(就像Spring云一样),但我们对如何使用此设置执行某个用例毫无头绪.

在部署新版本的微服务时,我们希望对旧版本和新版本进行蓝/绿部署.但是,在微服务之间没有Zuul,两个单独服务之间的通信将继续使用旧版本,直到从eureka中删除.

我们正在考虑如何实现这一目标.在下面的图片中,我画了我认为可能是一个选项.

在图片的第一部分,Zuul打电话给eureka来获取注册表来创建路线.服务1还调用eureka以使注册表路由到服务2.由于服务2在eureka注册表中,因此路由成功完成.

在图的第二部分中,部署了服务2(服务2.1)的更新.它也注册了eureka,这使得服务1现在可以路由到服务2和服务2.1.蓝/绿部署不需要这样做.

在第三部分中,展示了针对此问题的另一个eureka实例的潜在解决方案.此实例不支持对等,不会与第一个eureka实例同步.与第一个实例相反,这个唯一的目的是促进蓝色/绿色部署.服务2.1向第二个eureka实例注册,服务1将其配置更改为从第一个尤其是第二个eureka实例获取其注册表.

在此输入图像描述

我们面临的主要问题是这是否是一个可行的解决方案.具有Zuul路由的灵活性是我们在这种情况下没有的一大优点.我们应该回过头来通过Zuul路由每个服务到服务的呼叫,还是有另一个解决方案(可能是某种类型的功能区配置)更合适?或者第二个eureka实例是此类部署的最佳解决方案?

任何反馈将不胜感激.

亲切的问候,安德烈亚斯

blue-green-deployment microservices spring-cloud netflix-eureka netflix-zuul

19
推荐指数
1
解决办法
3215
查看次数

自定义Zuul异常

我在Zuul有一个场景,URL路由的服务也可能已关闭.因此,响应主体在JSON主体响应中被抛出500 HTTP Status和ZuulException.

{
  "timestamp": 1459973637928,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.netflix.zuul.exception.ZuulException",
  "message": "Forwarding error"
}
Run Code Online (Sandbox Code Playgroud)

我想要做的就是自定义或删除JSON响应,并可能更改HTTP状态代码.

我试图用@ControllerAdvice创建一个异常处理程序,但处理程序没有抓住异常.

更新:

所以我扩展了Zuul过滤器,我可以看到它在执行错误后进入run方法,然后如何更改响应.以下是我到目前为止所得到的.我在某处读到了有关SendErrorFilter的内容,但我如何实现它以及它做了什么?

public class CustomFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "post";
    }

    @Override
    public int filterOrder() {

        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        final RequestContext ctx = RequestContext.getCurrentContext();
        final HttpServletResponse response = ctx.getResponse();
        if (HttpStatus.INTERNAL_SERVER_ERROR.value() == ctx.getResponse().getStatus()) {
            try {
                response.sendError(404, "Error Error"); //trying to change …
Run Code Online (Sandbox Code Playgroud)

java spring-boot microservices spring-cloud netflix-zuul

19
推荐指数
3
解决办法
2万
查看次数

尽管有随机的Docker容器外部端口,但使用Eureka

我正在编写一个应用程序,它由一些基于弹簧启动的微服务组成,前面有一个基于zuul的反向代理 -

当我在我的机器上启动服务时,它可以工作,但是对于服务器的推出,我想使用docker作为服务,但现在似乎不可能.

通常,您将在容器外部具有固定的"内部"端口和随机端口.但容器中的应用程序不知道外部端口(和IP).

Netflix工具符合我想要编写的高效微服务架构,概念上我非常喜欢docker.据我所知,启动容器会非常麻烦,在主机上收集外部端口并将其传递给应用程序,因为在应用程序启动后您无法简单地更改端口.

有没有办法使用eureka与基于docker的客户端?

[更新]我想我解释这个问题做得不好.所以也许这可以澄清一点:

eureka服务器本身可以在docker中运行,因为我只有一个,外部端口无关紧要.我可以使用链接功能从客户端访问它.

问题是客户端注册自己的URL.这是例如https:// localhost:8080 /但由于动态端口分配,它实际上只能通过https:// localhost:54321 /访问

因此,eureka将返回错误的服务URL.

更新 我已在下面更新了我的答案,所以看看那里.

docker spring-boot netflix-eureka netflix-zuul

17
推荐指数
1
解决办法
3867
查看次数

NetflixOSS Zuul过滤器用于拒绝请求

我试图在一个简单的spring-cloud-Netflix Api网关(反向代理)中使用ZuulFilter,以便对自定义身份验证提供程序(通过Rest调用)验证请求.

过滤器应拒绝使用401的未授权请求,并且不要将这些请求进一步传递给代理服务.

这对ZuulFilter来说甚至可能吗?我没有在Zuuls api中找到文档,示例或其他内容.

有什么建议?

netflix spring-cloud netflix-zuul

16
推荐指数
2
解决办法
9843
查看次数