You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一Kubernetes Pod内Camel Quarkus应用serviceCall()通信咨询

同一Minikube Pod内Camel Quarkus应用通过serviceCall()通信的无额外服务发现示例

核心原理

同一Kubernetes Pod内的所有容器共享网络命名空间,因此可以直接通过localhost+容器暴露端口互相访问。结合Camel的serviceCall() EIP时,无需Consul/Eureka等第三方服务发现,直接利用Pod内网络特性或Kubernetes原生Service即可实现通信。


步骤1:编写两个Camel Quarkus应用

应用1:服务提供者(Provider)

监听8080端口,提供REST接口:

import org.apache.camel.builder.RouteBuilder;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class ProviderRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        rest()
            .get("/greet")
            .route()
                .setBody(constant("Hello from Provider App!"));
    }
}

application.properties配置:

quarkus.http.port=8080
# 启用Kubernetes组件支持(满足基于Kubernetes的要求)
camel.component.kubernetes.enabled=true

应用2:服务调用者(Caller)

定时调用提供者接口,使用serviceCall():

import org.apache.camel.builder.RouteBuilder;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class CallerRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // 每5秒触发一次调用
        from("timer:callProvider?period=5000")
            .log("Calling provider app...")
            // 直接指向同一Pod内的提供者端口
            .serviceCall("http://localhost:8080/greet")
            .log("Response from provider: ${body}");
    }
}

application.properties配置:

quarkus.http.port=8081
camel.component.kubernetes.enabled=true
# 配置Kubernetes API地址(容器内默认地址)
camel.cloud.service-discovery.kubernetes.api-master-url=https://kubernetes.default.svc:443
camel.cloud.service-discovery.kubernetes.namespace=${env:KUBERNETES_NAMESPACE:default}

步骤2:构建容器镜像

使用Quarkus内置的镜像构建功能:

# 构建提供者镜像
cd provider-app
./mvnw package -Dquarkus.container-image.build=true -Dquarkus.container-image.group=local -Dquarkus.container-image.name=camel-provider -Dquarkus.container-image.tag=latest

# 构建调用者镜像
cd caller-app
./mvnw package -Dquarkus.container-image.build=true -Dquarkus.container-image.group=local -Dquarkus.container-image.name=camel-caller -Dquarkus.container-image.tag=latest

将镜像加载到Minikube:

minikube image load local/camel-provider:latest
minikube image load local/camel-caller:latest

步骤3:部署同一Pod内的两个应用

创建camel-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: camel-quarkus-pod
  namespace: default
spec:
  containers:
    - name: provider-container
      image: local/camel-provider:latest
      ports:
        - containerPort: 8080
    - name: caller-container
      image: local/camel-caller:latest
      ports:
        - containerPort: 8081

部署到Minikube:

kubectl apply -f camel-pod.yaml

步骤4:验证通信

查看调用者容器的日志:

kubectl logs camel-quarkus-pod -c caller-container

预期输出:

Calling provider app...
Response from provider: Hello from Provider App!

可选:基于Kubernetes Service的serviceCall发现

如果希望更贴合serviceCall()的服务发现模式,可创建指向该Pod的Kubernetes Service:

  1. 创建camel-service.yaml:
apiVersion: v1
kind: Service
metadata:
  name: camel-provider-service
spec:
  selector:
    app: camel-quarkus
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  1. 修改Pod的metadata添加标签:
metadata:
  name: camel-quarkus-pod
  labels:
    app: camel-quarkus
  1. 更新调用者的serviceCall()配置:
.serviceCall("http://camel-provider-service/greet")

此方式完全依赖Kubernetes原生服务发现,无需第三方组件。

内容的提问来源于stack exchange,提问作者eistropfen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:15:37