介绍
springcloud版本:2021.0.2
官网介绍:https://docs.spring.io/spring-cloud-kubernetes/docs/2.1.1/reference/html/#loadbalancer-for-kubernetes
添加依赖
implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-loadbalancer")
以下是完整依赖:
dependencies {
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-all")
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-loadbalancer")
implementation("io.github.openfeign:feign-httpclient")
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
说明:
spring-boot-starter-actuator:健康监控
spring-cloud-starter-openfeign:服务间通信
feign-httpclient:SpringCloudFeign底层是通过http/https协议进行通信,默认是采用java.net.HttpURLConnection,每次请求都会建立、关闭连接,为了性能考虑,可以引入httpclient、okhttp作为底层的通信框架。
yaml配置
http2:如不开启http2 不加这个配置就行了
server:
http2:
enabled: true
https的ssl配置:
server:
ssl:
enabled: true
key-store-password: 123456
key-store-type: PKCS12
key-store: classpath:pfx/server.pfx
负载均衡模式配置:
spring:
cloud:
kubernetes:
loadbalancer:
mode: service
以下是完整配置:
server:
port: 8080
http2:
enabled: true
ssl:
enabled: true
key-store-password: 123456
key-store-type: PKCS12
key-store: classpath:pfx/server.pfx
spring:
application:
name: test-k8s
cloud:
kubernetes:
loadbalancer:
mode: service
# 健康检测
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
k8s服务配置
添加 metadata.labels.secured= 'true '或者 metadata.annotations.secured= 'true ’ 如下:
apiVersion: v1
kind: Service
metadata:
name: test-k8s
namespace: dev
labels:
app: test-k8s
secured: 'true'
annotations:
secured: 'true'
spec:
type: NodePort
selector:
app: test-k8s
ports:
- name: rest
port: 8080
targetPort: 8080
nodePort: 30001
源码位置:KubernetesClientServiceInstanceMapper.map 返回服务实例
spring.cloud.kubernetes.loadbalancer.mode=service 一定要配置,不然无法使用kubernetes提供的负载均衡。
启用基于 Kubernetes 服务名称的负载平衡,然后负载均衡器会尝试使用地址调用应用程序,例如 test.dev.svc.cluster.local
注意:这个配置是告诉访问该服务的实例,本服务使用的是https通信
测试
部署两个服务,请求测试,服务通信正常,并打印如下实例信息:
c.l.KubernetesClientServicesListSupplier : Getting services with id test-k8s
c.l.KubernetesClientServicesListSupplier : Returning services: [KubernetesServiceInstance{instanceId='94c2101f-e966-47e8-8e1c-67f8625431fe', serviceId='test-k8s', host='test-k8s.dev.svc.cluster.local', port=8080, uri=https://test-k8s.dev.svc.cluster.local:8080, secure=true, namespace=null, cluster=null, metadata={app=test-k8s, secured=true}}]
关闭ssl证书验证:feign.httpclient.disable-ssl-validation=true
总结
三个依赖:spring-cloud-starter-kubernetes-client-loadbalancer ,spring-cloud-starter-openfeign,
feign-httpclient
三个配置:spring.cloud.kubernetes.loadbalancer.mode=service,http2.enabled=true,ssl配置
注意:一定要使用spring-cloud-starter-kubernetes-client-loadbalancer,spring-cloud-starter-loadbalancer这个写死了,secure永远等于false,是无法使用的。访问服务的实例一定要导入这个,目标服务设置标签secured=true