我注意到Spring-Cloud ZUUL强制执行隔离到SEMAPHORE而不是THREAD默认值(根据Netflix的推荐).
评论org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand说:
我们希望默认为信号量隔离,因为这包含了另外两个已经线程隔离的命令
但我仍然没有得到它:-(那两个其他命令是什么?
以这种方式配置,Zuul只能调整加载但不允许超时并让客户端离开.简而言之,即使Hystrix超时设置为1000毫秒,只有在转发到链中的服务的调用返回时(或者由于例如ReadTimeout而超时),才会释放客户端.
我试图通过覆盖配置强制THREAD隔离(不幸的是,每个服务,因为在代码中强制默认),一切似乎按预期工作.但是,如果没有正确理解其含义,我并不热衷于这样做 - 当然关于代码中的注释以及Spring的Zuul版本采用的默认值.
有人可以提供更多信息吗?谢谢
在post过滤器中使用Zuul作为代理时如何读取响应主体?
我试图像这样调用代码:
@Component
public class PostFilter extends ZuulFilter {
private static final Logger log = LoggerFactory.getLogger(PostFilter.class);
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
return 2000;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.getResponseBody(); // null
// cant't do this, cause input stream is used later in other filters and I got InputStream Closed exception
// GZIPInputStream gzipInputStream = new GZIPInputStream(stream);
return …Run Code Online (Sandbox Code Playgroud) 我有简单的服务:
transactions-core-service和transactions-api-service.
transactions-api-service调用transactions-core-service来返回事务列表.使用hystrix命令启用transactions-api-service.
两者都在以下服务ID的Eureka服务器中注册:
TRANSACTIONS-API-SERVICE n/a (1) (1) UP (1) - 192.168.2.12:transactions-api-service:8083
TRANSACTIONS-CORE-SERVICE n/a (1) (1) UP (1) - 192.168.2.12:transactions-core-service:8087
Run Code Online (Sandbox Code Playgroud)
以下是Zuul服务器:
@SpringBootApplication
@Controller
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
Zuul配置:
===============================================
info:
component: Zuul Server
server:
port: 8765
endpoints:
restart:
enabled: true
shutdown:
enabled: true
health:
sensitive: false
zuul:
ignoredServices: "*"
routes:
transactions-api-service:
path: transactions/accounts/**
serviceId: transactions-api-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
logging:
level:
ROOT: INFO
org.springframework.web: DEBUG
===============================================
Run Code Online (Sandbox Code Playgroud)
当我尝试使用url(http://localhost:8765/transactions/accounts/123/transactions/786 …
我正面临着春云Zuul代理的问题.我配置,启动和运行两个微服务.我在我的网络浏览器中有一个cookie,我使用Zuul作为API网关,当我点击Zuul来调用我的后端时,Zuul没有将我的cookie转发到我的后端,似乎Zuul忽略了发送的cookie而我的后端是无法检索这个.
你能帮我解决这个问题吗?我正在使用Spring云Brixton.RELEASE和spring boot 1.3.5
问候.
我想使用Zuul作为我正在使用的一些REST服务的代理.我的问题是:因为我将它作为Spring Boot应用程序运行,有没有办法为高可用性配置它?
编辑:我是否需要在支持HA的应用服务器中部署我的应用程序?
spring spring-boot spring-cloud netflix-zuul spring-cloud-netflix
背景:我正在创建一个支持SSO的多个应用程序的云平台.我正在使用Keycloak进行身份验证,使用Netflix Zuul通过Keycloak Spring Security Adapter 进行授权(API Gateway).
每个微服务都需要一个Authorization标头,其中包含一个有效的JWT,它将从中获取用户名(sub)来处理请求.每个微服务到微服务调用应首先通过Netflix Zuul,传递Authorization标头以维持无状态验证.该策略允许每个微服务器知道谁是间接调用微服务的用户(子).
问题/问题1:如果从队列消息中调用微服务会发生什么?我的一个想法是在队列中存储与消息+ userInfo相关的信息,并创建一个专用的微服务来处理这种消息,这种特殊的微服务应该从队列中读取userInfo并处理消息.
更新1:根据另一个论坛的电子邮件回复,将JWT存储在队列中并不是一个好主意,因为它可以轻松挖掘.
问题/问题2:但是,如果之前的特殊微服务想要调用另一个期望在头中接收JWT的普通微服务会发生什么?这个特殊的微服务是否应该由他自己创建一个JWT模仿用户并能够调用常规的微服务?
我认为另一种解决方案是将原始JWT存储在队列中,但是,如果队列稍后调用特殊微服务会发生什么?就在JWT不再有效(它已过期)之后,被调用的微服务将拒绝该请求?
可能的解决方案:(根据JoãoAngelo的讨论更新,见下文)
我应该验证来自我的用户(授权代码流)和我的服务(客户端凭证授权)的请求,这两个请求都应该包含有效负载中的用户信息.当请求来自用户时,我需要验证有效负载用户信息是否与JWT声明匹配.当请求来自服务时,我只需要信任该服务(只要它在我的控制之下).
我非常感谢你的帮助.谢谢.
当我试图meeting通过Zuul网关到达服务时,Zuul无法将请求转发给相应的服务.以下错误是我面临的问题:
- nettflix.zuul.exception.ZuulException:转发错误
- 引起:com.netflix.client.ClientException:负载均衡器没有可用于客户端的服务器:会议
让我分享服务,eureka和zuul网关的application.yml.
EurekaClient:
Application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 300
client:
register-with-eureka: false
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Run Code Online (Sandbox Code Playgroud)
ZuulGateWay:
application.yml
server:
port: 8085
spring:
application:
name: gatekeeper
zuul:
routes:
meeting: /meeting/**
serviceId: meeting
ribbon:
eureka:
enabled: false
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Run Code Online (Sandbox Code Playgroud)
ZuulGateWay: SpringBootApplication
package com.sagarp.gatekeeper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class MeetingApplication {
public static void main(String[] args) {
SpringApplication.run(MeetingApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务类(会议): Application.yml …
使用Spring Boot构建微服务时,很容易编写广泛且易读的集成测试并模拟远程服务请求MockRestServiceServer.
有没有办法使用类似的方法来执行额外的集成测试ZuulProxy?我想要实现的是能够模拟远程服务器,ZuulProxy这些服务器将转发并验证我ZuulFitler的所有操作符合预期.但是,ZuulProxy是否正在使用RestClientNetflix(它似乎被弃用?),它自然不会使用RestTemplate哪些可以重新配置MockRestServiceServer,我目前无法找到一种很好的方法来模拟远程服务对代理请求的响应.
我有一个微服务,负责处理API会话密钥创建,然后将采取类似于API网关的行为.使用Zuul Proxy对底层公开的服务进行转发,Zuul Filters将检测Session密钥是否有效.因此,集成测试将创建有效会话,然后转发到虚假端点,例如"集成/测试".
通过设置配置属性@WebIntegrationTest,可以指定"集成/测试"是新端点,我可以成功模拟通过RestTemplate但不是Zuul转发处理的所有服务.
实现模拟远期目标服务的最佳方法是什么?
java integration-testing spring-boot spring-cloud netflix-zuul
在过去的两天里,我一直试图找到一个奇怪的重定向问题,但没有成功.
基于spring-cloud示例项目,我已经配置了Eureka,Zuul以及在Zuul后面运行的基本服务.
我有以下方法;
@RequestMapping(method = RequestMethod.POST, value = "/register")
public String registerDevice(Principal principal, String response) {
// ...
return "redirect:/account";
}
Run Code Online (Sandbox Code Playgroud)
表单设置为发布到代理URL,如下所示;
POST https://localhost:8443/service/register
Run Code Online (Sandbox Code Playgroud)
(Zuul在localhost上运行:8443).
本地服务的URL(非代理)将是; HTTP://本地主机:9001 /寄存器
POST调用正确代理到上述方法,但是发送到浏览器的重定向位置是服务的非代理URL; HTTP://本地主机:9001 /帐户
Zuul代理肯定会发送正确的x-forwarded-*头文件,所以我希望Spring中的视图解析器能够根据x-forwarded值构建正确的重定向.
为了证明标头被正确发送,我重新配置了如下方法;
@RequestMapping(method = RequestMethod.POST, value = "/register")
public void registerDevice(Principal, String response, HttpServletResponse response) {
// ...
String rUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/account").build().toUriString();
servletResponse.sendRedirect(rUrl);
}
Run Code Online (Sandbox Code Playgroud)
这正确地将浏览器重定向到代理位置; https://开头本地主机:8443 /服务/帐户
这是一个错误,还是预期的行为?我认为使用"redirect:"是为了纪念从代理传递的前向头.
spring-mvc spring-boot spring-cloud netflix-eureka netflix-zuul
我们在微服务场景中使用 Zuul 作为 API 网关已经有一段时间了,最近我们决定迁移到 Kubernetes 并选择一种更加云原生的方式。
经过一番调查和阅读 Istio 文档,我们对 Kubernetes 中的 API 网关选择有一些疑问:
netflix-zuul ×10
spring-boot ×5
spring-cloud ×4
java ×3
api-gateway ×1
cookies ×1
istio ×1
jwt ×1
keycloak ×1
kubernetes ×1
proxy ×1
spring ×1
spring-mvc ×1