1.前言
1.1什么是微服务架构?
在工作和面试中总能听到微服务架构,那么什么是微服务架构呢?
微服务架构通常可以讲是一种架构模式,切记是一种模式。其原理就是它将一个单一应用程序拆分成多个服务模块,每一个模块都有自己的运行进程。服务之间相互协调但是互不干扰。服务之间一般使用轻量级的通信机制进行通信。在开发中,开发人员回根据自己具体业务对服务进行搭建,并且能够独立部署在生产环境中。
1.2什么是微服务?
微服务指的是服务的大小,可以理解成为了解决一个需求的应用程序。
其优缺点如下:
优点:
- 应用小,只干一件一件事。
- 微服务不需要大量开发人员,并且可以使用不同语言。
- 微服务有属于自己的数据库,可以不同
缺点:
- 服务数量大的时候,会造成运维压力大。
- 分布式问题
- 各服务之间通信数据要保持一致
为了统一管理各服务,方便开发,于是就有了SpringCloud。
2.什么是SpringCloud?
SpringCloud是分布式微服务架构下一站解决方案,是各个微服务架构技术的集合体。
其中核心服务分别有:服务治理、注册中心、配置管理、断路器、智能路由、微代理、分布式对话等。
那么SpringCloud中有许多重要组成部分:
- Eureka:服务中心、注册中心
- Hystrix:服务保护框架
- Ribbon:负载均衡
- Feign:基于Ribbon和Hystrix的生命是服务调用组件
- zuul:网管组件,提供智能路由功能
3.Eureka
Eureka细分有EurekaClient、EurekaServer。
EurekaClient:微服务系统中各个微服务,主要于EurekaServer进行交互,在微服务启动之前,EurekaClient会向EurekaServer发送心跳其默认时间味30s,如果说EurekaServer在心跳周期内没有接收到EurekaClient发送的心跳,那么EurekaServer就会将该服务从可用服务清单中移除。
EurekaServer:EurekaServer服务注册中心,主要用于服务注册功能,当微服务启动时,它会将自己的服务注册到EurekaServer注册中心,而EurekaServer维护一个可用服务清单,存储了所有可以使用的服务。
图解:
注册中心:主要提供可用服务清单
服务消费者:从注册中心选择需要的功能服务,并完成自己业务需求
服务提供者:将功能注册到注册中心中,供服务消费者使用。
流程:
-
首先创建一个注册中心EurekaServer。
-
创建服务提供者EurekaClient。会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心;
-
创建服务消费者EurekaClient。并向服务中心注册自己的信息
-
服务消费者会从服务中心拿到服务名单。然后根据HTTP或者消息组件去寻找对应的服务提供者。
4.Ribbon
Ribbon是基于NetfixRibbon实现客户端负载均衡和服务调用的工具。并且基于Http/TCP的客户端负载均衡器,与Eureka一起使用的时候,Ribbon会从服务注册中心(EurekaServer)获取可用服务,然后通过负载均衡方式将其请求分配给多个服务提供者。
扩充:什么是负载均衡?
说了多次负载均衡,肯定许多小伙伴就疑惑了 什么事负载均衡呢?
负载均衡是指系统在处理高并发、缓解网络压力和服务端扩容的一种调节手段。将用户的请求平均分配到每一个服务器哈桑,从而达到网络带宽的扩展,以及增大网络吞吐量,提高处理效率等目的
那么负载均衡实现方式是怎么样的?
负载均衡是一种统称,它也是分客户端和服务端的。
首先服务端负载均衡是在客户端和服务端之间建立的一个独立的负载均衡服务器,这个服务器没有具体要求,根据实际开发情况自行选择。在这个负载均衡服务器中维护了一份可用服务端清单,然后通过心跳机制来删除故障服务端。从而保证清单内所有服务都是可用的。
当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法例如:轮训、随机等。从其维护的可用服务清单中选择一个服务端,然后进行转发。
服务端负载均衡的特点:
- 服务端负载均衡是一个独立的服务器
- 客户端是将请求发送到服务端负载均衡,所以客户端不知道请求具体交给哪个服务端
- 负载均衡服务器还维护着可用服务的服务端
客户端负载均衡
客户端负载均衡是以代码的形式封装在客户端上,客户端通过服务注册中心获取到了可用服务名单,负载均衡才会在客户端发送请求前通过算法选择一服务端进行访问,从而实现负载均衡作用。
重点:客户端负载均衡也是需要心跳机制来维护的服务端清单等有效性,在此过程中需要配合服务注册中心一起完成
客户端负载均衡的特点:
- 以代码形式存在
- 具有心跳机制来维护可用服务名单
- 不知道请求交给了哪个服务器
5.Hystrix
场景:在微服务架构中,一个完整的应用是由多个服务组成的,这些服务就是相互依赖的,并且依赖关系十分复杂。如果一个服务发生故障,那么随之而来的就是其他服务会被阻塞,以此类推。从而出现雪崩效应。
为了解决这个问题,就出现了SpringCloudHystrix,它是一款优秀的服务容错与保护组件,提供了熔断器功能,能够有效地阻止分布式微服务系统中出现的联动故障,以提高微服务系统的弹性,SpringCloudHystrix具有服务降级、服务熔断、线程隔离、请求缓存、请求合并以及实时故障监控等功能
在分布式微服务系统中,Hystrix的作用
-
保护线程资源:防止单个服务的故障而耗尽系统所有线程资源。
-
快速失败机制:当某个服务出现故障的时候,不会让服务调用方一直等待。而是直接返回失败信息。
-
提供降级方法:在请求失败后,提供一个设计好的降级方案。在服务器压力剧增的情况下,根据实际业务需求,对一些不重要的服务进行不处理或者简单处理,从而释放服务器资源供主要服务正常运行。或者当某些服务不用了,避免浪费资源,主动执行备份的降级逻辑立刻范围一个友好提示,保证主要业务不受影响。
-
防止故障扩散:使用熔断机制,防止故障扩散到其他服务。
-
监控功能:提供熔断器故障监控组件Hystrix DashBoard,随时监控熔断器的状态。
6.Feign
Feign是一种声明式服务调用组件,它在RestTemplate的基础上做了进一步的封装,通过Feign,我们只需要声明一个接口并通过注解进行简单的配置。类似于Dao接口上面的Mapper注解一样,即可实现对Http接口的绑定。通过Feign我们可以像调用本地方法一样来调用远程服务。
Feign已经被 open Feign替代了。而OpenFeign是SpringCloud对Feign的第二次封装
OpenFeign 实现了远程调用的功能、以及超时控制、日志打印等功能。
Feign整合了Ribbon,所以一般在客户端做负载均衡。而OpenFegin增加了对SpringMVC的注解如@RequestMapping
等等,OpenFeign的@FeignClient
可以解析SpringMVC的@RequestMapping
注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。