Spring Cloud学习笔记

微服务介绍

微服务(不是一个框架 而是一种架构思想),是著名的 oo (面向对象, ObjectOriented )专家 Martin Fowler 提出来的,它是用来描述将软件应用程序设计为独立部署的服务的种特殊方式。最近两年,微服务在各大技术会议、文章、书籍上出现的频率已经让人意识到它对于软件领域所带来的影响力。微服务架构的系统是个分布式系统,按业务领域划分为独立的服务单元,有自动化运维、容错、快速演进的特点,它能够解决传统单体架构系统的痛点,同时也能满足越来越复杂的业务需求。
在应用的初始阶段,单体架构无论是在开发速度、运维难度上,还是服务器的成本上都有着显著的优势。在一个产品的前景不明确的初始阶段,用单体架构是非常明智的选择。随着应用业务的发展和业务复杂度的提高,这种架构明显存在很多的不足,主要体现在以下 3 个方面:
1 . 业务越来越复杂,单体应用的代码量越来越大,代码的可读性、可维护性和可扩展性下降,新人接手代码所需的时间成倍增加,业务扩展带来的代价越来越大。
2. 随着用户越来越多,程序承受的并发越来越高,单体应用的并发能力有限。
3. 测试的难度越来越大,单体应用的业务都在同个程序中,随着业务的扩张、复杂度的增加,单体应用修改业务或者增加业务或许会给其他业务带来定的影响,导致测试难度增加。
什么是微服务呢br> 就是将一个大的应用,拆分成多个小的模块,每个模块都有自己的功能和职责,每个模块可以进行交互,这就是微服务
对于微服务,业界没有严格统一的定义,但是作为“微服务”这名词的发明人, Martin Fowler对微服务的定义似乎更具有权威性和指导意义,他的理解如下:
简而言之,微服务架构的风格,就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级通信机制,通常是HTTP RESTFUL API 。这些服务围绕业务能力来划分构建的,并通过完全自动化部署机制来独立部署这些服务可以使用不同的编程语言,以及不同数据存储技术,以保证最低限度的集中式管理。

总结出微服务的特点

1 . 按业务(功能)划分为一个独立运行的程序,即服务单元。
2. 服务之间通过 HTTP 协议相互通信。 http 是一个万能的协议 (web 应用都支持的模式)
3. 自动化部署。
4. 可以用不同的编程语言。
5. 可以用不同的存储技术。
6. 服务集中化管理。
7. 微服务是一个分布式系统。

微服务的不足(正视它的不足)

凡事都有两面性,微服务也不例外,微服务相对于单体应用来说具有很多的优势,当然也有它的不足,主要体现在如下方面:
1 . 微服务的复杂度
2. 分布式事务问题
3. 服务的划分(按照功能划分 还是按照组件来划分呢) 分工
4 . 服务的部署(不用自动化部署 自动化部署)

SpringCloud简介

Spring Cloud 作为 Java 语言的微服务框架,它依赖于 Spring Boot,有快速开发、持续交付和容易部署等特点。 Spring Cloud的组件非常多,涉及微服务的方方面面,井在开源社区 Spring 和 Netflix、 Pivotal 两大公司的推动下越来越完善,如今 alibaba 也加入到其中。 spring 官方 netflix alibaba Spring Cloud 在开发部署上继承了 Spring Boot 的一些优点,提高其在开发和部署上的效率。 Spring Cloud的首要目标就是通过提供一系列开发组件和框架,帮助开发者迅速搭建一个分布式的微服务系统。 Spring Cloud 是通过包装其他技术框架来实现的,例如包装开源的 Netflix oss 组件,实现了一套通过基于注解、 Java 配置和基于模版开发的微服务框架。 Spring Cloud 提供了开发分布式微服务系统的一些常用组件,例如服务注册和发现、配置中心、熔断器、远程调用,智能路由、微代理、控制总线、全局锁、分布式会话等。

SpringCloud 常用组件表

服务的注册和发现。(eureka, nacos, consul)
服务的负载均衡。 (ribbon, dubbo)
服务的相互调用。(openFeign, dubbo)
服务的容错。(hystrix, sentinel)
服务网关。(gateway, zuul)
服务配置的统一管理。(config-server, nacos, apollo)
服务消息总线。 (bus)
服务安全组件。 (security, Oauth2 . 0)
服务监控。 (admin) (jvm)
链路追踪。 (sleuth+zipkin)
SpringCloud 就是微服务理念的一种具体落地实现方式,帮助微服务架构提供了必备的功能
目前开发中常用的落地实现有三种:

  • Dubbo+Zookeeper 半自动化的微服务实现架构 (别的管理没有)
  • SpringCloud Netflix 一站式微服务架构
  • SpringCloud Alibaba 新的一站式微服务架构

Spring Cloud Eureka 简介

注册发现中心
在软件领域, Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被 Spring Cloud 社区整合为 Spring Cloud Netflix 模块。Eureka 是 Netflix 贡献给 Spring Cloud 的一个框架! Netflix 给 Spring Cloud 贡
献了很多框架。

什么是 CAP原则

在分布式 微服务里面 CAP 定理
问:为什么 zookeeper 不适合做注册中心br> CAP 原则又称 CAP 定理,指的是在一个分布式系统中,
一致性(Consistency)
可用性(Availability)
分区容错性(Partition tolerance)(这个特性是不可避免的)
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
C : 数据的一致性 (A, B, C 里面的数据是一致的)
Zk 注重数据的一致性。
Eureka 不是很注重数据的一致性!
A: 服务的可用性(若 zk 集群里面的 master 挂了怎么办) Paxos(多数派)
在 zk 里面,若主机挂了,则 zk 集群整体不对外提供服务了,需要选一个新的出来(120s左右)才能继续对外提供服务!
Eureka 注重服务的可用性,当 Eureka 集群只有一台活着,它就能对外提供服务
P:分区的容错性(在集群里面的机器,因为网络原因,机房的原因,可能导致数据不会里面同步),它在分布式必须需要实现的特性!
Zookeeper 注重数据的一致性, CP zk(注册中心,配置文件中心,协调中心)
Eureka 注重服务的可用性 AP eureka (注册中心)

pom.xml配置文件:

Ribbon 概述

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 NetflixRibbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。 轮询 hash 权重 . . .
简单的说 Ribbon 就是 netfix 公司的一个开源项目,主要功能是提供客户端负载均衡算法和服务调用。 Ribbon 客户端组件提供了一套完善的配置项,比如连接超时,重试等。
在 Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器,有两种使用方式,一种是和 RestTemplate 相结合,另一种是和 OpenFeign 相结合。 OpenFeign 已经默认集成了 Ribbon。 Ribbon 有很多子模块,但很多模块没有用于生产环境 !
负载均衡
负载均衡,英文名称为 Load Balance(LB) http : // lb : //(负载均衡协议) ,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如 Web 服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

Ribbon 负载均衡的实现和几种算法

1 . RoundRobinRule- -轮询 请求次数 % 机器数量
2 . RandomRule- -随机
3 .权重
4. iphash
3 .AvailabilityFilteringRule – -会先过滤掉由于多次访问故障处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对于剩余的服务列表按照轮询的策略进行访问
4.WeightedResponseTimeRule- -根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则
5 . RetryRule- – 先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务
6 . BestAvailableRule – -会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量小的服务
7 . ZoneAvoidanceRule – – 默认规则,复合判断 Server 所在区域的性能和 Server 的可用行选择服务器。
Ribbon 默认使用哪一个负载均衡算法:
ZoneAvoidanceRule :区间内亲和轮询的算法!通过一个 key 来区分

Ribbon 总结(后面的代码中 不会出现 ribbon)

Ribbon 是客户端实现负载均衡的远程调用组件,用法简单
Ribbon 源码核心:
ILoadBalancer 接口:起到承上启下的作用
1 . 承上:从 eureka 拉取服务列表
2 . 启下:使用 IRule 算法实现客户端调用的负载均衡
设计思想:每一个服务提供者都有自己的 ILoadBalanceruserService- – -》客户端有自己的 ILoadBalancerTeacherService- – -》客户端有自己的 ILoadBalancer
在客户端里面就是 Map iLoadBalancersMap iLoadBalancers 消费者端服务提供者的名称 value (服务列表 算法规则 )

上面我们讲到 Ribbon 做了负载均衡,用Eureka -Client来做服务发现,通过RestTemplate 来完成服务调用,但是这都不是我们的终极方案,终极方案是使用 OpenFeign

OpenFeign 简介

https : //docs . spring . io/spring- cloud -openfeign/docs/2 . 2 . 4 . RE LEASE/reference/html/#spring- cloud -feign
Feign 是声明性(注解)Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign,请创建一个接口并对其进行注解。它具有可插入注解支持,包括 Feign 注解和 JAX- RS 注解。
Feign 还支持可插拔编码器和解码器。 Spring Cloud 添加了对 Spring MVC 注解的支持,并支持使用 HttpMessageConverters, Spring Web 中默认使用的注解。 Spring Cloud 集成了 Ribbon 和 Eureka 以及 Spring Cloud LoadBalancer,以在使用 Feign 时提供负载平衡的 http 客户端。
Feign 是一个远程调用的组件 (接口,注解) http 调用的。
Feign 集成了 ribbon ribbon 里面集成了 eureka

Spring Cloud Hystrix 简介

熔断器,也叫断路器!(正常情况下 断路器是关的 只有出了问题才打开)用来保护微服务不雪崩的方法。思想和我们上面画的拦截器一样。
Hystrix 是 Netflix 公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现联动故障。 Hystrix 是通过隔离服务的访问点阻止联动故障的,并提供了故障的解决方案,从而提高了整个分布式系统的弹性。

Spring Cloud Gateway 简介

你们项目里面 用的什么网关gateway zuul
它是 Spring Cloud 官方提供的用来取代 zuul(netflix)的新一代网关组件
(zuul: 1 .0 , 2.0 , zuul 的本质,一组过滤器,根据自定义的过滤器顺序来执行,本质就是web 组件 web 三大组件(监听器 过滤器 servlet) 拦截 springmvc)
Zuul1 . 0 使用的是 BIO(Blocking IO) tomcat7 . 0 以前都是 BIO 性能一般
Zuul2 . 0 性能好 NIO
AIO 异步非阻塞 io a+nio = aio = async + no blocking io
它基于 spring5.x, springboot2 . x 和 ProjectReactor 等技术。
它的目地是让路由更加简单,灵活,还提供了一些强大的过滤器功能,例如:熔断、限流、重试,自义定过滤器等 token 校验 ip 黑名单等
SpringCloud Gateway作为 Spring Cloud生态的网关,目标是替代Zuul,在 SpringCloud2.0以上的版本中,没有对新版本的 zuul2.0以上的最新高性能版本进行集成,仍然还是使用的zuul1 .x[可以看项目依赖找到 ]非 Reactor 模式的老版本。而为了提升网关的性能,SpringCloud Gateway 是基于 webFlux 框架实现的,而 webFlux 框架底层则使用了高性能的 Reactor 模式通信框架的 Netty
NIO(非阻塞式 io) BIO 你只需要了解网关能做什么网关里面写什么代码就可以了

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91280 人正在系统学习中

来源:mingshengda

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年6月28日
下一篇 2022年6月28日

相关推荐