Spring Cloud Netflix

一、简介 

  Spring Cloud Netflix 是 Netflix推出的一套基于 Spring Cloud 微服务规范的微服务架构套件的具体实现。是目前比较成熟的 Spring Cloud 微服务实现方案。

二、核心组件 

服务注册与发现:Eureka

客户端调用的服务代理:Feign

服务负载均衡:Ribbon

隔离、熔断以及降级:Hystrix

  限流:限制并发数

  隔离:服务之间互不影响 (单个服务,独立线程池

  熔断:对某一服务调用直接不处理,直接返回给调用者(全开,半开,关闭

  降级:熔断时做记录,以便后面的数据恢复

统一调度网关(网络路由):Zuul

  可以做统一的降级、限流、认证授权、安全,等等

三、相关注解

@EnableEurekaServer:在项目启动类上使用@EnableEurekaServer,可以将项目作为SpringCloud中的注册中心。

@EnableDiscoveryClient:表明是SpringCloud的客户端,基于spring-cloud-commons,如果是其他的注册中心,那么推荐使用该注解

@EnableEurekaClient:表明是SpringCloud的Eureka的客户端,基于spring-cloud-netflix,如果选用的注册中心是eureka,那么就推荐使用该注解

@EnableFeignClients(basePackages = "com.**.client")   :引用Eureka的外部客户端的扫描地址

@FeignClient:声明外部客户端,并指定名称

@RibbonClient:

@EnableCircuitBreaker:SpringCloud中使用断路器,需要加上此注解

@EnableHystrix:表示启动断路器,断路器依赖于服务注册和发现。

@HystrixCommand:注解方法失败后,系统将西东切换到fallbackMethod方法执行。

@LoadBalanced:Spring Cloud的commons模块提供了一个@LoadBalanced注解,方便我们对RestTemplate添加一个LoadBalancerClient,以实现客户端负载均衡。通过源码可以发现这是一个标记注解,我们可以通过ribbon实现客户端的负载均衡功能。

@EnableZuulProxy:@EnableZuulServer的加强版

@EnableZuulServer:

@SpringCloudApplication:复合注解,包括:@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker,分别是SpringBoot注解、注册服务中心Eureka注解、断路器注解。对于SpringCloud来说,这是每一微服务必须应有的三个注解,所以才推出了@SpringCloudApplication这一注解集合。

四、其他

在 eureka 体系里面,每个服务既是服务提供者又是服务消费者。

application.yml 与 bootstrap.yml 的区别: bootstrap.yml 优先级 高于 application.yml,且先于 application.yml 加载解析

五、eureka 示例

六、zuul 网关示例

七、hystrix 示例

单体监控

http://localhost:9091/actuator/hystrix.stream

聚合监控

http://localhost:9088/turbine.stream

 

中文图解

问题

一直 Loading ...

这个问题应该和版本有关系

找到本地仓库下orgspringframeworkcloudspring-cloud-netflix-hystrix-dashboard2.2.3.RELEASE

使用winRAR解压spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar,解压后原来的jar不要删除

然后修改	emplateshystrixmonitor.ftlh

主要修改 $(window).load(function() 变为 $(window).on("load", function ()

然后用winRAR打开之前解压的jar,把修改后的文件拖进去替换。

八、网关限流

redis + 令牌桶算法

九、各组件原理

eureka原理

CAP 一致性模式

Eureka的设计原则是AP,即可用性和分区容错性。他保证了注册中心的可用性,但舍弃了数据一致性,各节点上的数据有可能是不一致的(会最终一致)。

ZK的设计原则是CP,即强一致性和分区容错性。他保证数据的强一致性,但舍弃了可用性,如果出现网络问题可能会影响ZK的选举,导致ZK注册中心的不可用。

选举机制

Eureka server集群不存在选举机制,Eureka server集群各节点的关系是对等的,Eureka server通过相互复制来保证高可用性。

概念

Eureka server

Eureka Client

Service Provider

Service Consumer

服务注册

服务续约

服务下线

服务失效剔除

服务信息同步

服务发现

服务信息拉取

自我保护机制

Eureka server 的集群及伸缩容

RestTemplate

RestTemplate是Spring用于同步client端的核心类,简化了与http服务的通信,并满足Restful原则,程序代码可以给它提供URL,并提取结果。

默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

Fegin原理

Feign的源码实现的过程如下:

1、@EnableFeignCleints注解开启FeignCleint

2、根据Feign的规则实现接口,并加@FeignCleint注解

3、程序启动后,会进行包扫描,扫描所有的@FeignCleint的注解的类,并将这些信息注入到ioc容器中

4、当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate

5、RequesTemplate在生成或增强Request

6、Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp

7、最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

Ribbon原理

1.获取@LoadBalanced注解标记的RestTemplate。
2.RestTemplate添加一个拦截器(filter),当使用RestTemplate发起http调用时进行拦截。
3.在filter拦截到该请求时,获取该次请求服务集群的全部列表信息。
4.根据规则从集群中选取一个服务作为此次请求访问的目标。
5.访问该目标,并获取返回结果。

Hystrix运行原理

1、隔离

线程池,服务单独线程调用,互不影响。

2、熔断、降级

熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的。

当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态。

当熔断器开关打开时, 请求被禁止通过。

当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过.;

当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过。

熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待. 并且熔断器能在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能。

//////////////////////////////////////////////////////////

1、构造一个HystrixCommand或HystrixObservableCommand对象
2、执行命令。
3、检查是否已命中缓存,如果命中直接返回。
4、检查断路器开关是否打开,如果打开,直接熔断,走fallback逻辑。
5、检查线程池/队列/信号量是否已满,如果已满,直接拒绝请求,走fallback逻辑。
6、上面条件都不满足,调用HystrixObservableCommand.construct()方法HystrixCommand.run()方法,执行业务逻辑。
7、判断运行业务逻辑方法是否出现异常或者超时,如果出现,直接降级,走fallback逻辑。
8、上报统计数据,用户计算断路器状态。
9、返回结果。

Zuul 请求过程

在zuul中, 整个请求的过程是这样的,首先将请求给zuulservlet处理,zuulservlet中有一个zuulRunner对象,

该对象中初始化了RequestContext:作为存储整个请求的一些数据,并被所有的zuulfilter共享。

zuulRunner中还有 FilterProcessor,FilterProcessor作为执行所有的zuulfilter的管理器。

FilterProcessor从filterloader 中获取zuulfilter,而zuulfilter是被filterFileManager所加载,并支持groovy热加载,采用了轮询的方式热加载。

有了这些filter之后,zuulservelet首先执行的Pre类型的过滤器,再执行route类型的过滤器,最后执行的是post 类型的过滤器,

如果在执行这些过滤器有错误的时候则会执行error类型的过滤器。

执行完这些过滤器,最终将请求的结果返回给客户端。

参考资料:

Spring Cloud中文网

Spring Cloud Netflix

拜托!面试不要再问我Spring Cloud底层原理

基于SpringBoot和SpringCloud实现微服务架构

SpringCloud简介与5大常用组件

Spring Cloud在国内中小型公司能用起来吗?

spring cloud 快速搭建

使用springboot、springcloud搭建java分布式项目,集成mybatis、通用mapper等技术实现

搭建SpringCloud项目,并实现自动化部署

SpringCloud-容错处理Hystrix熔断器(五)

SpringCloud组件之Zuul

SpringCloud Zuul 路由映射规则配置

带你入门SpringCloud 之 服务网关 Zuul

SpringCloud 服务网关 Zuul 自定义路由和排除路由配置

spring-cloud-get-started

intomylife - SpringCloud

intomylife - SpringCloud - git

Spring Boot Actuator:健康检查、审计、统计和监控

spring-boot-starter-actuator与应用监控

【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 使用Spring Boot Actuator和Hystrix Dashboard可视化监控数据

微服务之Hystrix Dashboard监控平台的搭建

解决Hystrix Dashboard 一直是Loading ...的情况

搭建Hystrix Dashboard一直加载不出

SPRINGBOOT2.2.X, HYSTRIX-DASHBOARD监控页面一直显示LOADING的问题

spring boot集成Feign时Hystrix Dashboard 2.2.3问题解决

Turbine集群监控

spring cloud 聚合监控Turbine

声明性REST客户端Feign

Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析

Hystrix介绍

Hystrix-限流及其实战

SpringCloud之Hystrix断路器(熔断、限流、降级、超时监控)

marcosbarbero/spring-cloud-zuul-ratelimit

SpringCloud-Zuul高并发请求下的限流处理

zuul开发实战(限流,超时解决)

SPRING CLOUD微服务安全实战_4-10_用SPRING-CLOUD-ZUUL-RATELIMIT做限流

SpringCloud使用Zuul限流(zuul+ratelimit)

SpringCloud之Eureka高可用

SpringCloud(三)Eureka注册中心实现高可用

原理源码

SpringCloud-Eureka原理解析

SpringCloud Eureka架构原理及源码分析

eureka原理分析

SpringCloud-Eureka原理解析

spring-cloud-feign源码深度解析

Feign源码解析

Ribbon源码分析系列(一)

Spring Cloud Ribbon源码分析

从源码看hystrix的工作原理

Hystrix原理与实战

Hystrix运行原理

【一起学源码-微服务】Hystrix 源码三:Hystrix核心流程:Hystix降级、熔断等原理剖析

Spring cloud微服务架构-Hystrix工作原理(微服务故障熔断)

深入理解Zuul之源码解析

SpringCloud中24个很重要的Starter

application.yml与bootstrap.yml的区别

原文地址:https://www.cnblogs.com/wangwangfei/p/10705301.html