如何本地调试Kubernetes集群上的Spring Cloud微服务

一种常见的方法——在本机上搭建一套开发环境,哪怕只是其中的一个微服务出现问题了,也要把整个系统完整地跑起来。以a-service为例,如果要调试、修复a-service的bug,除了要启动a-service本身之外,还要启动Eureka、Config、Gateway等等。

费事!费时!费力!

能不能不启动Eureka、Config这些中间件,直接使用Kubernetes集群里运行好的呢?答案当然是可以的,具体的方法如下。

配置Eureka

在Kubernetes集群里,a-service通过域名k8s-eureka(假设)访问Eureka实例。域名k8s-eureka只在集群内生效,在集群外无法使用。在本地开发环境中,如果要访问集群内的Eureka实例,就要把Eureka的IP、端口暴露出来,方法是创建一个NodePort或者LoadBalancer类型的Service。假设外部访问地址为http://my-eureka:8761,则按如下方式修改application.yml

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://my-eureka:8761/eureka/

配置Config

一般情况下,a-service是通过Eureka来连接Config,即:

spring:
  config:
    import: "optional:configserver:"
  cloud:
    config:
      discovery:
        enabled: true
        service-id: SPRING-CLOUD-CONFIG
      label: master
      name: a-service
      profile: default

要知道,Eureka和Config都是运行在Kubernetes集群里面,通过Eureka获得的Config的IP、端口,都是只在集群内生效,在集群外无法使用。因此,在本地开发环境中,如果要访问集群内的Config实例,就不能通过Eureka来访问。只能是先把Config实例的IP、端口暴露出来,然后通过这个IP、地址(假设为:http://my-config:8888)直接连过去,即:

spring:
  config:
    import: "optional:configserver:http://my-config:8888"
  cloud:
    config:
      label: master
      name: a-service
      profile: dev

修改a-service的服务名

为什么要把服务名a-service重命名为a-service-dev?原因是本地的a-service与集群的a-service最终都是注册到同一个Eureka上,如果不区分两者的服务名,就无法确定实际调用的是哪一个a-service。代码如下:

spring:
  application:
    name: a-service-dev

修改a-service的客户端

修改a-service的客户端的原因同上,代码如下:

@FeignClient(name = "A-SERVICE-DEV", path = "/a")
public interface AClient {
...
}
写于 2022年03月24日