单体启动Eureka时报错 Request execution error. endpoint=DefaultEndpoint

本文探讨了在学习微服务时,初次启动Eureka注册中心遇到的因fetch-registry配置导致的服务未注册问题,作者分享了解决方案和原理分析,对初学者有指导价值。

在学习微服务时,我先创建了一个Eureka注册中心在启动时报错

查看报错原因是去注册中心拉取服务时报错。

        通过排查发现问题出在配置文件中。因为我将 fetch-registry: true 打开了,而我又只启动了Eureka服务,好像SpringBoot启动时会先去注册中心拉取服务,因为该服务就是注册中心,而该服务还未注册到注册中心,所以拉取时找不到注册中心而报错。

解决办法:将  fetch-registry: true 改为 false 报错消失

或者不管报错,貌似不影响功能。

server:
  port: 9300

spring:
  application:
    name: tonine-cloud-eureka
eureka:
  instance:
    prefer-ip-address: true
      # 使用ip注册,否则会使用主机名注册了(此处考虑到对老版本的兼容,新版本经过实验都是ip)
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
      # 自定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress

  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:9300/eureka

这是我自己通过看错误信息,猜测的,因为我刚开始学SpringCloud,不知道原理是不是这样,有大佬看到麻烦回答一下我,我的理解是否正确,万分感谢。

希望能对同样是初学者的人有帮助

### `Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://eureka-'` 错误原因及解决方案 #### 错误原因 - **网络连接问题**:客户端无法与 Eureka 服务器建立网络连接,可能是 Eureka 服务器未启动、地址错误、端口被防火墙阻止等。 - **服务器故障**:Eureka 服务器出现故障,无法正常响应客户端请求。 - **配置错误**:客户端配置的 Eureka 服务器地址错误,或者 Eureka 服务器配置有误。 #### 解决方案 - **检查网络连接**:确保客户端能够访问 Eureka 服务器的地址和端口。可以使用 `ping` 命令检查网络连通性,使用 `telnet` 命令检查端口是否开放。 - **检查服务器状态**:确保 Eureka 服务器正常运行。可以查看 Eureka 服务器的日志文件,检查是否有异常信息。 - **检查配置**:检查客户端和服务器的配置文件,确保 Eureka 服务器地址配置正确。例如,客户端配置如下: ```yaml eureka: client: service-url: defaultZone: http://eureka.joshua317.com/eureka/ # 确保地址正确 [^1] ``` ### `(org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2] (through reference chain: org.springframework.cloud.netflix.eureka.http.EurekaApplications["timestamp"])` 错误原因及解决方案 #### 错误原因 - **服务端返回非 JSON 数据**:Eureka 服务端可能返回了 HTML 错误页(如 404/500)、空响应或非法 JSON 结构(如以 `[` 而非 `{` 开头)。 - **BOM 头干扰**:UTF - 8 BOM(Byte Order Mark,`EF BB BF`)可能出现在 JSON 开头,导致解析器将 BOM 识别为非法字符。 - **网络传输异常**:部分响应数据丢失或损坏,导致输入流开头包含截断字符(如 `{` 后直接结束)。 - **版本不兼容**:Spring CloudEureka Server 版本不匹配(如新客户端请求旧服务端)。 #### 解决方案 - **修复服务端响应**:确保 Eureka Server 返回合法的 JSON。可以在 Eureka Server 配置中禁用 Spring Boot 默认错误页: ```yaml server: error: whitelabel: enabled: false # 禁用Spring Boot默认错误页 ``` - **客户端跳过 BOM**:在客户端自定义 `RestTemplate` 移除 BOM: ```java import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponseWrapper; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class CustomRestTemplate { public static RestTemplate eurekaRestTemplate() { return new RestTemplate() { @Override protected ClientHttpResponse handleResponse(ClientHttpRequest request, ClientHttpResponse response) throws IOException { InputStream body = response.getBody(); if (body.markSupported() && body.read() == 0xEF) { // 检测BOM body.reset(); return new ModifiedClientHttpResponse(response, body); } return response; } }; } static class ModifiedClientHttpResponse extends ClientHttpResponseWrapper { private final InputStream bodyStream; public ModifiedClientHttpResponse(ClientHttpResponse response, InputStream body) { super(response); this.bodyStream = body; } @Override public InputStream getBody() { return bodyStream; // 返回已跳过BOM的流 } } } ``` - **版本兼容性调整**:检查版本匹配(Spring Cloud 2020.0.x + Eureka 1.10.x): ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2020.0.6</version> <!-- 与Eureka Server 1.10.17兼容 --> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值