我在不同的主机上运行了4个相同服务的实例.我正在按节点为该服务节点部署新版本.部署时,传入请求会根据负载均衡器转发到任何版本(主机).在netflix中有什么办法可以将所有传入的请求转发到特定版本吗?
有没有通用的方法我们可以定义版本(对于相同的serviceId).如果传入请求在标头中定义了版本,我们可以使用它将请求转发到特定版本.
可能是这样的:
在Zuul代理中,
zuul:
routes:
sample:
path: /sample/{version}/**
serviceId: sample-service
Run Code Online (Sandbox Code Playgroud)
在样品服务中,
eureka:
instance:
appname: sample-service
metadataMap:
version: v1
Run Code Online (Sandbox Code Playgroud)
或任何其他机制来实现相同服务的版本控制?
netflix microservices spring-cloud netflix-eureka netflix-zuul
我有一些与Eureka一起发现的微服务.他们中的大多数提供了一些API.我有"边缘"服务,称为"网关服务",实际上是Zuul代理.问题是有一个Web应用程序.它由网关服务主持了很长时间,并没有任何问题.但是现在我需要在网关后面的单独服务上托管这个客户端.这不是一个问题.我创建了新服务并将Web应用程序放在那里.但问题是网关服务上的Zuul有下一个配置
zuul:
ignoredServices: '*'
prefix: /api
sensitiveHeaders: Cookie, Set-Cookie
routes:
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false
Run Code Online (Sandbox Code Playgroud)
我需要这样做,以便用户能够从这样的根路径访问Web应用程序http://app.com/.但是现在我只能通过http://app.com/api/完全不正确的方式访问它.
我的任务是:
/api保留所有其他服务的前缀也非常重要.我试着实施ZuulFilter.但看起来它对根路径没有任何作用,只有当与上述任何路由匹配时才会运行.
我怎样才能做到这一点?
更新:我有一点成功ZuulFilter.我做到了.这是Zuul的配置:
zuul:
ignoredServices: '*'
sensitiveHeaders: Cookie, Set-Cookie
routes:
api: /api/**
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false
frontend-host-service:
path: /**
Run Code Online (Sandbox Code Playgroud)
而且ZuulFilter本身
@Bean
public ZuulFilter apiPrefixStrip(RouteLocator …Run Code Online (Sandbox Code Playgroud) 使用zuul,是否可以配置路由以使用URL中路径的部分?
这个使用普通正则表达式的元代码配置解释了我想要做的事情.
zuul:
routes:
foobar:
path: /foo/{.*}/bar/{.*}
url: http://foobar/\2/\1
Run Code Online (Sandbox Code Playgroud)
所以/ foo/123/bar/456将被路由到http:// foobar/456/123
(对不起,如果我没有任何意义,已经很晚了,我似乎无法找到答案)
我们正在使用带有 netflix zuul 网关的 spring boot 微服务,我们想访问那里的所有端点列表。我们在网关上设置了 swagger-ui,我们可以卷曲微服务的 /v2/api-docs,但我们不知道如何在 swagger-ui 中显示它。
我首先尝试使用这种方法。(我是从 pastebin 链接的,因为它很长,我不知道将它包含在帖子中是否被认为是不好的做法。)
它向我展示了网关的端点,而不是微服务。它还让我从我们的身份验证服务中获取令牌。
然后我尝试了这个,实际上我从我添加的微服务中得到了 401。
@Component
@Primary
@EnableAutoConfiguration
public class SwaggerAggregatorController implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources= new ArrayList<>();
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName("ms-name");
swaggerResource.setLocation("/ms-name/v2/api-docs");
swaggerResource.setSwaggerVersion("2.0");
resources.add(swaggerResource);
return resources;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用 Postman 中的http://gateway/ms/v2/api-docs使用 Bearer 令牌获取 json 。
我们使用 OAuth2。当然,当我加载 swagger-ui 时,我得到了预期的结果
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
Run Code Online (Sandbox Code Playgroud)
所以我应该向请求添加一个不记名令牌,但我需要从使用 OAuth2 的 auth-service 获取它。我应该如何授权 swagger 以便它可以从其他微服务中获取所有资源?
再次,如果我没有任何意义,我深表歉意。 …
我想为我的Zuul代理实现自定义过滤器.现在,我知道已经有很多谈论的主题在这里,我看了一眼提供,过滤器的实例和Spring云文档,这是我经过好几次去了答案.我试图将一些过滤器内容复制到我的使用,但它没有用.
我有一台Eureka服务器,注册了3个独立的服务,其中一个是另外两个服务的前门,从每个服务中收集信息并检索它.
我希望能够做的是重新路由Zuul在流程开始时收到的请求,通过特定服务重定向它们,使用URL参数来确定应该针对哪个流程而不是另一个流程.我已经创建了一个用@Component注释标记的过滤器,实现了ZuulFilter.我不知道的是,如何使重定向工作,以及使用哪些方法.
因此,问题是:如何使用URL参数将传入请求重定向到不同的注册服务?
我有一个使用oAuth2保护的微服务,称为国家服务。当我直接向此服务(包括JWT承载令牌)发送请求时,一切正常:
server:
port: 8081
spring:
database:
driverClassName: org.postgresql.Driver
datasource:
url: jdbc:postgresql://localhost:5432/vue-boot-country
username: postgres
password: postgres
jpa:
hibernate:
ddl-auto: validate
database-platform: org.hibernate.dialect.PostgreSQLDialect
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Run Code Online (Sandbox Code Playgroud)
我也有一个api网关(Zuul代理):
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class VueBootApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(VueBootApiGatewayApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
除了这两个没有其他文件
server:
port: 8765
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
vue-boot-country-service: /api/country/**
add-proxy-headers: true
Run Code Online (Sandbox Code Playgroud)
我无法将成功的请求发送到代理,我不断收到“未经授权”错误:
注意:当我从资源服务器中删除oAuth2安全性时,Zuul代理似乎可以正常工作。
有人知道我在这里做错了吗?
我使用Spring boot zuul和eureka服务配置了我的微服务.现在我需要验证所有路由/ REST API调用.我的意思是,对于所有API客户端发送一个accessToken.在zuul服务上,在路由到特定服务之前,我必须使用accessToken调用微服务(auth-service),并且auth-service将检查用户是否存在以便发送accessToken.如果accessToken有效,则只应进行路由.
请帮我用Spring Boot服务实现这个.
谢谢.
spring-mvc spring-boot microservices netflix-eureka netflix-zuul
我正在构建一个 Spring Boot 微服务应用程序,但是当我在 intellij idea 中打开时出现此错误。
Unnecessarily replacing a task that does not exist is not supported. Use create() or register() directly instead. You attempted to replace a task named 'ZuulServerApplication.main()', but there is no existing task with that name.
Run Code Online (Sandbox Code Playgroud)
我从Spring Boot Initialzr下载了其他项目,它们没有显示任何错误,但最近我遇到了这个问题。如何解决?
我有一个带有 4 个微服务、eureka 服务器和一个集中式 API 网关的 spring-boot 应用程序。
所有外部流量都通过我的 API 网关到达我的微服务。
我的 API 网关 (Zuul) 正在验证和验证 JWT 令牌。
JWT 令牌由我的微服务之一在用户登录后生成(用户微服务),该令牌包含用户 ID 及其角色/权限。
现在,我想对网关以外的微服务中存在的方法实施基于角色的安全性。
我尝试使用,@PreAuthorize但它在网关之外不起作用(显然,为了使其工作,我必须SecurityContextHolder在我的微服务中设置一个 Spring Security 身份验证对象并用权限填充它)。
那么是否有任何解决方案可以实现这种安全性?
在微服务架构中设置安全性的最佳设计是什么?
API 网关级别的身份验证和微服务级别的授权?
在 API 网关级别验证 JWT 后,我是否需要在微服务中使用 spring security 或仅传递角色(将它们附加到请求中),例如创建我自己的注释并使用 Spring AOP 处理授权?
spring-security spring-boot microservices spring-cloud netflix-zuul
有一个简单的代理:
@EnableZuulProxy
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public SimpleFilter simpleFilter(){
return new SimpleFilter();
}
}
Run Code Online (Sandbox Code Playgroud)
前置过滤器:
public class SimpleFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s request to %s", request.getMethod(), …Run Code Online (Sandbox Code Playgroud) netflix-zuul ×10
spring-boot ×7
spring-cloud ×5
java ×3
spring ×3
netflix ×2
gradle ×1
oauth-2.0 ×1
proxy ×1
spring-mvc ×1
swagger ×1