免责声明 !!!笔者接触Java的时间不算久,虽然有些经验,但不多。有幸看到此篇博客的兄弟姐妹,请收好你们的40米大砍刀,放松心态来欣赏一下我这无以言表的才华。/捂脸
正如标题所言,微服务、分布式开发,大神们已经是使用得炉火纯青了,刚入行的萌新们呢,估计和笔者一样,都是一知半解的。不过,虽然笔者菜,但是废话多啊,多少都能讲上一句,万一讲对了呢?所以,这篇粗略中参杂着些许知识点详细解析的博客,就由我带给大家。提前谢谢!
首先,我们来理解一下,什么是微服务?什么是分布式?
微服务
微服务,依字面意思而言,就是细微、体量不大的服务,小到一个服务只对应一个单一的功能,只做一件事。为了应付数据量日渐变态的业务,基于技术的发展支持,微服务就诞生了,而且是必然的趋势。
分布式
分布式系统就是一组部署在同一个网络下的多个通过网络来通信和协调的组件,对外部而言表现的如同一个系统。
分布式的重点呢,就是拆。笔者认为,只要是将一个项目拆分成了多个模块,并将这些模块分开部署,那就符合分布式开发的定义。
在选定分布式开发的方式后,我们就不可避免的要使用到SpringCloud。
SpringCloud
也就是微服务架构工具集,它为开发人员提供工具,以快速构建分布式系统中的一些常见模式。
官网直达>>> https://spring.io/projects/spring-cloud
SpringCloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合,基于springboot构建。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。
它的组件相当繁杂,拥有诸多子项目,值得关注的是:最早开源的-奈飞spring-cloud-netflix,国产的-阿里巴巴spring-cloud-alibaba,官方的-spring-cloud。
因为篇幅原因,我们不可能全部都了解一遍,所以,在接下来的介绍里,咱们重点介绍一下以下主流工具:
Nacos 用于 服务发现和配置管理
Sentinel 用于 服务容错
Seata 用于 分布式事务
Gateway 用于 服务网关
Openfeign 用于 服务调用
Ribbon 用于 负载均衡
服务发现
在分布式开发中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务生产方的网络位置(IP地址和端口号)。
这个时候,我们可以使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。
找到服务实例的地址的过程示意图
配置管理
当系统从一个单体应用,被拆分成分布式系统上一个个服务后,配置文件也必须跟着迁移,这样配置就变得非常分散,造成使用和管理难度变大。并且,同一个应用程序在不同的环境(开发,测试,生产)和不同的集群经常需要有不同的配置,需要能方便得进行动态切换。
Nacos
官网直达>>>https://nacos.io/zh-cn/
Nacos是SpringCloudAlibaba架构中最重要的组件,是阿里巴巴的一个开源产品,它是针对微服务架构中的服务发现、配置管理的综合型解决方案。
1. 服务发现
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。
2. 配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
服务调用
即一个服务调用另一个服务,此过程可以分为服务调用者、服务提供者。
OpenFeign
OpenFeign是一个声明式的web服务客户端,只需要创建一个接口并在接口上添加注解即可。OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
负载均衡
即LoadBalanced,用来在多个计算机、网络连接、CPU或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
Ribbon
选用netflix-ribbon作为负载均衡服务,由nacos-discovery引入。简单的说,Ribbon是Netflx发布的开源项目,主要功能是提供负载均衡和服务调用。
比较重要的内置策略:
BestAvailableRule最小并发数:选择一个最小的并发请求的server。
WeightedResponseTimeRule响应时间加权:根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
RoundRobinRule轮询:简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
RandomRule随机:随机选择一个可用的服务器。
分布式事务
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
Seata
官网直达>>> http://seata.io/zh-cn/
Seata用于解决分布式事务,非常适合解决微服务分布式事务,性能高,使用简单。
AT模式:
阶段一:预备阶段
1、执行业务
2、 获取并持久化回滚数据
(1)seata代理数据源(javax.sql.DataSource),拦截所有的数据库操作
(2)获取到操作执行前后的数据镜像,生成insert SQL,插入到undo_log表
(3)加入到当前事务并提交
阶段二:提交阶段
正常提交:删除undo_log表中的记录
异常回滚:seata提取对应的undo_log表中的记录,计算生成回滚用SQL;执行回滚SQL,提交事务
服务网关
服务网关是我们服务的守门神,作为服务的唯一入口,提供身份校验、动态路由、负载均衡、安全管理、统计、日志、监控、流量管理、协议转换等功能。
Gateway
Spring Cloud Gateway是Spring官方开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
相关名词解释:
Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由,目标URI会被访问。
Predicate(断言):这是一个java 8的Predicate,可以使用它来匹配来自HTTP请求的任何内容,如:请求头和请求参数。断言的输入类型是一个ServerWebExchange。
Filter(过滤器):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。
服务容错
在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。
由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩效应” 。
我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问题,不会影响到其它服务的正常运行。
Sentinel
官网直达>>>home
阿里巴巴开源的一款断路器实现,并且带有可视化操作界面。本身在阿里内部已经被大规模采用,非常稳定。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
以上,就是分布式开发里的一些主流工具的介绍。
由于时间有限,此次的分享到此结束,以后随缘更新。感谢你看到这里,很不容易,辛苦了。/哭脸