我的GitHub地址:https://github.com/leebingbin/git
在使用Spring Cloud的过程当中,不免会遇到一些问题。因此对Spring Cloud的经常使用问题作一些总结。github
默认状况下,服务注册到Eureka Server的过程较慢。在开发或测试时,经常但愿可以加速这一
过程,从而提高工做效率。spring
该问题的缘由及解决方案:bootstrap
服务的注册涉及周期性心跳,默认30秒一次(经过客户端配置的serviceUrl)。只有当实例、服务端和客户端的本地缓存中的元数据都相同时,服务才被其余客户端发现(因此可能须要3次心跳)。可使用参数 eureka.instance.leaseRenewalInSeconds 修改时间间隔, 从而加快客户端链接到其余服务的过程。在生产环境中最好坚持使用默认值,由于在服务器内部有一些计算,它们会对续约作出假设。缓存
综上所述,要想解决服务注册慢的问题,只须将 eureka.instance.leaseRenewalInSeconds 设成一个更小的值。该配置用于设置 Eureka Client 向 Eureka Server 发送心跳的时间间隔, 默认是30,单位是秒。在生产环境中,建议坚持使用默认值。服务器
在开发环境下,经常但愿 Eureka Server 能迅速有效地注销已中止的微服务实例。然而,因为 Eureka Server 清理无效节点周期长(默认90秒),以及自我保护模式等缘由,可能会遇到微服务注销慢甚至不注销的问题。解决方案以下:mvc
· Eureka Server 端:app
配置关闭自我保护,并按需配置 Eureka Server 清理无效节点的时间间隔。框架
eureka.server.enable-self-preservation # 设为false, 关闭自我保护, 从而保证会注销微服务 eureka.server.eviction-interval-timer-in-ms # 清理间隔(单位毫秒,默认是60 * 1000)
· Eureka Client 端:ide
配置开启健康检查, 并按需配置续约更新时间和到期时间。
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秒)
值得注意的是,这些配置仅建议开发或测试时使用,生产环境建议坚持使用默认值。
Tips: 配置实例
# Eureka Server配置 eureka: server: enable-self-preservation:false eviction-interval-timer-in-ms:4000
# Eureka Client配置 eureka: client: healthcheck: enabled:true instance: lease-expiration-duration-inseconds:30 lease-renewal-interval-in-seconds:10
· 修改Eureka的续约频率可能会打破 Eureka 的自我保护特征;这也意味着在生产环境中,若是想要使用 Eureka 的自我保护特性,应坚持使用默认配置。
Instance ID用于惟一标识注册到Eureka Server 上的微服务实例。在Eureka Server 的首页能够直观地看到各个微服务的InstanceID 。例如,下图中的DESKTOP-6063U0F:CONFIG-SERVER:8273 就是Instance ID 。
在 Spring Cloud 中,服务的Instance ID 的默认值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} 。固然若是想要自定义这部份内容,只须在微服务中配置 eureka.instance.instance-id 属性便可,示例以下:
spring: application: name:movieticketing-provider-user eureka: instance: # 将 Instance ID 设置成IP: 端口的形式 instance-id:${spring.cloud.client.ipAddress}:${server.port}
这样,就能够将微服务movieticketing-provider-user 的Instance ID 设为IP:端口的形式。
注册信息 UNKNOWN ,是新手常会遇到的问题。但每每不少新手,并不清楚有两种 UNKNOWN 的状况,一种是应用名称 UNKNOWN,另外一种是应用状态 UNKNOWN 。
1)应用名称UNKNOWN
应用名称UNKNOWN 显然不合适,首先是微服务的名称不够语义化,没法直观看出这是哪一个微服务;更重要的是,咱们经常使用应用名称消费对应微服务的接口。
通常来讲,有两种状况会致使该问题的发生:
· 未配置spring.application.name 或者 eureka.instance.appname 属性。若是这两个属性均不配置,就会致使应用名称 UNKNOWN 的问题。
· 某些旧版本的SpringFox 会致使该问题,例如 SpringFox 2.6.0 。建议使用更新的未定版本(SpringFox 2.6.1以上)。
2) 微服务实例状态UNKNOWN
微服务实例状态UNKNOWN 一样很麻烦。通常来说,只会请求状态是 UP 的微服务。该问题通常由健康检查致使。
eureka.client.healthcheck.enabled=true必须设置在application.yml中,而不能设置在bootstrap.yml 中,不然一些场景下会致使应用状态 UNKNOWN 的问题。
Tips:
1) SpringFox 是一款基于Spring 和 Swagger 的开源的API 文档框架,前身是 swagger-springmvc 【http://springfox.io/】。
2) Swagger 是一款很是流行的API 文档框架,它能够帮助咱们设计、构建、测试、RESTful 接口,也可生成 RESTful 接口文档。【http://swagger.io/】
本文为博主原创文章,转载请注明出处!
https://my.oschina.net/u/3375733/blog/