java B2B2C源码电子商城系统-Spring Cloud常见问题与总结(二)

简介: 在使用Spring Cloud的过程中,难免会遇到一些问题。所以对Spring Cloud的常用问题做一些总结。一、整合Hystrix后首次请求失败1.1 原因分析Hystrix 默认的超时时间是1秒,如果在1秒内得不到响应,就会进入 fallback 逻辑。

在使用Spring Cloud的过程中,难免会遇到一些问题。所以对Spring Cloud的常用问题做一些总结。

一、整合Hystrix后首次请求失败

1.1 原因分析

Hystrix 默认的超时时间是1秒,如果在1秒内得不到响应,就会进入 fallback 逻辑。由于 Spring 的懒加载机制,首次请求往往会比较慢,因此在某些机器(特别是配置低的机器)上,首次请求需要的时间可能就会大于1秒。

1.2 解决方案

有很多方式解决该问题,下面列举几种比较简单的方案:

1) 方法一:为Ribbon配置饥饿加载。

ribbon:
  eager-load:
    enabled: true
    clients: client1,client2

对于Zuul:

zuul:
  ribbon:
    eager-load:
      enabled: true

2) 方法二:延长 Hystrix 的超时时间,示例如下

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:5000

 该配置让 Hystrix 的超时时间改为5秒。

3) 方法三:禁用 Hystrix 的超时,示例如下

hystrix.command.default.execution.timeout.enabled: false

4) 方法四:对于 Feign , 还可以为 Feign 禁用 Hystrix , 示例如下

feign.hystrix.enabled: false

这样即可为 Feign 全局禁用 Hystrix 支持。但该方式比较极端,一般不建议使用。

二、Turbine 聚合数据不完整

在某些版本的Spring Cloud (例如 Brixton SR5)中,Turbine 会发生该问题。该问题的直接观体现是:
使用 Turbine 聚合多个微服务,但在 Hystrix Dashboard 上只能看到部分微服务的监控数据。

现象描述:

比如 Turbine 配置如下:

turbine:
  appConfig:cloud-consumer-movie,cloud-consumer-movie-feign-hystrix-fallback-stream
  clusterNameExpression:"'default'"

Turbine 理应聚合 cloud-consumer-movie,cloud-consumer-movie-feign-hystrix-fallback-stream 这两个微服务的监控数据,然而打开 Hystrix Dashboard 时,会发现Dashboard 上只显示部分微服务的监控数据。

解决方案:

当 Turbine 聚合的微服务部署在同一台主机上时,就会出现该问题。

 解决方案一:

为各个微服务配置不同的 hostname ,并将 preferIpAddress 设为 false 或者不设置。

eureka:
  client:
    serviceUrl:
      defaultZone:http://127.0.0.1:8001/eureka/
  instance:
    hostname:ribbon # 配置hostname

解决方案二:

设置turbine.combine-host-port = true

turbine:
  appConfig: cloud-consumer-movie,cloud-consumer-movie-feign-hystrix-fallback-stream
  clusterNameExpression:"'default'"
  combine-host-port:true

方法三:

升级 Spring Cloud 到 Camden 或更新版本。当然,也可单独升级 Spring Cloud Netflix 到 1.2.0以上最新稳定版(一般不建议单独升级 Spring Cloud Netflix, 因为可能会跟 Spring Cloud 其他组件冲突)。

这是因为老版本中的 turbine.combine-host-port 默认值是 false 。Spring Cloud 已经意识到该问题,故在新的版本中将该属性的默认值设为 true 。该解决方案和方法二本质是一致的。

相关代码


org.springframework.cloud.netflix.turbine.TurbineProperties.combine-HostPort
 
org.springframework.cloud.netflix.turbine.CommonsInstanceDiscovery.getInstance(String, String, String, Boolean)
目录
相关文章
|
1天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
5天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
7天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
22 1
|
11天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
15天前
|
前端开发 Java 数据库连接
基于Java的校车管理系统(下)
基于Java的校车管理系统(下)
11 0
|
4天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
71 38
|
1天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
5天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
18 1
[Java]线程生命周期与线程通信
|
2天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
1天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
8 3