SpringCloud
1. 微服务介绍
微服务架构, 就是将应用拆分成非常小的服务,每个服务都是一个可以独立运行的项目。其主要特点如下:
- 单一职责:每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
一旦采用微服务系统架构,就势必会遇到这样几个问题:
- 这么多小服务,如何管理他们? 服务治理(电话本)
- 这么多小服务,他们之间如何通讯? http协议(打电话)
- 这么多小服务,客户端怎么访问他们? 服务网关(保安)
对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。
SpringCloud
微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。
目前最知名的就是SpringCloud
和SpringCloud Alibaba
- SpringCloud:Spring基于NetFlix微服务组件进行封装,提供微服务一站式解决方案
- SpringCloud Alibaba:在SpringCloud NetFlix基础上封装了阿里巴巴的微服务解决方案
2. 服务治理 - Eureka
2-1. 服务治理
服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化服务注册与服务发现。
- 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
- 服务发现: 服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。
服务注册:每个服务实例会把自己的IP地址,服务名称等信息注册到注册中心。
服务发现:当服务实例需要进行服务间的调用时,会查询注册中心获取其它服务的网络位置,找到后就可以进行调用。
服务续约:服务实例在注册完毕后会定期向注册中心发送心跳消息,这个过程被称作服务续约。
服务剔除:注册中心在一定时间内没有收到服务实例的心跳消息,那么就会认为这个服务实例已经失效,进行服务剔除。
2-2. 负载均衡
负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元上进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。
客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。
开启负载均衡
负载均衡原理总结
- 在RestTemplate上添加了
@LoadBalanced
注解后,会使用LoadBalancerClient
来配置RestTemplate - Spring Cloud Ribbon 的自动配置类LoadBalancerAutoConfiguration中的
@ConditionalOnBean(LoadBalancerClient.class)
条件成立 - 自动配置中添加了LoadBalancerInterceptor,这个拦截器会拦截请求,通过服务ID获取服务的地址列表,然后通过负载均衡策略选出一个地址进行调用
负载均衡策略
负载均衡的规则都定义在IRule接口中,它有很多不同的实现类,分别代表不同规则
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。第一次到8081,第二次就到8082,第三次又到8081,第四次又到8082… |
AvailabilityFilteringRule | 可用过滤规则,其实它功能是先过滤掉不可用的Server实例,再选择并发连接最小的实例。 |
WeightedResponseTimeRule | 为每一个服务器计算一个权重范围区间,权重区间的宽度越大,而权重区间宽度越大被选中的概率就越大。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 轮询重试(重试采用的默认也是轮询) |
SpringCloud允许通过定义IRule修改负载均衡规则,有两种方式:
- 全局方式:向Spring容器中直接放入想要使用的策略对象
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 局部方式:在配置文件中,针对指定的服务提供者配置策略。
user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意: 负载均衡策略需要配置在服务消费者一方
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients:
- user