SpringCloud-Eureka(三)常见问题

一、Eureka的自我保护模式

如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式:

     EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE 
     UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND 
     HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

一般出现此模式时,服务返回错误。即如果真实的服务已经Down掉,但在注册中心界面服务却一直存在,且显示为UP状态。

产生原因

    Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否
低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在
生产环境上通常是由于网
络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提
示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分
区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注
册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

解决方法:

详情可见上一篇博客,就不在这边赘述了。

如何处理服务挂掉后或者手动关闭服务后,Ribbon负载均衡还是一直调用这个服务:

1.Hystrix,在fallback方法中shutdown指定的服务
2.让zuul只路由到活着的那个服务:
添加依赖:
  <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.6.0</version>
  </dependency>
配置文件:
ribbon.connectTimeout: 2000
ribbon.readTimeout: 10000
ribbon.maxAutoRetries: 1
ribbon.maxAutoRetriesNextServer: 2
ribbon.okToRetryOnAllOperations: true
ribbon.okhttp.enabled: true
3.重试机制(和上述一个道理)
spring.cloud.loadbalancer.retry.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
hello-service.ribbon.ConnectTimeout=250
hello-service.ribbon.ReadTimeout=1000
hello-service.ribbon.OkToRetryOnAllOperations=true
hello-service.ribbon.MaxAutoRetriesNextServer=2
hello-service.ribbon.MaxAutoRetries=1


spring.cloud.loadbalancer.retry.enabled:该参数用来开启重试机制,它默认是关闭的。这里需要注意,官方文档中的配置参数少了enabled
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试。

hello-service.ribbon.ConnectTimeout:请求连接的超时时间

hello-service.ribbon.ReadTimeout:请求处理的超时时间

hello-service.ribbon.OkToRetryOnAllOperations:对所有操作请求都进行重试

hello-service.ribbon.MaxAutoRetriesNextServer:切换实例的重试次数

hello-service.ribbon.MaxAutoRetries:对当前实例的重试次数

二、指定Eureka的Environment

eureka.environment: 指定环境

三、指定Eureka的DataCenter

eureka.datacenter: 指定数据中心

四、Whitelabel Error Page

@springBootApplication在进行加载时,只会加载其入口的当前目录及其子目录下的服务,如果存放在其它目录下,应用扫描不到

有不准确,或者有疑问的地方朋友,可以加群,也可以在评论中指出,谢谢大家

Java交流群:313145288

### 使用 `spring-cloud-starter-netflix-eureka-client` 的方法 #### Maven 配置 为了正确引入 `spring-cloud-starter-netflix-eureka-client`,需要在项目的 `pom.xml` 文件中配置 Spring Cloud 的依赖管理部分。以下是推荐的配置方式: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <!-- 版本号需根据实际需求调整 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> ``` 上述配置通过 `spring-cloud-dependencies` 来统一管理 Spring Cloud 组件的版本,从而避免因手动指定不同组件版本而导致的冲突问题[^3]。 --- #### 启用 Eureka 客户端功能 要在应用程序中启用 Eureka 客户端的功能,需要完成以下操作: 1. **修改 `application.yml` 或 `application.properties`** 添加必要的配置项来连接到 Eureka Server 实例。例如,在 `application.yml` 中可以这样设置: ```yaml eureka: client: service-url: defaultZone: http://localhost:1010/eureka/ # 替换为实际的Eureka服务器地址 ``` 2. **标注主类** 在 Spring Boot 应用程序的入口类上添加 `@EnableDiscoveryClient` 注解,以便让应用注册到 Eureka 服务发现机制中。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` --- #### 常见问题及其解决办法 1. **无法解析依赖问题** 如果遇到类似于 “Cannot resolve org.springframework.cloud:spring-cloud-starter-netflix-eureka-client” 的错误,可能是由于网络原因导致某些依赖未能成功下载。可以通过清理本地 Maven 缓存并强制重新加载依赖来解决问题[^5]。具体步骤如下: - 打开终端,进入 `.m2/repository` 目录; - 删除所有带有 `.lastUpdated` 后缀的文件; - 返回 IDE 并刷新项目(通常可通过右键点击项目 -> Reload Project)。 2. **版本冲突** 当多个模块之间存在不兼容的版本时,可能会引发运行时异常或编译失败。建议始终使用一致的 BOM(Bill of Materials),即通过 `spring-cloud-dependencies` 进行全局版本控制[^2]。 3. **Eureka Client 未正常注册** 若客户端未能成功向 Eureka Server 注册,则可能是因为 `defaultZone` 地址配置有误或者 Eureka Server 尚未启动。确认两者之间的连通性以及日志中的提示信息有助于定位问题所在[^4]。 --- ### 示例代码片段 下面是一个简单的微服务实例,展示如何利用 Eureka 客户端实现服务注册与发现: ```java @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello from Eureka Client!"; } } ``` 当此服务启动后,它会自动尝试联系已定义好的 Eureka Server,并将自己的元数据提交上去供其他消费者调用。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值