大家好!我是【程序员写荣】,希望接下来可以通过书写博客,使自己的程序员生涯欣欣向荣。这博客通过面试题的形式将各个知识点进行汇总,是对自己学习的一点点总结及记录。
一个应用中包含了应用程序的所有功能(比如:页面、代码、配置等),把应用打成一个war或jar包部署到Tomcat中,通常称为单体应用架构。
微服务是一种架构风格,是以开发一组小型服务的方式来作为一个独立的应用系统,每个服务都运行在自己的进程中,服务之间采用轻量级的HTTP通信机制(通常采用HTTP的RESTful API)进行通信。这些服务都是围绕具体业务进行构建的,并且可以独立部署到生产环境上。这些服务可以用不同的编程语言编写,并且可以使用不同的数据存储技术。对这些微服务我们只需要使用一个非常轻量级的集中式管理来进行协调。
Spring Cloud 是一组技术的集合。基于 Spring Boot 提供了一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件,除了基于 NetFlix 的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
官方:构建分布式系统不用特别的复杂且避免容易出现的错误。Spring Cloud为最常见的分布式系统模式提供了一个简单和可访问的编程模式,帮助开发人员构建弹性、可靠和协调的应用程序。Spring Cloud 构建在 Spring Boot 之上,使开发人员很容易开始工作并迅速提高生产力。
Could代号 | Boot版本 |
---|---|
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
最稳定版本:Finchley SR2,搭配 Spring Boot 2.0.7
GA:General Availability,正式发布的版本,官方推荐使用本版本。在国外都是用GA来说明 RELEASE 版本的。
PRE:预览版,内部测试版。主要是给开发人员和测试人员找bug用的,不建议使用。
SNAPSHOT:快照版,可以稳定使用,且仍在继续改进版本。
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端模板工具集,提供了多种便捷访问远程 HTTP 服务的方法,简化了与 HTTP 服务的通信,并满足 RestFul 原则,程序代码可以给它提供 URL,并提取结果,能够大大提高客户端的编写效率。
RestTemplate 和 HttpClient 都是处理 HTTP 客户端工具,其中RestTemolate内部内置消息转化器,在一定程度上减少代码开发,例如 MappingJackson2HttpMessageConverter 将 json 格式数据转换为具体对象,如果使用 HttpClient,还需要手动将 json 数据转换为具体对象。
Spring Cloud 中提供服务注册中心来管理服务信息。
轮询算法:向 Eureka Server 发送心跳(默认周期是30秒)。服务端在多个心跳周期内没有接受到某个节点的心跳,服务端就会从服务注册中心吧这个服务节点删除(默认周期90秒)。
微服务数量众多,要进行远程调用就需要知道服务端的 ip 地址和端口号,注册中心帮助我们管理这些服务的 ip 和端口。
微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列表,客户端获取到可用的服务进行调度。
Spring Cloud Eureka 是对 Netflix 公司的 Eureka 的二次封装,它实现了服务治理的功能,Spring Cloud Eureka 提供 Eureka Server 服务端与 Eureka Client 客户端,服务端即是 Eureka 服务注册中心,客户端完成微服务向 Eureka 服务的注册与发现。
客户端同时具备一个内置的使用轮询负载算法的负载均衡器。在微服务启动后,将会向 Eureka Server 发送心跳(默认周期是30秒)。如果 Eureka Server 在多个心跳周期内没有接受到某个节点的心跳,Eureka Server 将会从服务注册表中吧这个服务节点移除(默认周期90秒)。
当 Eureka Server 在一定时间内(默认90秒)没有接受到某个微服务的心跳,Eureka Server 会从服务列表将此服务实例注销。但是如果出现网络异常情况(微服务本身是正常的),微服务与 Eureka Server 之间无法正常通信,以上行为可能变的非常危险了,因为微服务本身其实是正常的,此时本不应该注销这个微服务。
Eureka Server 有一种自我保护模式来解决这个问题。当 Eureka Server 在短时间内丢失过多客户端是(可能发生了网络故障),此时 Eureka Server 会进入自我保护模式,一旦进入该模式,Eureka Server 就会保护服务注册表的信息,不在删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该 Eureka Server 会自动退出自我保护模式。
所以,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有的微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让 Eureka 集群更加的健壮、稳定。
为了避免 Eureka Server 的失效, Eureka Server 高可用环境需要部署两个及以上 Eureka Server,它们互相向对方注册。微服务需要连接两台 Eureka Server 服务注册中心,其中一台 Eureka 死掉也不会影响服务的注册与发现。
服务端负载均衡是我们处理高并发、缓解网络压力和进行服务端扩容的重要手段之一,简单地说就是将用户的请求平摊的分配到多个服务商,从而实现系统的高可用性集群。服务端负载均衡服务器为为两种。一种是通过硬件实现的负载均衡服务器,简称硬负载例如:F5。一种是通过软件来实现的负载均衡,简称软负载例如:Apache 和 Nginx。应付在和软负载相比前者作用的网络层次比较多可以作用到 Socket 接口的数据链路层对发出的请求进行分组转发但是价格成本比较贵,而软负载作用的层次在 HTTP 协议层之上可以对 HTTP 请求进行分组转发并且因为是开源的所以几乎是0成本。
无论是硬件负载均衡还是软件负载均衡都会维护一份可用的服务端清单,然后通过心跳机制来删除故障的服务端节点以保证清单中都是可以正常访问的服务端节点,此时当客户端的请求到达负载均衡服务器时,负载均衡服务器按照某种配置好的规则(负载均衡算法有:轮询、随机、加权轮询、加权随机、地址哈希等方法)从可用服务端清单中选出一台服务器去处理客户端的请求。所以负载均衡可以为微服务集群分担请求,降低系统的压力。
Spring Cloud Ribbon 是基于 Netflix 公司发布的开源项目 Ribbon 进行封装的一套客户端负载均衡器。
Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当我们将Ribbon和Eureka一起使用时,Ribbon会从Eureka注册中心去获取服务端列表,然后进行轮询访问以到达负载均衡的作用,客户端负载均衡中也需要心跳机制去维护服务端清单的有效性,当然这个过程需要配合服务注册中心一起完成。
客户端负载均衡和服务端负载均衡最大的区别是服务清单所存储的位置。在客户端负载均衡中,每个客户端服务都有一份自己要访问的服务端清单,这些清单统统都是从 Eureka 服务注册中心获取的。而在服务端负载均衡中,只要负载均衡器维护一份服务端列表。
Feign 是 Netflix 公司开源的轻量级 Rest 客户端,使用 Feign 可以非常方便、简单的实现 HTTP 客户端。Spring Cloud 对 Feign 进行了封装, Feign 默认继承了 Ribbon 实现了客户端负载均衡调用。
Feign 通过接口的方法调用Rest服务,请求发送给 Eureka 服务器,通过 Feign 直接找到服务接口,因为继承了 Ribbon 技术,Feign 自带负载均衡配置功能。
SpringCloud对Feign进行了增强兼容了SpringMVC的注解 ,我们在使用SpringMVC的注解时需要注意:
Hystrix 是 Netflix 公司开源项目,实现了熔断器模型,Spring Cloud 对这一组件进行了整合。
在微服务架构中,根据业务来拆分成一个个的服务,而服务于服务之间存在着依赖关系(比如用户调商品、商品调库存、库存调订单等等),在 Spring Cloud 中多个微服务之间可以用 RestTemplate + Ribbon 和 Fegin 来调用。
在服务之间调用的链路上由于网络原因、资源繁忙或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,导致响应时间过长或不可用,此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的后果,这就是服务故障的“雪崩”效应。为了解决这个问题,业界踢出了熔断器模型。
熔断机制是应对雪崩效应的一种微服务链路保护机制。在微服务中,衣蛾请求需要调用多个服务是非常常见的。
当服务之间调用的链路上某个微服务不可用或者响应时间太长时,会导致连锁故障。当失败的调用带一定阈值(缺省是5秒内20次调用失败)就会启动熔断机制。在 Spring Cloud 框架里熔断机制通过 Hystrix 实现,Hystrix 会监控微服务间调用的状况。熔断器打开后,可用避免连锁故障 fallback 方法可以直接返回一个固定值。
除了隔离依赖服务的调用以外,Hystrix 还提供了准实时的调用监控(Hystrix Dashboard),Hystrix 会持续地记录所有通过 Hystrix 发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括美妙执行多少请求多少成功,多少失败等。
Netflflix 通过 hystrix-metrics-event-stream 项目实现了对以上指标的监控。Spring Cloud也提供了 Hystrix Dashboard 的整合,对监控内容转化成可视化界面。
Zuul 是 Netflix 公司开源项目,Zuul 包含了对请求路由和校检过滤两个最主要的功能:
Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过 Zuul 跳转后获得。注意:Zuul 服务最终还是会注册进 Eureka。
自定义过滤器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的4个方法:
在分布式微服务架构中,由于服务数量很多,使得有很多配置文件,在更新配置文件时很麻烦。我们每个微服务自己带着一个 application.yml,上百个配置文件的管理起来就很麻烦,所以一套集中地、动态的配置管理功能是必不可少的,在 Spring Cloud 中,有分布式配置中心组件 Spring Cloud Config 来解决这个问题。
Spring Cloud Config 为微服务架构中的微服务提供集中式的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
Spring Cloud Config 分为服务端与客户端两个部分:
服务端 config server:也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密、解密信息等访问接口。配置服务器官方推荐采用 Git 来存储配置信息,这样就有助于对环境配置进行版本管理,并且可通过 Git 客户端工具来方便的管理与访问配置信息。
客户端 config client:通过制定的服务端来管理服务的资源,以及与业务相关的配置内容,并在启动的时候从服务器端获取和加载配置信息。
application.yml 是用户级别的配置项,bootstrap.xml 是系统级别的配置项,优先级更高
Spring Cloud 会创建一个 Bootstrap Context,Bootstrap Context 会负责从外部资源加载配置属性并解析配置;Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。
当我们更新 Github 中的配置文件内容后,Config客户端服务是否会及时更新的配置内容呢?
如果希望在不重启微服务的情况下更新配置如何来实现呢?我们是用 Spring Cloud Bus 来实现配置的自动更新。
Spring Cloud Bus 被国内很多都翻译为消息总线,大家可以把它理解为管理和传播所有分布式项目中的消息即可,其实本质是利用了 MQ 的广播机制在分布式的系统中传播消息,目前常用的有 Kafka 和 RabbitMQ。利用 Bus 的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。Spring Cloud Bus 做配置跟新的步骤:
Postman 是款强大网页调试的 windows 客户端工具,提供功能强大的 Web API & HTTP 请求调试。软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。Postman 中文版能够发送任何类型的 HTTP 请求(GET、DELETE、POST、PUT…),附带任何数量的请求参数。
非常感谢您的阅读!如果文章有书写错误或不清楚的地方,希望您评论指出,我将第一时间改正。如果您喜欢这篇文章的话,请你点赞和评论,如果您还能点击收藏,那就是对我最大的鼓励!