我再也不用担心面试官常问的Spring Cloud问题,因为...
今天我们聊聊Spring Cloud 服务治理.
1.Spring Cloud微服务
- 初识 Spring Cloud
- Spring Cloud 服务治理
2.初识Spring Cloud
2.1-微服架构
微服务架构:
"微服务”一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到
http://martinfowler.com/articles/microservices.html
-
微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间一般通过 HTTP 的 RESTfuLAPI 进行通信协作。
-
被拆分成的每一个小型服务都围绕着系统中的某一项或些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发自动化测试案例以及独立部署机
制。 -
由于有了轻量级的通信协作基础,所以这些微服务可以使用
不同的语言来编写。
2.2-初识Spring Cloud
-
Spring Cloud 是一系列框架的有序集合。
-
Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来。
-
通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
-
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、 断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
-
Spring Cloud项目官方网址:https://spring.io/projects/spring-cloud
-
Spring Cloud 版本命名方式采用了伦敦地铁站的名称,同时根据字母表的顺序来对应版本时间顺序,比如:最早的Release版本:Angel,第二个Release版本:Brixton,然后是Camden、Dalston、Edgware,Finchley,Greenwich,Hoxton。
-
目前最新的是Hoxton版本。
注意:这里我们就不要使用idea自带的springboot快速创建方法,这样生成的springboot版本最低已经是2.2以上了,而现在的spring cloud暂不支持2.2以上的版本,所以还是请各位同学手动创建maven模块.
2.3-Spring Cloud 和dubbo对比
Spring Cloud 和dubbo对比
-
Spring Cloud 与 Dubbo 都是实现微服务有效的工具。
-
Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件。
-
Dubbo 使用 RPC 通讯协议,Spring Cloud 使用 RESTful 完成通信,Dubbo 效率略高于 Spring Cloud。
总结
-
微服务就是将项目的各个模块拆分为可独立运行、部署、测试的架构设计风格。
-
Spring 公司将其他公司中微服务架构常用的组件整合起来,并使用 SpringBoot 简化其开发、配置。
称为 Spring Cloud
-
Spring Cloud 与 Dubbo都是实现微服务有效的工具。Dubbo 性能更好,而 Spring Cloud 功能更全面。
3.Spring Cloud服务治理
3.1-Eureka介绍
• Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。
• Eureka 和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被 Spring Cloud 社区整合为
Spring-Cloud-Netflix 模块。
• Eureka 包含两个组件:Eureka Server (注册中心) 和 Eureka Client (服务提供者、服务消费者)。
3.2-Eureka属性
3.2.1-instance相关属性
Eureka Instance的配置信息全部保存在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean配置类里,实际上它是com.netflix.appinfo.EurekaInstanceConfig的实现类,替代了netflix的com.netflix.appinfo.CloudInstanceConfig的默认实现。
Eureka Instance的配置信息全部以eureka.instance.xxx的格式配置。
配置列表
- appname = unknown
应用名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
- appGroupName = null
应用组名
- instanceEnabledOnit = false
实例注册到Eureka上是,是否立刻开启通讯。有时候应用在准备好服务之前需要一些预处理。
- nonSecurePort = 80
非安全的端口
- securePort = 443
安全端口
- nonSecurePortEnabled = true
是否开启非安全端口通讯
- securePortEnabled = false
是否开启安全端口通讯
- leaseRenewalIntervalInSeconds = 30
实例续约间隔时间
- leaseExpirationDurationInSeconds = 90
实例超时时间,表示最大leaseExpirationDurationInSeconds秒后没有续约,Server就认为他不可用了,随之就会将其剔除。
- virtualHostName = unknown
虚拟主机名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
- instanceId
注册到eureka上的唯一实例ID,不能与相同appname的其他实例重复。
- secureVirtualHostName = unknown
安全虚拟主机名,首先获取spring.application.name的值,如果取值为空,则取默认unknown。
- metadataMap = new HashMap();
实例元数据,可以供其他实例使用。比如spring-boot-admin在监控时,获取实例的上下文和端口。
- dataCenterInfo = new MyDataCenterInfo(DataCenterInfo.Name.MyOwn);
实例部署的数据中心。如AWS、MyOwn。
- ipAddress=null
实例的IP地址
- statusPageUrlPath = “/actuator/info”
实例状态页相对url
- statusPageUrl = null
实例状态页绝对URL
- homePageUrlPath = “/”
实例主页相对URL
- homePageUrl = null
实例主页绝对URL
- healthCheckUrlUrlPath = “/actuator/health”
实例健康检查相对URL
- healthCheckUrl = null
实例健康检查绝对URL
- secureHealthCheckUrl = null
实例安全的健康检查绝对URL
- namespace = “eureka”
配置属性的命名空间(Spring Cloud中被忽略)
- hostname = null
主机名,不配置的时候讲根据操作系统的主机名来获取
- preferIpAddress = false
是否优先使用IP地址作为主机名的标识
3.2.2-server相关属性
Eureka Server注册中心端的配置是对注册中心的特性配置。Eureka Server的配置全部在org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean里,实际上它是com.netflix.eureka.EurekaServerConfig的实现类,替代了netflix的默认实现。
Eureka Server的配置全部以eureka.server.xxx的格式进行配置。
配置列表
- enableSelfPreservation=true
是否开启自我保护
- renewalPercentThreshold = 0.85
自我保护续约百分比阀值因子。如果实际续约数小于续约数阀值,则开启自我保护
- renewalThresholdUpdateIntervalMs = 15 * 60 * 1000
续约数阀值更新频率。
- peerEurekaNodesUpdateIntervalMs = 10 * 60 * 1000
Eureka Server节点更新频率。
- enableReplicatedRequestCompression = false
是否启用复制请求压缩。
- waitTimeInMsWhenSyncEmpty=5 * 60 * 1000
当从其他节点同步实例信息为空时等待的时间。
- peerNodeConnectTimeoutMs=200
节点间连接的超时时间。
- peerNodeReadTimeoutMs=200
节点间读取信息的超时时间。
- peerNodeTotalConnections=1000
节点间连接总数。
- peerNodeTotalConnectionsPerHost = 500;
单个节点间连接总数。
- peerNodeConnectionIdleTimeoutSeconds = 30;
节点间连接空闲超时时间。
- retentionTimeInMSInDeltaQueue = 3 * MINUTES;
增量队列的缓存时间。
- deltaRetentionTimerIntervalInMs = 30 * 1000;
清理增量队列中过期的频率。
- evictionIntervalTimerInMs = 60 * 1000;
剔除任务频率。
- responseCacheAutoExpirationInSeconds = 180;
注册列表缓存超时时间(当注册列表没有变化时)
- responseCacheUpdateIntervalMs = 30 * 1000;
注册列表缓存更新频率。
- useReadOnlyResponseCache = true;
是否开启注册列表的二级缓存。
- disableDelta=false。
是否为client提供增量信息。
- maxThreadsForStatusReplication = 1;
状态同步的最大线程数。
- maxElementsInStatusReplicationPool = 10000;
状态同步队列的最大容量。
- syncWhenTimestampDiffers = true;
当时间差异时是否同步。
- registrySyncRetries = 0;
注册信息同步重试次数。
- registrySyncRetryWaitMs = 30 * 1000;
注册信息同步重试期间的时间间隔。
- maxElementsInPeerReplicationPool = 10000;
节点间同步事件的最大容量。
- minThreadsForPeerReplication = 5;
节点间同步的最小线程数。
- maxThreadsForPeerReplication = 20;
节点间同步的最大线程数。
- maxTimeForReplication = 30000;
节点间同步的最大时间,单位为毫秒。
- disableDeltaForRemoteRegions = false;
是否启用远程区域增量。
- remoteRegionConnectTimeoutMs = 1000;
远程区域连接超时时间。
- remoteRegionReadTimeoutMs = 1000;
远程区域读取超时时间。
- remoteRegionTotalConnections = 1000;
远程区域最大连接数
- remoteRegionTotalConnectionsPerHost = 500;
远程区域单机连接数
- remoteRegionConnectionIdleTimeoutSeconds = 30;
远程区域连接空闲超时时间。
- remoteRegionRegistryFetchInterval = 30;
远程区域注册信息拉取频率。
- remoteRegionFetchThreadPoolSize = 20;
远程区域注册信息线程数。
3.3-Eureka高可用
- 准备两个Eureka Server
- 分别进行配置,相互注册
- Eureka Client 分别注册到这两个 Eureka Server中
3.4-Nacos
3.4.1-Nacos 概述
Nacos(Dynamic Naming and Configuration Service) 是阿里巴巴2018年7月开源的项目。
• 它专注于服务发现和配置管理领域 致力于帮助您发现、配置和管理微服务。Nacos 支持几乎所有主流类型的“服
务”的发现、配置和管理。
• 一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。
• 官网:https://nacos.io/
• 下载地址: https://github.com/alibaba/nacos/releases
最后总结一下:
1.springcloud就是将一系列框架存放在一起的集合,通过springboot风格对这些成熟的框架进行封装屏蔽掉一些复杂的配置和实现原理供开发者们更好的使用.
2.springcloud微服务就是将一个大型的独立的系统拆分成垂直拆分成多个微小的服务,拆分后可以各自独立的运行,并且这些微服务可以支持用不同的语言进行编写.
3.Eureka就是一个注册中心,供服务者和消费者使用,服务者进行注册,消费者进行拉取,而Eureka相当于中介公司,在中间为二者提供服务,并可以实时监测服务过程中一些动态的状态.
4.本文章只是讲述了相关的基本概念,其它相关的一些入门案例会另外抽取一遍文章为同学们进行演示.