部署到AWS ECS的SpringBoot微服务同步通信问题排查
问题:AWS ECS上SpringBoot微服务Eureka失效后的通信解决方案
问题背景
我将SpringBoot微服务部署至AWS ECS后,Eureka Server无法正常运行,导致本地同一IP下不同端口可正常通信的微服务,在ECS环境中完全无法互相调用。
报错信息
Eureka心跳失败报错
2023-02-27T05:53:34.937Z ERROR [api-gateway,,]` 1 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_API-GATEWAY/***:api-gateway:8080 - was unable to send heartbeat!
查阅AWS ECS文档后得知,ECS不支持第三方服务发现工具,但提供了内置服务发现功能。我尝试通过WebClient直接使用DNS+端口调用目标服务,依然失败,报错如下:
DNS调用失败报错
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-2.0.0.jar:2.0.0] at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89) ~[eureka-client-2.0.0.jar:2.0.0] at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92) ~[eureka-client-2.0.0.jar:2.0.0] at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-2.0.0.jar:2.0.0] at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89) ~[eureka-client-2.0.0.jar:2.0.0] at com.netflix.discovery.DiscoveryClien
疑问
移除Eureka Client并改用AWS DNS+端口能否解决问题?或者还有哪些方法可以实现ECS环境下的微服务间通信?
相关代码与配置
WebClient代码
public Mono<user_info> finduser(String username){ return webClientBuilder.baseUrl("http://"+dns).build().get() .uri(uriBuilder -> uriBuilder .path("UserJob/get/Byusername/{username}")//"http://localhost:8082/Checkuser/{id}") .build(username)) .retrieve() .bodyToMono(user_info.class); }
docker-compose.yml配置
version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:7.3.0 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 broker: image: confluentinc/cp-kafka:7.3.0 container_name: broker ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://broker:29092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 # dbmysql: # container_name: dbmysql # image: mysql:latest # restart: unless-stopped # environment: # MYSQL_ROOT_PASSWORD: "password" # MYSQL_USER: "admin" # MYSQL_DATABASE: freelance # MYSQL_PASSWORD: "password" # # ports: # - "3307:3307" # volumes: # - /var/lib/docker/volumes/freelance_volume/_data # # mongodb: # container_name: mongodb # image: mongo:latest # restart: unless-stopped # ports: # - "27017:27017" # volumes: # - /data/db zipkin: image: openzipkin/zipkin container_name: zipkin ports: - "9411:9411" eureka-server: image: alex0121/eureka-server:latest container_name: eureka-server depends_on: - zipkin build: context: eureka-server/. dockerfile: Dockerfile.layered ports: - "8761:8761" environment: - SPRING_PROFILES_ACTIVE=docker api-gateway: image: alex0121/api-gateway:latest build: context: api-gateway/. dockerfile: Dockerfile.layered ports: - "8080:8080" depends_on: - eureka-server - zipkin environment: - SPRING_PROFILES_ACTIVE=docker notification: image: alex0121/notification:latest build: context: notification/. dockerfile: Dockerfile.layered ports: - "8081:8081" depends_on: - eureka-server - broker - zipkin environment: - SPRING_PROFILES_ACTIVE=docker chatroom: image: alex0121/chatroom:latest build: context: chatroom/. dockerfile: Dockerfile.layered ports: - "8084:8084" depends_on: - eureka-server - zipkin environment: - SPRING_PROFILES_ACTIVE=docker userjob: depends_on: - eureka-server - zipkin image: alex0121/userjob:latest container_name: userjob build: context: userjob/. dockerfile: Dockerfile.layered #docker file path (. means root directory) ports: - "8000:8000" environment: - SPRING_PROFILES_ACTIVE=docker
内容的提问来源于stack exchange,提问作者Alex So
相关产品推荐
相关产品推荐

