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之后接连两次弹出栈顶数字…

SpringCloud常见问题总结(二)

Spring Cloud各组件属性配置 SpringCloud中的大部分问题可以使用配置属性来规避, Spring Cloud的配置 Spring Cloud的所有组件配置都在其官方文档的附录中Spring Cloud 整合了很多类库,例如Eureka, Ribbon, Feign等&#xff0c…

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]面试题23:从上往下打印二叉树

面试题23:从上往下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11。 二叉树结点的定义如下: struct BinaryTree…

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

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

SpringCloud + Docker

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

从编码层面对比java和c#

java和c#都是面向对象编程高级语言,总体上来讲,它们还是很相似的,因为它们在发展过程中都很大程序上学习了对方不少优秀的特性。所以,一般来说,从其中一门语言转换到另外一门语言应该都不会有很大问题。虽然说这两门语…

[剑指offer]面试题28:字符串的排列

面试题28:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路: 这是一个典型的递归问题,考虑…

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

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

Docker中数据管理

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

[剑指offer]面试题31:连续子数组的最大和

面试题31:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 ❖ 解法一:举例分析数组的规…

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

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

Docker之Dockerfile详解

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

[剑指offer]面试题34:丑数

面试题34:丑数 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。 ❖ 逐个判断每…

创业的N种死法

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

Docker容器实战思维

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

[剑指offer]面试题35:第一个只出现一次的字符

面试题35:第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。 代码如下: char FirstNotRepeatingChar(char *pString) {if (pString nullptr) return \0;const int tableSize…