1、服务治理
springcloud封装了Netflix的Eureka模块来实现服务治理
在传统的rpc远程调用框架中,管理每一个服务与服务之间依赖关系比较复杂,所以需要使用服务治理,可以实现服务调用、负载均衡、容错等,实现服务发现于注册。
Eureka采用CS的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己的服务器的信息,比如 服务地址 通讯地址等以别名方式注册到注册中心上。另一方(消费者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用。
RPC远程调用框架核心思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程调用框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka包含两个组件:
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
Eureka Client(做为微服务的一部分)通过注册中心进行访问
@EnaleEurekaClient不写在主启动类上,也能生效
是一个java客户端,用于简化Eureka Server的交互,客户端同时也内置一个使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期30s)。如果Eureka Server在多个心跳周期内没有接受到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90s)。
Eureka是spring社区出的;nacos是阿里出的
服务注册:将服务信息注册进注册中心
服务发现:从注册中心上获取服务信息
实质:存key服务名,取value调用地址
注册流程:
1、先启动Eureka注册中心
2、启动服务提供者的服务
3、服务提供者的服务会把自身信息(比如服务地址)以别名形式注册进eureka
4、消费者服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址
5、消费者在获得调用地址后,底层实际是利用HttpClient技术实现远程调用
6、消费者在获得服务地址后会缓存在本地JVM内存中,默认每间隔30s更新一次服务调用地址。
Eureka已经停更
2、负载均衡
Ribbon
Ribbon和Eureka整合后,消费者可以直接调用服务,而不用关心地址和端口,且还有负载均衡的功能。
SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡工具
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
LB负载均衡(Load Balance)
将用户的请求平摊分配到多个服务上,从而达到系统的HA(高可用)。
Nginx是服务器负载均衡,客户端所有的请求都交给Nginx,然后由Nginx实现转发请求。
Ribbon是本地负载均衡(客户端负载均衡),在调用微服务接口的时候,会在注册中心桑获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用的技术。
集中式LB:在服务的消费方和提供方之间使用独立的LB设施(可以是硬件F5,也可以是软件nginx),由设施负责把访问请求 通过某种策略转发至服务的提供方。
进程内LB:将LB逻辑集成到消费方,消费方从注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。如Ribbon,它只是一个类库。
需要在消费者方集成Ribbon
Ribbon工作分两步走
1、优先选择在同一区域内,负载较少的Eureka Server
2、根据用户指定的策略,从server取到的服务注册列表中选择一个地址
用法:负载均衡@LoadBalance + restTemplate调用
负载均衡算法 限流算法
Ribbon核心组件IRule
IRule:根据特定算法从服务列表中选取一个要访问的服务。
出厂默认轮询规则。
自定义的IRule不能放在@ComponetScan注解扫描的包和子包下面!!!
主启动类:@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
轮询负载均衡算法:rest接口第几次请求数%服务器集群总数量=实际调用服务器的位置下标,每次服务重启之后接口计数从1开始。
通过discoveryClient获取服务器数量 + @EnableDiscoveryClient
GUC
3、服务调用
feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需要创建一个接口,并在接口添加注解。
Feign旨在让编写java Http客户端变得更容易。
Feign集成了Ribbon,利用Ribbon维护服务列表信息,并且通过轮询实现客户端的负载均衡。
OpenFeign默认等待1秒钟,超过后报错。
设置OpenFeign的超时时间
Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解Http请求的细节。
(对Feign接口的调用情况进行监控和输出)
4、服务降级
Hystrix -后面框架借鉴和抄作业的必备良药
分布式系统面临的问题:
复杂分布式系统结构中的应用程序有数十个依赖关系,每个依赖关系在某个时候将不可避免的失败
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖会不可避免的调用失败,如超时、异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(Fall Back),而不是长时间的等待,或者抛出调用方法无法处理的异常。这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免故障在分布式系统中的蔓延,乃至雪崩。
1、fallback服务降级
2、break服务熔断
3、flowlimit服务限流
JMeter高并发压测后卡顿:springboot默认集成tomcat,tomcat默认的工作线程数被打满了,没有多余的线程来分解压力和处理。