微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringCloud

Spring Cloud

Spring Cloud是一个服务治理平台(微服务框架),提供了一些服务框架。包含:服务注册与发现、配置中心、消息中心、负载均衡、数据监控等。

Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台及Spring Boot框架的集成。

常用组件:

Spring Cloud Netflix Eureka:服务注册中心。

Spring Cloud Netflix Ribbon:客户端负载均衡。

Spring Cloud Netflix Hystrix:服务容错保护。

Spring Cloud Netflix Feign:声明式服务调用

Spring Cloud Netflix OpenFeign: OpenFeign是Spring Cloud在Feign基础上支持Spring MVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析Spring MVC的@RequestMapping注解下的接口。

Spring Cloud Netflix Zuul:API网关服务、过滤、安全、监控、限流、路由。

Spring Cloud Netflix Gateway:

Spring Cloud Netflix Config:

Spring Cloud Netflix Stream:

Spring Cloud Netflix Sleuth:

Spring Cloud Netflix Alibaba:

Eureka服务注册中心

服务注册中心是服务实现服务化管理的核心组件,只要用来存储服务信息等。

服务注册中心的作用就是服务的注册和服务的发现。

 

常见的注册中心:

Netflix Eureka、Alibab Nacos、HashCorp Consul、Apache Zookeeper、CoreOS Etcd、CNCF coredns

 

注册中心解决了什么问题:1.服务管理 2.服务的依赖关系管理。

Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在子项目Spring Cloud Netflix中,实现Spring Cloud的服务注册与发现,同时还提供了负载均衡、故障转移等能力。

Eureka注册中心三种角色:

 

Eureka Server:通过Register、Get、Renew等接口提供服务的注册和发现。

Server Provider:服务提供方,把自身的服务实例注册到Eureka Server中。

Server Consumer:服务调用方,通过Eureka Server获取服务列表,消费服务。

 

Server Consumer的3中服务调用实现方式:

discoveryClient:通过元数据获取服务信息。

LoadBalancerClient:Ribbon的负载均衡器

@LoadBalanced:通过注解开启Ribbon的负载均衡器。

Eureka构架原理

 

Register(服务注册):把自己的ip和port注册给Eureka。

Renew(服务续约):发送心跳包,每30S发送一次,告诉Eureka自己还活着,如果90S未发送心跳,宕机。

Cancel(服务下线):当Provider关闭时,会向Eureka发送消息,把自己移除服务列表。

Get Register(获取服务注册列表):获取其他服务列表。

Replicate(集群中数据同步):Eureka集群中的数据复制与同步。

Make Remote Call(远程调用):完成服务的远程调用

 

CAP原则:

Eureka自我保护

启动自我保护条件:一般情况下,服务在Eureka上注册后,每隔30S发送一个心跳包,Eureka通过心跳来判断服务是否健康,同时会定期删除超过90S没有发送心跳包的服务。

两种情况导致Eureka Server 收不到微服务的心跳:

  1. 微服务自身的原因。2.微服务与Eureka之间的网络故障。

自我保护模式:Eureka Server在运行期间会统计心跳失败比例在15分钟之类是否低于85%,如果低于85%,Eureka Server会将这些实例保护起来,让这些实例不会过期,同时提供一个警告。这种算法叫做Eureka Server的自我保护模式。

 

为什么要自我保护:

因为同时保留“好数据”和“坏数据”总比没有任何数据好,当网络恢复后,这个Eureka节点会退出“自我保护模式”。

Eureka还有客户端缓存功能(微服务的缓存功能)。即使Eureka集群中所有节点都宕机失效,微服务的Provider和Consumer都能正常通信。

微服务的负载均衡策略会自动剔除死亡的微服务节点。

如何关闭自我保护:

Eureka优雅停服

配置了优雅停服后,将不需要Eureka Server中配置关闭自我保护。代码中使用actuator实现。

Eureka安全认证

需要修改访问集群节点的url。

 

过滤CSRF

Eureka会自动化配置CSRF服务机制,Spring Security认为POST、POST、PUT、DELETE http methods 都是有风险的,如果这些method发送过程中没有带上CSRF token的话,会被拦截拦截并返回403 forbidden.

Ribbon

Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的。

它不像Spring Cloud服务注册中心、配置中心等独立部署,但是它几乎存在于每个Spring Cloud微服务中。包括Feign提供的声明式服务调用也是基于Ribbon实现的。

集中式负载均衡(服务器负载均衡):即在consumer和provider之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责访问请求通过某种策略转发置provider。

进程内负载均衡(客户端负载均衡):将负载均衡逻辑集成到consumer,consumer从服务注册中心获知有哪些地址可用,然后自己在从这些地址中选择一个合适的provider。Ribbon属于后者,它只是一个类库,集成于consumer进程,consumer通过它来获取provider的地址。            

集中式负载均衡:

 

进程式负载均衡:

 

Ribbon负载均衡策略:

  1. 轮询策略
  2. 权重轮询策略
  3. 随机策略
  4. 最少并发数策略
  5. 重试策略
  6. 可用性敏感策略
  7. 区域敏感性策略

Ribbon负载均衡设置:

1.全局。在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。

 

  1. 局部。修改配置文件指定服务的负载均衡策略。

 

Ribbon点对点直连

点对点直连是指绕过注册中心,直接连接服务提供者获取服务,一般在测试阶段使用较多。

Consul

用于实现分布式系统的服务发现与配置。

特性:1.Raft算法  2.服务发现  3.健康检查  4.Key/Value存储  5.多数据中心  6.支持http和dns协议接口  7.官方提供web管理界面。

Consul角色:

client:客户端,无状态,将HTTP和DNS接口请求转发给局域网内的服务集群。

server:服务端,保存配置信息,高可用集群,每个数据中心的server数据推荐3或5个。

 

上图是一个简单的Consul Cluster架构,Consul Cluster有server和client两种角色。不管是server还是client,统称为Agent, Consul client是相对无状态的,只负责转发RPC到server,资源开销很少。Server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互等。

Consul工作原理:

 

服务发现及注册

当服务Producer启动时,会将自己的IP/host等信息通过发送请求告知Consul,Consul接收到Producer的注册信息后,每隔10S会向Producer发送一个健康检查的请求,检验Producer是否健康。

服务调用

当Consumer请求Producer时,会先向Consul中拿到Producer服务的IP和PORT的临时表(temp table),从temp table表中任选一个Producer的IP和PORT,然后根据这个IP和PORT,发送访问请求;temp table表只包含通过了健康检查的Producer信息,每隔10S更新。

Consul安装:

Eureka其实就是一个Server程序,跑在Servlet容器中;Consul则是用go语言编写的第三方工具,需要单独安装使用。

就只有一个.exe的文件

启动命令:

https://blog.csdn.net/qq_35433926/article/details/96477211

访问后台http://localhost:8500/ui/

Feign声明式服务调用

Feign是Spring Cloud Netflix组件中的一个轻量级RESTFUL 的http服务客户端,实现了负载均衡和Rest调用的开源框架,封装了Ribbon和RestTemplate,实现了webService的面向接口编程

Feign内置了Ribbon,用来做客户端负载均衡调用服务注册中心的服务。

Feign旨在使编写java http客户端变得更加容易,feign简化了RestTemplate代码,实现了Ribbon负载均衡,是代码更加简洁。使用Feign实现负载均衡是首选方案。只需要创建一个接口,然后在上面添加注解即可。

Feign是声明式服务调用组件,其核心是:像调用本地方法一样调用远程方法,无感知远程HTTP请求。

Feign和OpenFeign:

OpenFeign是Spring Cloud在Feign基础上支持Spring MVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析Spring MVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用服务。

Feign的使用主要分为以下几个步骤:

服务消费者添加Feign依赖;

创建业务层接口,添加@FeignClient注释声明需要调用的服务。

业务层抽象方法使用Spring MVC注解配置服务及参数。

启动类添加@EnableFeignClients注解激活Feign组件。

PS:服务消费者通过Eurka注册中心获取服务,或者Ribbon点对点直连模式都可以使用Feign来实现。

Feign负载均衡:

Feign封装了Ribbon自然就集成了负载均衡功能认采用轮询策略。修改方式和Ribbon一样。

Feign性能调优

1.Gzip压缩。

gzip介绍:gzip是一种数据格式,采用deflate算法压缩数据;gzip是一种流行的文本压缩算法

gzip能力:当Gzip压缩一个纯文本文件时,大约可以减少70%以上的文件大小。

gzip作用:网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。

 

HTTP协议关于压缩传输的规定

1.客户端向服务器请求中带有:Accept-Encoding:gzip,defate字段,向服务器表示客户端支持的压缩格式(gzip或deflate),如果不发送该消息头,服务端认是不会压缩的。

2.服务端在收到请求后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型压缩,就会对响应报文压缩之后返回给客户端,并且携带Accept-Encoding:gzip消息头,表示响应报文是根据格式进行压缩的。

3.客户端接收到请求后,先判断是否有Accept-Encoding消息头,如果有,按该格式解压报文。

HTTP连接池

采用HTTP连接池,可以节约dalde3次握手4次挥手,这样能大大提升吞吐量。

Feign的HTTP客户端支持3种框架:HttpURLConnection、HtppClient、OkHttp;认是HttpURLConnection。

传统的HttpURLConnection是jdk自带的,不支持连接池。

HtppClient封装了HTTP的请求头,参数,内容体和响应等等;它不仅使客户端发送HTTP请求变得容易,而且方便了开发人员测试接口;另外高并发大量的请求网络的时候,也是“连接池”提升吞吐量。

请求超时:

Feign的负载均衡底层用的是Ribbon,所以这里的请求超时配置其实就是配置Ribbon.

分布式项目中,服务压力比较大的情况下,可能处理服务的过程需要花费一定的时间,而认情况下请求超时的配置是1S,所以我们需要调整该配置延长请求超时时间。

配置也分为局部和全局。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐