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中服务调用实现方式:
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 收不到微服务的心跳:
- 微服务自身的原因。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负载均衡策略:
- 轮询策略
- 权重轮询策略
- 随机策略
- 最少并发数策略
- 重试策略
- 可用性敏感策略
- 区域敏感性策略
Ribbon负载均衡设置:
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语言编写的第三方工具,需要单独安装使用。
启动命令:
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 举报,一经查实,本站将立刻删除。