微服务架构实施原理详解

2023-05-27 0 432

点选下方“芋道源代码”,优先选择“标为星标

管她Barousse,却是系遇?

能浪的浪,才是好浪!

每晚 8:55 预览该文,每晚掉亿笑了笑发…

源代码名品时评

 

创作者 | Java 2020 神拳成功之路,很肝~

英文详尽注解的开源工程项目

RPC 构架 Dubbo 源代码导出

应用软体构架 Netty 源代码导出

消息开发工具 RocketMQ 源代码导出

资料库开发工具 Sharding-JDBC 和 MyCAT 源代码导出

工作台运维开发工具 Elastic-Job 源代码导出

分布式系统外交事务开发工具 TCC-Transaction 源代码导出

Eureka 和 Hystrix 源代码导出

Java mammalian源代码

065847.html

服务工程项目网关(GateWay)服务工程项目注册与发现微服务工程项目部署服务工程项目容错动态配置中心

基于微服务工程项目构架和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务工程项目快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设施、开发工具、数据服务工程项目、云服务工程项目器等资源,开发人员只需要开发业务代码并提交到平台代码库,做一些必要的配置,系统会自动构建、部署,实现应用的敏捷开发、快速迭代。在系统构架上,PaaS云平台主要分为微服务工程项目构架、Docker容器技术、DveOps三部分,这篇该文重点介绍微服务工程项目构架的实行。

实行微服务工程项目需要投入大量的技术力量来开发基础设施,这对很多公司来说显然是不现实的,别担心,业界已经有非常优秀的开放源码构架供我们参考使用。目前业界比较成熟的微服务工程项目构架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套实现微服务工程项目的构架,它提供了开发微服务工程项目所需的组件,跟Spring Boot一起使用的话开发微服务工程项目构架的云服务工程项目会变的很方便。Spring Cloud包含很多子构架,其中Spring Cloud Netflix是其中的一套构架,在我们的微服务工程项目构架设计中,就使用了很多Spring Cloud Netflix构架的组件。Spring Cloud Netflix工程项目的时间还不长,相关的文档资料很少,博主当时研究这套构架啃了很多英文文档,简直痛苦不堪。对于刚开始接触这套构架的同学,要搭建一套微服务工程项目应用构架,可能会不知道如何下手,接下来介绍我们的微服务工程项目构架搭建过程以及需要那些构架或组件来支持微服务工程项目构架。

为了直接明了的展示微服务工程项目构架的组成及基本原理,博主画了一张系统构架图,如下:

微服务架构实施原理详解

从上图可以看出,微服务工程项目访问大致路径为:外部请求 → 负载均衡 → 服务工程项目网关(GateWay)→ 微服务工程项目 → 数据服务工程项目/消息服务工程项目。服务工程项目网关和微服务工程项目都会用到服务工程项目注册和发现来调用依赖的其他服务工程项目,各服务工程项目集群都能通过配置中心服务工程项目来获得配置信息。

服务工程项目网关(GateWay)

网关是外界系统(如:客户端浏览器、移动设备等)和企业内部系统之间的一道门,所有的客户端请求通过网关访问后台服务工程项目。为了应对高mammalian访问,服务工程项目网关以集群形式部署,这就意味着需要做负载均衡,我们采用了亚马逊EC2作为虚拟云服务工程项目器,采用ELB(Elastic Load Balancing)做负载均衡。EC2具有自动配置容量功能,当用户流量达到尖峰,EC2可以自动增加更多的容量以维持虚拟主机的性能。ELB弹性负载均衡,在多个实例间自动分配应用的传入流量。为了保证安全性,客户端请求需要使用https加密保护,这就需要我们进行SSL卸载,使用Nginx对加密请求进行卸载处理。外部请求经过ELB负载均衡后路由到GateWay集群中的某个GateWay服务工程项目,由GateWay服务工程项目转发到微服务工程项目。服务工程项目网关作为内部系统的边界,它有以下基本能力:

1、动态路由:动态的将请求路由到所需要的后端服务工程项目集群。虽然内部是复杂的分布式系统微服务工程项目网状结构,但是外部系统从网关看就像是一个整体服务工程项目,网关屏蔽了后端服务工程项目的复杂性。

2、限流和容错:为每种类型的请求分配容量,当请求数量超过阀值时抛掉外部请求,限制流量,保护后台服务工程项目不被大流量冲垮;党内部服务工程项目出现故障时直接在边界创建一些响应,集中做容错处理,而不是将请求转发到内部集群,保证用户良好的体验。

3、身份认证和安全性控制:对每个外部请求进行用户认证,拒绝没有通过认证的请求,还能通过访问模式分析,实现反爬虫功能。

4、监控:网关可以收集有意义的数据和统计,为后台服务工程项目优化提供数据支持。

5、访问日志:网关可以收集访问日志信息,比如访问的是哪个服务工程项目?处理过程(出现什么异常)和结果?花费多少时间?通过分析日志内容,对后台系统做进一步优化。

我们采用Spring Cloud Netflix构架的开放源码组件Zuul来实现网关服务工程项目。Zuul使用一系列不同类型的过滤器(Filter),通过重写过滤器,使我们能够灵活的实现网关(GateWay)的各种功能。

服务工程项目注册与发现

由于微服务工程项目构架是由一系列职责单一的细粒度服务工程项目构成的网状结构,服务工程项目之间通过轻量机制进行通信,这就引入了服务工程项目注册与发现的问题,服务工程项目的提供方要注册报告服务工程项目地址,服务工程项目调用放要能发现目标服务工程项目。我们的微服务工程项目构架中使用了Eureka组件来实现服务工程项目的注册与发现。所有的微服务工程项目(通过配置Eureka服务工程项目信息)到Eureka服务工程项目器中进行注册,并定时发送心跳进行健康检查,Eureka默认配置是30秒发送一次心跳,表明服务工程项目仍然处于存活状态,发送心跳的时间间隔可以通过Eureka的配置参数自行配置,Eureka服务工程项目器在接收到服务工程项目实例的最后一次心跳后,需要等待90秒(默认配置90秒,可以通过配置参数进行修改)后,才认定服务工程项目已经死亡(即连续3次没有接收到心跳),在Eureka自我保护模式关闭的情况下会清除该服务工程项目的注册信息。所谓的自我保护模式是指,出现网络分区、Eureka在短时间内丢失过多的服务工程项目时,会进入自我保护模式,即一个服务工程项目长时间没有发送心跳,Eureka也不会将其删除。自我保护模式默认为开启,可以通过配置参数将其设置为关闭状态。

Eureka服务工程项目以集群的方式部署(在博主的另一篇该文中详尽介绍了Eureka集群的部署方式),集群内的所有Eureka节点会定时自动同步微服务工程项目的注册信息,这样就能保证所有的Eureka服务工程项目注册信息保持一致。那么在Eureka集群里,Eureka节点是如何发现其他节点的呢?我们通过DNS服务工程项目器来建立所有Eureka节点的关联,在部署Eureka集群之外还需要搭建DNS服务工程项目器。

当网关服务工程项目转发外部请求或者是后台微服务工程项目之间相互调用时,会去Eureka服务工程项目器上查找目标服务工程项目的注册信息,发现目标服务工程项目并进行调用,这样就形成了服务工程项目注册与发现的整个流程。Eureka的配置参数数量很多,多达上百个,博主会在另外的该文里详尽说明。

微服务工程项目部署

微服务工程项目是一系列职责单一、细粒度的服务工程项目,是将我们的业务进行拆分为独立的服务工程项目单元,伸缩性好,耦合度低,不同的微服务工程项目可以用不同的语言开发,每一个服务工程项目处理的单一的业务。微服务工程项目可以划分为前端服务工程项目(也叫边缘服务工程项目)和后端服务工程项目(也叫中间服务工程项目),前端服务工程项目是对后端服务工程项目做必要的聚合和剪裁后暴露给外部不同的设备(PC、Phone等),所有的服务工程项目启动时都会到Eureka服务工程项目器进行注册,服务工程项目之间会有错综复杂的依赖关系。当网关服务工程项目转发外部请求调用前端服务工程项目时,通过查询服务工程项目注册表就可以发现目标服务工程项目进行调用,前端服务工程项目调用后端服务工程项目时也是同样的道理,一次请求可能涉及到多个服务工程项目之间的相互调用。由于每个微服务工程项目都是以集群的形式部署,服务工程项目之间相互调用的时候需要做负载均衡,因此每个服务工程项目中都有一个LB组件用来实现负载均衡。

微服务工程项目以镜像的形式,运行在Docker容器中。Docker容器技术让我们的服务工程项目部署变得简单、高效。传统的部署方式,需要在每台服务工程项目器上安装运行环境,如果我们的服务工程项目器数量庞大,在每台服务器上安装运行环境将是一项无比繁重的工作,一旦运行环境发生改变,就不得不重新安装,这简直是灾难性的。而使用Docker容器技术,我们只需要将所需的基础镜像(jdk等)和微服务工程项目生成一个新的镜像,将这个最终的镜像部署在Docker容器中运行,这种方式简单、高效,能够快速部署服务工程项目。每个Docker容器中可以运行多个微服务工程项目,Docker容器以集群的方式部署,使用Docker Swarm对这些容器进行管理。我们创建一个镜像仓库用来存放所有的基础镜像以及生成的最终交付镜像,在镜像仓库中对所有镜像进行管理。

服务工程项目容错

微服务工程项目之间存在错综复杂的依赖关系,一次请求可能会依赖多个后端服务工程项目,在实际生产中这些服务工程项目可能会产生故障或者延迟,在一个高流量的系统中,一旦某个服务工程项目产生延迟,可能会在短时间内耗尽系统资源,将整个系统拖垮,因此一个服务工程项目如果不能对其故障进行隔离和容错,这本身就是灾难性的。我们的微服务工程项目构架中使用了Hystrix组件来进行容错处理。Hystrix是Netflix的一款开放源码组件,它通过熔断模式、隔离模式、回退(fallback)和限流等机制对服务工程项目进行弹性容错保护,保证系统的稳定性。

1、熔断模式:熔断模式基本原理类似于电路熔断器,当电路发生短路时,熔断器熔断,保护电路避免遭受灾难性损失。当服务工程项目异常或者大量延时,满足熔断条件时服务工程项目调用方会主动启动熔断,执行fallback逻辑直接返回,不会继续调用服务工程项目进一步拖垮系统。熔断器默认配置服务工程项目调用错误率阀值为50%,超过阀值将自动启动熔断模式。服务工程项目隔离一段时间以后,熔断器会进入半熔断状态,即允许少量请求进行尝试,如果仍然调用失败,则回到熔断状态,如果调用成功,则关闭熔断模式。

2、隔离模式:Hystrix默认采用线程隔离,不同的服务工程项目使用不同的线程池,彼此之间不受影响,当一个服务工程项目出现故障耗尽它的线程池资源,其他的服务工程项目正常运行不受影响,达到隔离的效果。例如我们通过andThreadPoolKey配置某个服务工程项目使用命名为TestThreadPool的线程池,实现与其他命名的线程池隔离。

3、回退(fallback):fallback机制其实是一种服务工程项目故障时的容错方式,基本原理类似Java中的异常处理。只需要继承HystixCommand并重写getFallBack()方法,在此方法中编写处理逻辑,比如可以直接抛异常(快速失败),可以返回空值或缺省值,也可以返回备份数据等。当服务工程项目调用出现异常时,会转向执行getFallBack()。有以下几种情况会触发fallback:

1)程序抛出非HystrixBadRequestExcepption异常,当抛出HystrixBadRequestExcepption异常时,调用程序可以捕获异常,没有触发fallback,当抛出其他异常时,会触发fallback;

2)程序运行超时;

3)熔断启动;

4)线程池已满。

4、限流:限流是指对服务工程项目的mammalian访问量进行限制,设置单位时间内的mammalian数,超出限制的请求拒绝并fallback,防止后台服务工程项目被冲垮。

Hystix使用命令模式HystrixCommand包装依赖调用逻辑,这样相关的调用就自动处于Hystrix的弹性容错保护之下。调用程序需要继承HystrixCommand并将调用逻辑写在run()中,使用execute()(同步阻塞)或queue()(异步非阻塞)来触发执行run()。

动态配置中心

微服务工程项目有很多依赖配置,某些配置参数在服务工程项目运行期间可能还要动态修改,比如:根据访问流量动态调整熔断阀值。传统的实现信息配置的方法,比如放在xml、yml等配置文件中,和应用一起打包,每次修改都要重新提交代码、打包构建、生成新的镜像、重新启动服务工程项目,效率太低,这样显然是不合理的,因此我们需要搭建一个动态配置中心服务工程项目支持微服务工程项目动态配置。我们使用Spring Cloud的configserver服务工程项目帮我们实现动态配置中心的搭建。我们开发的微服务工程项目代码都存放在git服务工程项目器私有仓库里面,所有需要动态配置的配置文件存放在git服务工程项目器下的configserver(配置中心,也是一个微服务工程项目)服务工程项目中,部署到Docker容器中的微服务工程项目从git服务工程项目器动态读取配置文件的信息。当本地git仓库修改代码后push到git服务工程项目器仓库,git服务工程项目端hooks(post-receive,在服务工程项目端完成代码预览后会自动调件信息,实现动态配置。

以上这些构架或组件是支撑实行微服务工程项目构架的核心,在实际生产中,我们还会用到很多其他的组件,比如日志服务工程项目组件、消息服务工程项目组件等等,根据业务需要自行优先选择使用。在我们的微服务工程项目构架实行案例中,参考使用了很多Spring Cloud Netflix构架的开放源码组件,主要包括Zuul(服务工程项目网关)、Eureka(服务工程项目注册与发现)、Hystrix(服务工程项目容错)、Ribbon(客户端负载均衡)等。这些优秀的开放源码组件,为我们实行微服务工程项目构架提供了捷径。

以上篇幅主要介绍了微服务工程项目构架的基本基本原理,其中有些比较细节的东西,比如Eureka的各项参数配置说明、动态配置中心搭建过程等,博主会在其他的该文中做出详尽的说明,供大家参考。

欢迎加入我的知识星球,一起探讨构架,交流源代码。加入方式,

微服务架构实施原理详解

已在知识星球预览源代码导出如下:

微服务架构实施原理详解

微服务架构实施原理详解

微服务架构实施原理详解

微服务架构实施原理详解

最近预览《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务工程项目工程项目。

在看666 领取,更多内容陆续奉上。

该文有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务