SpringCloud 微服务架构

【前言】最近项目要重构,弃用传统的企业服务总线,使用微服务,记录下相关的文档。

微服务架构关系图


微服务架构关系图

相关工具介绍

1.Eureka架构

        一个简单的Eureka集群,需要一个Eureka服务器、若干服务提供者。将业务组件(服务)注册到Eureka服务器中,其他客户端组件可以向服务器获取服务并进行远程调用。下图为Eureka的架构图。


Eureka架构图

        图中有两个服务器,服务器支持集群部署,每个服务器也可以作为对方服务器的客户端进行相互注册和复制。图中还有三个Eureka客户端,三个Eureka客户端都用于发布服务,其中一个也可以调用另外两个Eureka客户端提供的服务。不管服务端还是客户端,都可以部署多个实例,如此一来,就很容易构建高可用的服务集群。

        服务器端:用于服务发现和注册。

        服务提供者:作为Eureka客户端存在的服务提供者,将向服务器注册服务。当Eureka客户端注册到服务器时,它将会提供一些关于它自己的信息给服务器端,例如自己的主机、端口等。

        服务调用者:对于发布到Eureka服务器的服务,调用者可对其进行服务查找与调用,服务调用者也是作为Eureka客户端存在,但其职责主要是发现与调用服务。在实际情况中,有可能出现本身既是服务提供者,又是服务调用者的情况。

2.Zuul:

        Zuul是服务网关(边缘服务器或代理服务器),它用来为外部应用程序提供服务,它是一扇面向外部应用程序的门。

        Zuul允许动态路由和监控请求。它还可以执行安全操作,如身份验证。

3.Ribbon:

        Ribbon与Eureka结合实现负载均衡,与Hystrix结合实现容错或电路断路器操作。。Ribbon提供以下特性:1.负载均衡器,可支持插拔式的负载均衡规则。2.对多种协议提供支持,例如HTTP、TCP、UDP。3.提供缓存和批处理的功能。

4.Hystrix:

        Hystrix工具用来执行电路断路器操作,也就是,容忍延迟和容错。在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。为了解决这个问题,业界提出了断路器模型。


        较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次)断路器将会被打开。

        断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。

微服务的实现

        使用Sping Cloud实现微服务的构建。Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

1.搭建Eureka服务器

        Spring Boot项目,配置服务器的地址和端口等信息。成功启动后,可以查看Eureka服务器控制台,在控制台中可以查看注册的服务。例如访问http://localhost:8761/,可以看到下面的页面,还没有任何服务。其中8761为Eureka服务器配置的端口号。


2.   编写XX服务提供者和XX服务提供者,并向服务器中注册服务

        分别创建两个Springboot项目(XX系统和XX服务系统),每个项目使用自己单独的数据库,和普通springboot项目没有区别,只是在使用Hystrix断路器时,相应接口需要配置回调方法,即请求失败后的处理。数据库设计,逻辑代码较之前没有变化。

        编写完成之后,在配置文件application.yml中进行配置,向Eureka服务器中进行注册。配置文件中需要配置服务提供者的端口号、名称等信息,还需要配置Eureka服务器的URL地址。

        服务的发现和注册通过配置文件完成。

        配置完成后,启动计费系统和优惠服务系统,可以在Eureka服务器控制台中看到计费服务和优惠券服务。


3.构建Zuul服务网关

        创建Gateway项目(springboot项目),配置服务网关的端口号,名称,Eureka服务器信息,以及路由信息。通过服务路由的功能,我们在对外提供服务的时候,只需要通过暴露Zuul中配置的调用地址就可以让调用方统一的来访问我们的服务,而不需要了解具体提供服务的主机信息了。

        如图,定义了两个路由charging和coupon来分别映射两个微服务charging-service和coupon-service,以/charging/开头的url请求会转发到charging-service中进行处理,coupon的请求与之类似。

4.负载均衡(服务使用者中配置)

        在服务使用者项目中配置端口号、名称和Eureka服务器的信息。通过注解开启Ribbon提供的均衡负载能力,使用RestTemplate调用服务实现负载均衡。

5.编写Hystrix断路器

        使用Hystrix在指定接口上通过注解制定回调方法并编写回调方法(请求失败的处理)。

下篇文章发布代码的部分,敬请关注。

你可能感兴趣的:(SpringCloud 微服务架构)