SpringCloud常见问题总结(一)

Eureka常见问题

Eureka注册服务慢
  • 默认情况,服务注册到Eureka Server 的过程比较慢。在开发或者测试时候,如果能够加速注册的过程,从而提升工作效率。
  • Spring Cloud官方文档详细描述了该问题的原因并提供了解决方案:
//原文
Why is it so Slow to Register a Service?
Being an instance also involves a periodic heartbeat to the registry (via the client’s serviceUrl) with default duration 30 seconds. A service is not available for discovery by clients until the instance, the server and the client all have the same metadata in their local cache (so it could take 3 heartbeats). You can change the period using eureka.instance.leaseRenewalIntervalInSeconds and this will speed up the process of getting clients connected to other services. In production it’s probably better to stick with the default because there are some computations internally in the server that make assumptions about the lease renewal period.
  • 解释如下:服务的注册涉及到周期性的心跳检测,默认Eureka是30秒发送异常心跳(通过客户端配置的serviceUrl)。只有当前实例,服务器端和客户端的本地缓存中的元数据都相同的时候,服务才能被其他客户端发现(所以可能需要3次心跳)。可以使用参数eureka.instance.leaseRenewalIntervalInSeconds修改时间间隔,从而加快客户端连接到其他服务的过程。在生成环境中最好使用默认的值,因为在服务器内部有一些计算,这些配置的修改都会对其进行影响。
Eureka已停的微服务节点注销慢或不注销
  • 在开发环境,我们希望Eureka Server能迅速有效的注销已经停止的微服务实例。然而,由于Eureka Server 清理无效节点的周期比较长(默认90s),以及自我保护模式等原因,可能会遇到微服务注销慢甚至不注销的情况。解决方案如下:
  • Eureka Server端:配置关闭自我保护,并且按需配置Eureka Server清理无效节点的时间间隔。配置如下:
eureka.server.enable-self-preservation
#设置为false,关闭自我保护,从而保证会注销微服务
eureka.server.eviction-interval-tomer-in-us
#清理间隔(单位毫秒,默认60*1000
  • Eureka Client端:配置开启健康检查,并按照业务需要配置续约更新时间和到期时间。配置如下:
eureka.client.healthcheck.enabled
#设为true,开启健康检查(需要添加依赖spring-boot-starter-actuator)
eureka.instance.lease-renewal-interval-in-seconds
#续约更新时间间隔,默认30秒
eureka.instance.lease-expiration-duration-in-seconds
#续约到期时间默认90
  • 以上的配置仅建议在开发的时候,测试的时候用,生产环境如非必要建议坚持使用默认值,因为修改Eureka的续约评率可能会打破Eureka的自我保护特性,这就意味着生产环境中如果真正遇到网络问题或者其他情况无法注册,或者无法发送心跳等情况,此时Eureka的自我保护也无法使用,可能导致更严重的问题,所以坚持默认配置还是有好处的,具体情况结合实际业务需求来改变。如下配置示例
#Server配置示例server:enable-self-preservation: falseeviction-interval-timer-in-ms: 4000
#client配置示例
server:port: 8761
eureka:client:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://localhost:8761/eurekahealthcheck:enable: trueinstance:lease-expiration-duration-in-seconds: 30lease-renewal-interval-in-seconds: 10
  • 以下界面表示处于自我保护状态下的Eureka界面截图信息:
    在这里插入图片描述
自定义微服务的InstandeID
  • InstanceID用于唯一事变注册到Eureka Server上的微服务实例。在Eureka的首页可以直观的看到各个微服务的InstanceID,如上图中所示,localhost:microservice-consumer-business:8080就是instanceID
  • Spring Cloud中,服务的InstanceID默认值是${spring.cloud.client.hostname}: ${spring.aplication.name}: &{spring.aplication.instance_id: ${server.port}}。如果想自定义这部分内容,只需要在微服务中配置eureka.instance.instance-id,如下案例:
server:port: 8001
spring:application:name: microservice-provider-user
eureka:instance:prefer-ip-address: trueinstance-id: ${spring.cloud.client.ipAddress}:${server.port}
  • 这样配置后,可以将微服务microservice-provider-user的instanceID设置为ip:端口的形式。效果如下
    在这里插入图片描述
Eirela的UNKNOWN问题总结与解决
  • 注册信息UNKNOWN,在刚开始学SpringCloud的时候遇到过这个问题,如下图,有两种UNKNOWN的情况,一种是应用名称UNKNOW,另外一种是应用状态的UNKNOWN,下面分别讨论两种情况
    在这里插入图片描述
应用名称UNKNOWN
  • 应用名称UNKNOWN显然是不应该存在于任何环境下的微服务机器中,首先是微服务的名字不能够望文见意,无法直观看出这个那个服务;更重要的是,我们经常使用引用名称消费对应的微服务的接口,比如我们用FegnClient的时候,必须用到服务名称。
  • 一般来说,有两种情况可能导致这个问题的产生:
    • 未配置spring.application.name或者eureka.instance.appname属性(配置了但是名称没有写配置的是空值)。如果这两个属性均是空,就会导致应用名称UNKNIWN的问题。
    • 某些版本的SpringFox会导致这个问题,不让SpringFox2.6.0。建议使用SpringFox2.6.1或者更高的版本。
微服务状态UNKNOWN
  • 微服务状态UNKNOWN同样麻烦,一般情况,Loadbalance负责均衡器只会请求UP状态的服务器。该问题一般由监考检查导致的
  • eureka.client.healthcheck.enabled=true必须设置在application.yml中,而不能设置在bootstrap.yml中,否则一下场景下会导致应用状态UNKNOWN的问题。
Hystrix/Feign 整合Hystrix后首次请求失败
  • 在某些场景下,Feign或者Ribbon整合Hystrix后,会出现首次调用失败的问题。
原因分析
  • Hystrix默认的超时时间是1秒,如果在1秒内得不到响应,就会进入fallback逻辑。由于Spring的懒加载机制,首次请求会比较慢,因此在某些机器(例如配置比较低的机器)上,上次请求需要的时间可能会大于1秒。因此出现这个问题
解决方案
  • 方法一,延长Hystrix的超时时间,如下配置可以让Hystrix超时时间修改为5秒:
hystrix.command.default.execution.timeout.enabled: false
  • 方法二:禁用Hystrix的超时,配置示例如下:
Hystrix.command.default.execution.timeout.enabled:false
  • 方法三:对于Feign,还将可以禁用Hystrix,这样既可以为Feign全局禁用Hystrix支持,不过这种方式比较极端,不推荐这样做。示例如下:
feign.hystrix.enabled: false

[下一篇 SpringCloud常见问题总结(二)(https://blog.csdn.net/liaojiamin0102/article/details/107408563)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[剑指offer]面试题21:包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 栈内压入3、4、2、1之后接连两次弹出栈顶数字…

IO 模型知多少

1. 引言同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型&am…

[剑指offer]面试题22:栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1…

Ubuntu上安装使用Docker

Docker简介 Docker是一个开源的容器引擎,他有助于更快的交付应用。Docker可以将应用程序和基础设施层做隔离,并且能将基础设施当做程序一样进行管理。使用Docker,可以更快的打包,测试以及部署应用程序,并且可以缩短从…

让 .NET 轻松构建中间件模式代码

让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法,以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异…

[剑指offer]面试题26:复杂链表的复制

面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指…

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件,类似txt,只不过名字是Dockerfile,里面编辑Docker的一些指令,指令作用在于描述构建镜像的细节。如下一个简单的案例,用上一节中下载的nginx镜像来…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日,红帽公司宣布,产品和技术总裁 Paul Cormier 即日起任红帽总裁,并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者,这一模式促使红帽达成连续超70个季度的盈利,身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式: 数据卷(Data Volumes):容器内数据直…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…

创业的N种死法

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片,开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明…

dotNET Core 3.X 请求处理管道和中间件的理解

理解 dotNET Core 中的管道模型,对我们学习 dotNET Core 有很大的好处,能让我们知其然,也知其所以然,这样在使用第三方组件或者自己写一些扩展时,可以避免入坑,或者说避免同样的问题多次入坑。本文分为以下…

了解.NET中的垃圾回收

原文来自互联网,由长沙DotNET技术社区编译。尽管这是一篇来自2009年的古老的文章,但或许能够对你理解GC产生一些作用。 了解.NET中的垃圾回收一旦了解了.NET的垃圾收集器是如何工作的,那么可能会触及.NET应用程序的一些更为神秘的问题时&…

数据结构与算法--数组:二维数组中查找

数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存&#xf…

数据结构与算法--字符串:字符串替换

数据结构与算法–字符串:字符串替换 字符串的优化 由于字符串在编程时候使用的评率非常高,为了优化,很多语言都对字符串做了特殊的规定。下面我们讨论java中字符串的特性java中的字符数组以’\0’ 结尾,我们可以利用这个特性来找…

数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序非比较类型排序&…

如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

原文来自互联网,由长沙DotNET技术社区编译。本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/从事大型企业项目的任何人都知道内存泄漏就像是大型酒店中的老鼠。当它们很少时,您可能不会…

ASP.NET Core技术研究-探秘依赖注入框架

ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务、提供服务。依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者。毫不夸张的说,ASP.NET Core通过依赖注入实现了各种服务对象的注册和创建,…