前言
▪️什么是微服务
微服务(Micoservice),服务一个或者一组相对较小且独立的功能单元,是用户可以感知的最小功能集。具有职责单一,充分解耦,集群化等特点。
▪️微服务技术
目前比较流行的微服务技术有阿里的dubbo和Netflix的feign。很多人将dubbo与spring cloud相提并论,其实这种观念是错误的,spring cloud是一个生态体系,dubbo是一个框架。dubbo与feign的最大差异是:dubbo是基于tcp,feign是基于http的客户端封装。
▪️其它相关技术
只要是能支持远程调用的技术,其实都可以算做微服务技术,这样的有一个专有名词RPC(Remote Procedure Call,远程过程调用)。常见的rpc技术有:java的RMI,Caucho Technolopy的Hession和Burlap、spring的HTTP invoke、JAX-RPC和JAX-WS。有兴趣的可以去了解以上这些技术,在此就不再详述了。
▪️本文的目的
阐述Spring Cloud的相关组件,比如eureka、ribbon、feign、zuul。搭建注册中心,网关路由,服务提供者,服务调用者,让读者可以快速理解和使用相关技术。本人其它博文会详述各个组件使用方式,配置,源码阅读和理解。
简单微服务结构图
简单微服务结构图.png▪️注册中心
Spring Cloud注册中心组件为Netflix的eureka,eureka的作用是服务治理与服务发现。
Eureka服务端,我们也称为服务注册中心。它同其他注册中心一样,支持高可用配置。它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中的其他分片会把它们的状态再次同步回来。以在AWS上的实践为例,Netflix推荐每个可用的区域运行一个Eureka服务端,通过它来形成集群。不同可用区域的服务注册中心通过异步模式互相复制各自的状态,这意味着在任意给定的时间点每个实例关于服务点状态是有细微差别的。
服务剔除:有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障等原因使得服务不能正常工作,而服务注册中心并未收到“服务下限”的请求。为了从服务列表中将这些无法提供服务的实例提出,Eureka Server在启动的时候会创建一个定时线程认为每隔一段时间(默认为60s)将当前清单中超时(默认为90s)没有续约的服务剔除出去。
自我保护:Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现这种请求(单机调试,开发环境很容易出现),Eureka Server会将当前的实例注册信息保护起来,让这些这些实例不会过期。但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。
由于本地调试很容易触发注册中心等保护机制,这会使得注册中心维护等服务实例不那么准确。所以,通过以下配置关闭自我保护机制。
==关闭eureka自我保护机制==
eureka.server.enable-self-preservation=false
▪️服务提供者
服务注册:服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。Eureka Server接收到这个REST请求之后,将元数据信息存在一个双层结构Map重,其中第一层的key是服务名,第二层的key是具体服务的实例名。
服务续约:在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server:“我还活着”,以防止Eureka Server的“剔除任务”将改服务实例从服务列表中排除出去,我们称该操作为服务续约(Renew)。
关于服务续约有两个重要属性,我们可以关注并根据需要来进行调整:
==eureka节点定时续约时间,默认30==
eureka.instance.leaseRenewalIntervalInSeconds=15
==eureka节点剔除时间,默认90==
eureka.instance.leaseExpirationDurationInSeconds=45
▪️服务调用者
服务发现:当我们启动服务调用者的时候,它除了将自身注册到注册中心,还会发送一个REST请求,来获取上面注册的服务清单。出于性能的考虑,Eureka Server会维护一份只读懂服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次。
==从注册中心获取注册信息==
eureka.client.fetchRegistry=true
==从注册中心获取注册信息的时间间隔==
eureka.client.registryFetchIntervalSeconds=10
服务调用:服务调用者哉获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例等元数据信息。因为有这些服务实例等详细信息,所以客户端可以通过自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡。
对于访问实例等选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone
注册中心集群部署
eureka集群部署.png▪️maven的pom配置
pom.xml ● spring-cloud-dependencies版本Camden.SR7
● spring-boot-starter-parent版本1.4.5.RELEASE
● spring-cloud-starter-eureka-server提供了注册中心相关的组件
▪️主启动类Application
注册中心的Application.class ● @EnableEurekaServer:注册中心服务端注解
● @SpringBootApplication:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan的合并注解,组件扫描默认要扫描下级目录。
▪️eureka-server的properties配置
properties文件 ● eureka.client.registerWithEureka,eureka.client.fetchRegistry为true。
● server.port分别为8887,8888,8889进行启动。
● eureka.client.serviceUrl.defaultZone,互相支持
▪️页面效果:
注册中心页面▪️eureka-client的properties配置
eureka-client的properties很简单,就是将自身暴露给所有eureka-server节点。
服务调用者负载均衡
▪️maven的pom配置
pom.xml ● spring-boot-starter-parent版本1.4.5.RELEASE
● spring-cloud-dependencies版本Camden.SR7
● spring-cloud-starter-eureka提供eureka-client组件
● spring-cloud-starter-ribbon提供ribbon组件
▪️主启动类Application
服务调用者Application.class ● @EnableEurekaClient:注册中心客户端注解
● @SpringBootApplication:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan的合并注解,组件扫描默认要扫描下级目录。
▪️service-ribbon的properties配置(ribbon配置)
服务调用者的properties以上配置对全局有效,<serviceName>.ribbon.<key>对当个服务有效,进行细粒度配置。
如果需要給我修改意见的发送邮箱:erghjmncq6643981@163.com
本博客的代码示例已上传GitHub:Spring Cloud Netflix组件入门
转发博客,请注明,谢谢。
网友评论