Kubernetes 负载均衡器

该项目包含 Spring Cloud Load Balancer,用于基于 Kubernetes Endpoints 或 Kubernetes Service 的负载均衡。要将它添加到您的项目中,请添加以下依赖项。<br/>Fabric8 实现spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-fabric8-loadbalancer</artifactId>
</dependency>

Kubernetes Java 客户端实现spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency>

负载均衡器有两种工作模式:PODSERVICE,由属性指定(默认值为 PODspring-doc.cadn.net.cn

spring.cloud.kubernetes.loadbalancer.mode=SERVICE
spring.cloud.kubernetes.loadbalancer.mode=POD

POD 模式下,我们将使用 DiscoveryClient 来查找所有与您的负载均衡器名称匹配的服务。例如,如果您有如下配置:spring-doc.cadn.net.cn

@Bean
@LoadBalanced
WebClient.Builder client() {
	return WebClient.builder();
}

并使用该 WebClientservice-a 发出请求,我们将使用 service-a 以该值调用 DiscoveryClient::getInstances。由于此处使用的是 DiscoveryClient,所有与之相关的特定配置均适用,具体说明请参阅文档中相应部分。spring-doc.cadn.net.cn

另一方面,如果您使用 SERVICE 模式,情况会稍有不同,但与服务发现客户端设置非常相似。例如,为回答“在哪个命名空间(s)中查找名称为 service-a 的服务(s)”这一问题,我们将采用以下某种配置:spring-doc.cadn.net.cn

spring.cloud.kubernetes.discovery.all-namespaces
spring.cloud.kubernetes.discovery.namespaces

要么在所有命名空间中进行搜索,要么在所谓的“选择性命名空间”中进行搜索。如果以上均未指定,则会触发命名空间解析spring-doc.cadn.net.cn

一旦我们找到了所有服务,就需要知道通过哪个端口来调用它们。如果所涉及的服务已定义了单一端口,则无论其名称如何,我们都将使用该端口。如果没有定义任何端口,则该服务将不被纳入负载均衡考虑范围,并被跳过。spring-doc.cadn.net.cn

如果定义了多个端口,我们将尝试将其名称与属性的值进行匹配(默认为 http):spring-doc.cadn.net.cn

spring.cloud.kubernetes.loadbalancer.portName

如果找到匹配项,则将使用该端口号。否则,将使用列表中的“第一个”端口。最后一种选项是不确定的,必须谨慎处理。spring-doc.cadn.net.cn

一旦我们知道端口号,我们就知道如何调用该服务。URL 的格式如下:spring-doc.cadn.net.cn

service-a.<SERVICE_NAMESPACE>.svc.<DOMAIN>:<FOUND_PORT>

<SERVICE_NAMESPACE> 是服务所在的命名空间,DOMAIN 是该属性的值(默认情况下等于 cluster.local):spring-doc.cadn.net.cn

spring.cloud.kubernetes.loadbalancer.clusterDomain

<FOUND_PORT> 是我们在上述过程中所选择的服务端口。spring-doc.cadn.net.cn

如果服务需要通过 HTTPS 访问,则必须显式进行配置。相关规则与发现实现的规则完全相同,可在文档中关于 discovery-client 的相应部分找到。spring-doc.cadn.net.cn