我一直在使用Zuul作为边缘服务和API网关.最近我注意到Spring Cloud Platform发布了Spring Cloud Gateway.这两个网关有什么区别?为什么Zuul没有扩展到支持SC-Gateway的功能?一个新图书馆的驱动因素是什么?什么时候应该使用?
我正在使用作为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作为API网关介绍Zuul.
我对身份验证有一些设计疑虑.身份验证将由Spring Security处理,它位于servlet过滤器链中的Zuul之前.
我的顾虑:
Gateway将坐在许多服务面前
某些服务可能会暴露不需要身份验证的端点
某些服务可能会暴露需要会话ID的端点和一些带有令牌的端点",一个任意的不透明值(例如,如果您知道"难以猜测"的URL,则下载文件)在API网关/ Spring Security中,您可以配置所有具有特定身份验证要求的端点.
在管理API网关方面:
谢谢,阿德里安
我目前正在开发基于微服务架构的应用程序.我们使用使用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应该是客户端与之交谈的唯一服务器.其他所有内容都将被隐藏.)
因为它是主机和端口从读HttpServletRequest在LoginUrlAuthenticationEntryPoint.但是服务器看到的请求是Zuul代理发送的请求.所以我被转发到内部IP而不是代理端点.
我尝试将登录页面WebSecurityConfigurerAdapter.configure(HttpSecurity)的URL设置为我的Zuul代理的绝对URL.但这只是导致我的应用程序抱怨太多的重定向.(可能会在那里引起循环.)
设置它的最佳方法是什么?
背景
我想实现本文中介绍的设计.
到目前为止我有什么
我完成了大部分工作:
我还编写了一个Zuul PRE过滤器,用于检查访问令牌,联系IDP并创建JWT.然后将JWT添加到转发到下游服务的请求的标头中.
问题
现在我的问题非常具体针对Zuul及其过滤器.如果由于任何原因在API网关中验证失败,我怎样才能停止路由并直接用401响应而不继续过滤链并转发呼叫?
如果验证失败,过滤器将不会将JWT添加到标头,401将来自下游服务.我希望我的网关可以阻止这种不必要的通话.
我试着看看我怎么com.netflix.zuul.context.RequestContext用来做这个,但文档很差,我找不到办法.
在阅读了文章如何控制微服务中的用户身份后, 我一直在尝试实现这样的访问控制方案(值和参考令牌),但在经历了与Spring Security + OAuth + Zuul相关的GitHub中的多个其他主题和示例后,我找不到如何实现这一目标的具体例子.所有涉及JWT的示例都会在返回令牌时返回用户详细信息,这就是我想要避免的内容.用户详细信息永远不应该直接到达客户端,而应该传递给后端服务.Spring Security + AngularJs教程有很多关于如何将应用程序发展为安全应用程序的信息,但是使用Access Token或者提到了通过JWT直接获取用户详细信息的可能性.
这太问题,使用Zuul作为认证网关通过@ phoenix7360,正是我一直在试图实施办法,但它只提供开展这类的微服务安全方法所需要的配置的简要概述.请参考这个问题中的图像,以便清楚地了解它将如何发展.
我无法完全理解如何配置Zuul预过滤器以及Authorization Server的配置应该是什么样子.如文章和SO问题所述,流程将如下所示:
外部(HTTPS)
内部(HTTP/S)
注意:如果OAuth服务器指示访问令牌不再有效,则API网关应返回错误.
ZuulFilter将如何运作?是否需要针对OAuth服务器发出新请求(例如,通过RestTemplate),或者当前实现是否支持这些方案.OAuth和Zuul的JavaConfig条款是否需要任何特定配置?如果有人知道一个真正有用的工作示例,并且对于此主题的未来参考将是很好的.
我正在使用Spring Boot(1.4.0-M3)+ Spring OAuth + Spring Cloud(Eureka,Ribbon,Zuul)
我知道这个问题与以前链接的问题非常相似,如果这不是正确的做法,我道歉,但我认为新的线程比在SO线程上寻求帮助更好,旨在解决其他问题问题.
提前致谢!
在我们使用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
我在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) 我正在编写一个应用程序,它由一些基于弹簧启动的微服务组成,前面有一个基于zuul的反向代理 -
当我在我的机器上启动服务时,它可以工作,但是对于服务器的推出,我想使用docker作为服务,但现在似乎不可能.
通常,您将在容器外部具有固定的"内部"端口和随机端口.但容器中的应用程序不知道外部端口(和IP).
Netflix工具符合我想要编写的高效微服务架构,概念上我非常喜欢docker.据我所知,启动容器会非常麻烦,在主机上收集外部端口并将其传递给应用程序,因为在应用程序启动后您无法简单地更改端口.
有没有办法使用eureka与基于docker的客户端?
[更新]我想我解释这个问题做得不好.所以也许这可以澄清一点:
eureka服务器本身可以在docker中运行,因为我只有一个,外部端口无关紧要.我可以使用链接功能从客户端访问它.
问题是客户端注册自己的URL.这是例如https:// localhost:8080 /但由于动态端口分配,它实际上只能通过https:// localhost:54321 /访问
因此,eureka将返回错误的服务URL.
更新 我已在下面更新了我的答案,所以看看那里.
我试图在一个简单的spring-cloud-Netflix Api网关(反向代理)中使用ZuulFilter,以便对自定义身份验证提供程序(通过Rest调用)验证请求.
过滤器应拒绝使用401的未授权请求,并且不要将这些请求进一步传递给代理服务.
这对ZuulFilter来说甚至可能吗?我没有在Zuuls api中找到文档,示例或其他内容.
有什么建议?
netflix-zuul ×10
spring-cloud ×8
spring-boot ×4
java ×2
docker ×1
gateway ×1
jwt ×1
netflix ×1
oauth ×1
spring-mvc ×1