在上文Spring Cloud Zookeeper 升级为Spring Cloud Kubernetes 之后,我们由于使用了Kubernetes
的服务发现,由于本地不在Kubernetes
中,导致本地项目启动失败。所以就只能把代码部署到Kubernetes
中才能启动,那么就带来一个新问题,本地如何开发debug呢?
本博客的源码已上传至github,需要自取
要先知道本地如何搭建开发环境,就要知道spring cloud kubernetes
是如何连接Kubernetes
的
所以我们进行源码分析一下:
我们启动通过报错log其实可以直接定位到创建Kubernetes
client的代码
可以看到创建ApiClient
有两个地方
public static final String ENV_SERVICE_HOST = "KUBERNETES_SERVICE_HOST";
public static final String ENV_SERVICE_PORT = "KUBERNETES_SERVICE_PORT";public static ClientBuilder cluster() throws IOException {final ClientBuilder builder = new ClientBuilder();final String host = System.getenv(ENV_SERVICE_HOST);final String port = System.getenv(ENV_SERVICE_PORT);builder.setBasePath(host, port);builder.setCertificateAuthority(Files.readAllBytes(Paths.get(SERVICEACCOUNT_CA_PATH)));builder.setAuthentication(new TokenFileAuthentication(SERVICEACCOUNT_TOKEN_PATH));return builder;}
可以看到最上面的方式是通过http的方式去创建,获取的host
和port
都是从环境变量中获取的,如果http
方式连接不上就被try catch 然后通过读取配置文件的方式创建ApiClient
知道原理了之后我们就知道该怎么做了,最简单的方式肯定是会用config
去连接。我们参考之前
安装完并启动minikube
然后我们查看我们的本地配置文件,就会发现自动生成了config
配置文件
然后就可以直接启动项目了,然后发现报错,找不到
查看源码发现需要配置namespace
首先我们通过kubectl
创建一个名为default
的namespace
kubectl create ns default-namespace
我们在配置一下
spring.cloud.kubernetes.client.namespace = default
spring.cloud.kubernetes.enabled = true
需要注意一下这里如果引入了依赖
spring-cloud-kubernetes-client-config
该配置只能在bootstrap
中配置才能生效
我们这里本地是启动成功了,写一个获取服务的接口
@RestController
@RequestMapping("/service/v1")
@RequiredArgsConstructor
@Slf4j
public class ServiceController {private final DiscoveryClient discoveryClient;@GetMapping("/service")public List getServiceList(){return discoveryClient.getServices();}
}
调用
GET http://localhost:8090/service/v1/service
成功返回服务列表说明成功了