近期对springcloud进行了一个小案例的学习。效果图如下:
项目结构是前后端分离,前端使用的是layui框架,后端使用的是Spring Cloud 它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路
由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括
Netflflix
Eureka
:注册中心
Zuul
:服务网关
Ribbon
:负载均衡
Feign
:服务调用
Hystrix
:熔断器
其中项目搭建的时候需要注意导包和注解的使用,相信各位在晚上都能找到对应的demo。
这里我就讲一下这些组件的概念和作用
Eureka:注册中心
简单说一下我自己的理解:什么要使用Eureka ?因为微服务就是把许多模块拆分,各司其职,但不免有些业务各各服务间需要相互访问,
如果没有Eureka,访问起来写的代码非常麻烦不好维护,有了Eureka后代码简洁易懂,好维护。
Eureka
就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉
Eureka
,然后
Eureka
会把符合你需求的服务告诉你。
同时,服务提供方与
Eureka
之间通过
“
心跳
”
机制进行监控,当某个服务提供方出现问题,
Eureka
自然会把它从服
务列表中剔除。
这就实现了服务的自动注册、发现、状态监控。
配置好后访问:
http://localhost:10866/ 10866是配置文件里自定义的port ,图片中红色框里面是已注册的服务信息。
负载均衡
Ribbon
但是实际环境中,我们往往会开启很多个
user-service
的集群。此时我们获取的服务列表中就会有多个,到底该访
问哪一个呢?
一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择。
Ribbon
默认的负载均衡策略是简单的轮询,
SpringBoot
也帮我们提供了修改负载均衡规则的配置入口:
user-service
:
ribbon
:
NFLoadBalancerRuleClassName
:
com.netflix.loadbalancer.RandomRule
格式是:
{
服务名称
}.ribbon.NFLoadBalancerRuleClassName
,值就是
IRule
的实现类。
配置后发现结果变成了随机
Hystrix:熔断器
Hystix
是
Netflflix
开源的一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败。
微服务
I
发生异常,请求阻塞,用户请求就不会得到响应,则
tomcat
的这个线程不会释放,于是越来越多的
用户请求到来,越来越多的线程会阻塞
服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成
雪崩效应。
这就好比,一个汽车生产线,生产不同的汽车,需要使用不同的零件,如果某个零件因为种种原因无法使用,那么
就会造成整台车无法装配,陷入等待零件的状态,直到零件到位,才能继续组装。 此时如果有很多个车型都需要这
个零件,那么整个工厂都将陷入等待的状态,导致所有生产都陷入瘫痪。一个零件的波及范围不断扩大
Hystrix
解决雪崩问题的手段,主要包括:
线程隔离
服务降级
解读:
Hystrix
为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加
速失败判定时间。
用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超
时,则会进行降级处理,什么是服务降级?
服务降级:可以优先保证核心服务。
用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回
友好的提示信息) 。
服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它
服务没有响应。
触发
Hystrix
服务降级的情况:
线程池已满
请求超时
服务降级:及时返回服务调用失败的结果,让线程不因为等待服务而阻塞
要注意;因为熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明。
失败逻辑中返回
User
对象没有太大意义,一般会返回友好提示。所以把
queryById
的方法改造为返回
String
,
反正也是
Json
数据。这样失败逻辑中返回一个错误说明,会比较方便。
在服务熔断中,使用的熔断器,也叫断路器,其英文单词为:
Circuit Breaker
熔断机制与家里使用的电路熔断原理
类似;当如果电路发生短路的时候能立刻熔断电路,避免发生灾难。在分布式系统中应用服务熔断后;服务调用方
可以自己进行判断哪些服务反应慢或存在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。
Hystrix
的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续
请求直接拒绝,一段时间(默认
5
秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打
开,拒绝请求的服务。
状态机有
3
个状态:
Closed
:关闭状态(断路器关闭),所有请求都正常访问。
Open
:打开状态(断路器打开),所有请求都会被降级。
Hystrix
会对请求情况计数,当一定时间内失败请求
百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是
50%
,请求次数最少不低于
20
次。
Half Open
:半开状态,不是永久的,断路器打开后会进入休眠时间(默认是
5S
)。随后断路器会自动进入半
开状态。此时会释放部分请求通过,若这些请求都是健康的,则会关闭断路器,否则继续保持打开,再次进
行休眠计时
Feign:服务调用
Feign
可以把
Rest
的请求进行隐藏,伪装成类似
SpringMVC
的
Controller
一样。你不用再自己拼接
url
,拼接参数等
等操作,一切都交给
Feign
去做。
如:
@
FeignClient
(
"user-service"
)
public interface UserClient
{
@
GetMapping
(
"/user/{id}"
)
User queryById
(
@
PathVariable
(
"id"
)
Long id
);
}
@RestController
@RequestMapping
(
"/cf"
)
public class
ConsumerFeignController
{
@Autowired
private
UserClient userClient
;
@GetMapping
(
"/{id}"
)
public
User queryById
(
@PathVariable
Long
id
){
return
userClient
.
queryById
(
id
);
}
}
至此:springcloud 主要的一些内容讲完,如有遗漏欢迎指出。