目录
什么是微服务?
将单个应用程序开发为一组小型独立服务,这些独立服务在自己的进程中运行,独立开发和部署。
这些服务使用轻量级API通过明确定义的接口中进行通信,这些服务是围绕业务功能构建的,每项服务执行一项功能。由于他们是独立运行的,因此可以针对各项服务进行更新、部署和扩展,以满足对应用程序特定的功能。
本次项目采用的是spring cloud alibaba微服务解决方案
Spring cloud
是一系列框架的有序集合。基于spring boot 的开发遍历性巧妙的简化了分布式系统基础设施的开发,如服务注册、配置、智能路由、消息总线、负载均衡等。
spring cloud alibaba
是spring cloud 的一个子项目,只需要一些注解和少量的配置,就可以将spring cloud接入阿里微服务解决方案,通过阿里的中间件来迅速搭建分布式应用程序。
核心组件分析
服务限流降级:
默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:
基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
分布式配置管理:
基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:
基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
分布式任务调度:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行
spring cloud 依赖
<dependencyManagement>
<dependencies>
<!--Spring boot 依赖(定义了微服务规范)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!--Spring Cloud 依赖(定义了微服务规范)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!--Spring Cloud Alibaba依赖(基于spring微服务规范做了具体落地实现)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
Nacos注册中心介绍
用来注册服务,发现服务,并且在nacos中统一管理的平台。
作用:在不同的服务之间进行通信,更好更方便的管理应用中的每一个服务。
如何选择注册中心:社区活跃度,稳定性,功能,性能
Nacos:不仅可以做注册中心,还可以作为配置中心,稳定性和性能都很好
依赖
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
面试题
为什么要将服务注册到nacos:
因为需要更好的查找服务,使用服务
在Nacos中服务提供者如何向Nacos注册中心续约:
每隔五秒向注册中心发送一个心跳包
对于Nacos服务来讲他是如何判断服务实例的状态:
检测心跳包,十五秒检测不到标记为不健康状态,三十秒检测不到就死掉
负载均衡
为什么nacos可以实现负载均衡?
因为nacos集成了Ribbon,Ribbon配合RestTemplate,可以非常轻松的实现服务间的访问。
Ribbon
bbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。
@LoadBalanced
当使用RestTemplate进行远程调用时,如果需要负载均衡,可以在构建RestTemplate对象时,使用@LoadBalanced对构建RestTemplate的方法进行修饰
@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
return new RestTemplate();
}
面试题
Ribbon是什么:
NetFlix(网飞)提供的一个负载均衡的客户端,一般应用于服务的消费方法
Ribbon可以解决什么问题:
基于负载均衡策略进行服务调用,所有策略都会实现IRule接口
Ribbon内置的负载策略有哪些:
8种
RoundRobinRule 轮询策略
RandomRule 随机策略
BestAvailableRule 过滤出故障服务器后,选择一个并发量最小的
WeightedResponseTimeRule 针对响应时间加权轮询
AvailabilityFilteringRule 可用过滤策略,先过滤出故障或并发请求大于阈值的的一部分实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个
ZoneAvoidanceRule 从最佳区域实例集合中选择一个最优性能的服务实例
RetryRule 选择一个Server,如果失败,重新选择一个
当系统提供的负载均衡策略不能满足我们需求时,我们还可以基于IRule接口自定义策略
@LoadBalanced的作用是什么?
描述RestTemplate对象,用于告诉spring框架,在使用restTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略
我们可以自己定义负载均衡策略吗?
可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现