同一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:
- 创建
camel-service.yaml:
apiVersion: v1 kind: Service metadata: name: camel-provider-service spec: selector: app: camel-quarkus ports: - protocol: TCP port: 8080 targetPort: 8080
- 修改Pod的
metadata添加标签:
metadata: name: camel-quarkus-pod labels: app: camel-quarkus
- 更新调用者的
serviceCall()配置:
.serviceCall("http://camel-provider-service/greet")
此方式完全依赖Kubernetes原生服务发现,无需第三方组件。
内容的提问来源于stack exchange,提问作者eistropfen
相关产品推荐
相关产品推荐

