我在 Spring Boot 2.3.4 中有以下工作代码
public Route.AsyncBuilder apply(PredicateSpec route) {
return route
.path("/api/external/**")
.filters(f -> f
.removeRequestHeader("Cookie")
.filter(loggingGatewayFilter)
.filter(oauth2GatewayFilter)
.filter(this::filter)
)
.uri("lb://external-url");
}
Run Code Online (Sandbox Code Playgroud)
配置:
external-url:
ribbon:
listOfServers: "http://external01.com,http://external02.com"
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
Run Code Online (Sandbox Code Playgroud)
当我将 Spring Boot 版本升级到 2.4.2 时,代码必须更改为以下内容。
public Buildable<Route> apply(PredicateSpec route) {
return route
.path("/api/external/**")
.filters(f -> f
.removeRequestHeader("Cookie")
.filter(loggingGatewayFilter)
.filter(oauth2GatewayFilter)
.filter(this::filter)
)
.uri("lb://external-url");
}
Run Code Online (Sandbox Code Playgroud)
由于 netflix-ribbon 已在 Spring Boot 2.4.2 中删除,我必须添加这些依赖项。在路由中它给出以下警告。这意味着负载均衡器未初始化。
o.s.c.l.core.RoundRobinLoadBalancer : No servers available for service: external-url
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?我可以尝试将其迁移到弹簧负载平衡器中吗?
升级后的依赖树:
[INFO] +- org.apache.commons:commons-lang3:jar:3.9:compile
[INFO] +- com.internetitem:logback-elasticsearch-appender:jar:1.6:compile …Run Code Online (Sandbox Code Playgroud) spring-boot spring-cloud spring-cloud-netflix spring-cloud-gateway spring-cloud-loadbalancer
我想将 Eureka 客户端与spring-cloud-starter-loadbalancer. 但是当我添加配置时出现错误。当我删除@LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)和LoadBalancerConfiguration类配置时,它工作正常。我尝试了这段代码:
@FeignClient(name = "mail-service")
@LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
public interface EmailClient {
@RequestMapping(method = RequestMethod.POST, value = "/engine/emails/register")
void setUserRegistration(CreateUserDTO createUserDTO);
}
@Configuration
public class LoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withBlockingDiscoveryClient()
.withSameInstancePreference()
.withHealthChecks()
.build(context);
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序.yml:
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
eureka:
client:
serviceUrl:
defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
fetchRegistry: true
healthcheck:
enabled: true
instance:
preferIpAddress: …Run Code Online (Sandbox Code Playgroud) spring spring-cloud netflix-eureka spring-cloud-loadbalancer
我们在 Spring 云中有负载均衡、发现等功能。但 Kubernetes 中也提供了相同的负载平衡和发现功能。所以只是想知道什么时候应该使用 Spring Cloud(负载均衡或发现)以及什么时候使用 Kubernetes
spring-boot kubernetes spring-cloud spring-cloud-loadbalancer
我有以下带有功能区的 Spring Cloud Gateway 配置
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: UserModule
uri: lb://load-balanced-service-user
predicates:
- Path=/api/user/**
ribbon:
eureka:
enabled: false
Load-balanced-service-user:
ribbon:
listOfServers: localhost:9999,localhost:8888
Run Code Online (Sandbox Code Playgroud)
现在我想删除 Ribbon 并替换为 Spring Cloud 负载均衡器。
我添加了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在我需要在 application.yaml 文件中添加哪些其他配置才能切换到 Spring Cloud 负载均衡器?我想在 .yaml 文件上添加配置。我不想用 .yaml 文件中配置的功能区破坏旧结构。
spring-boot spring-cloud-netflix spring-cloud-gateway spring-cloud-loadbalancer