一种基于Springcloud的微服务构建方法与流程

文档序号:15236635发布日期:2018-08-24 05:45阅读:1936来源:国知局

本发明涉及程序控制装置,进一步涉及一种基于springcloud的微服务构建方法。



背景技术:

微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用。这些小应用之间通过服务完成交互和集成。每个小应用从前端webui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套。在这里我们不用组件而用小应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴露的服务,同时自身也将自身的能力朝外部发布为服务。

针对组件化、模块化的单体应用,如何将大量松耦合的应用进行统一化的管理及监控,如何保证服务间的相互调用以及分布式事务处理的一致性,如何实现服务发现注册和配置管理,都是微服务架构或者说是分布式架构统一面临的问题。

springboot是由pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。是spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。大多数springboot项目只需要很少的配置文件。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

springboot框架作用很简单,可实现自动配置,只要存在相应的jar包,spring就能够自动配置。如果默认配置不能满足需求,还可以替换掉自动配置类,使用其他配置。另外,springboot还集成了嵌入式的web服务器,系统监控等很多有用的功能,能够快速构建企业及应用程序。

springboot是基于spring框架进行开发的,也继承了spring的成熟性。它通过一些内置的固件封装了底层框架的复杂性,以帮助使用者进行微服务的开发。springboot的一大优点是提高开发者的生产力,因为它已经提供了许多通用的功能,例如restfulhttp以及嵌入式的web应用。程序运行时,因此很容易进行装配及使用。在许多方面上,它也是一种“微框架”,允许开发者选择在整个框架中他们所需的那部分,而无需使用庞大的、或是不必要的运行时依赖。这也让boot应用程序能够被打包为多个小单元以进行部署,并且该框架还能够使用构建系统生成可部署文件,例如可运行的java档案包。

作为一个微服务框架,boot的很大一部分价值在于它能够无缝地为基于maven和gradle的项目提供各种构建工具。通过使用springboot插件,就能够利用该框架的能力,将项目打包为一个轻量级的、可运行的部署包,而除此之外几乎不需要进行任何额外的配置。此外,也可在springinitializr网站上选择使用较繁琐的mavenpom的示例,同时需要将应用程序的启动类的地址告诉该插件。而在使用gradle时则无需进行这方面的配置,因为插件本身就能够找到这个类的地址。

现有技术的缺点:缺少注册、发现等外围方案,缺少外围监控集成方案,缺少外围安全管理方案,缺少rest落地的uri规划方案。亟需一种新的基于springcloud的微服务构建方法。



技术实现要素:

使用springboot开发应用微服务,并实现服务发现、服务消费、服务熔断、api网关、统一配置中心、分布式事务一致性管理、容器构建的功能。技术方案如下:

一种基于springcloud的微服务构建方法,包括如下过程:

(一)父本创建:创建一个父项目,以便对项目中的maven依赖进行统一管理,添加springboot依赖;

(二)服务发现及注册:在父类项目下构建一个用于服务注册的子模块,在配置文件中,添加关于eureka的依赖以创建注册中心服务;

在注册中心工程的启动类代码中添加注解@enableeurekaserver、@enableeurekaclient,直接运行该工程的启动类的main方法,即可启动注册中心服务端;

在其他服务中,首先在依赖配置文件下添加服务注册依赖,其次在application主类中添加注解@enableeurekaclient,然后在配置文件中添加关于服务注册的配置信息,最后启动服务,eurekaclient即可自动将服务注册到eurekaserver;

(三)实现服务消费和负载均衡:使用resttemplate消费服务,利用ribbon或feign实现服务消费,保障负载均衡;

(四)服务熔断:使用hystrix来实现服务熔断;

(五)配置中心:

在父类项目下构建一个用于服务注册的子模块,在配置文件中,添加关于config的依赖以创建配置中心服务;

在模块程序的入口类加上注解@enableconfigserver注解开启配置服务器的功能;

在程序的配置文件中配置仓库信息;

在目标程序中添加配置中心依赖,在其配置文件bootstrap.properties中添加关于配置中心相关信息;

配置成功后即可在目标程序中读取配置中心文件内容;

(六)api网关设置:

在父类项目下构建一个用于网关的子模块,在配置文件中,添加关于zuul的依赖以创建api网关服务;

在模块程序的启动类中添加注解@enablezuulproxy,开启zuul的功能;

配置文件中添加网关相关内容;

(七)分布式事务一致性管理:

定义事件的状态类型;

在分布式事务执行异步操作时,记录事件信息及状态到es中;

使用reactor从es中获取事件并产生操作事件流;

执行事件流直至最后一个事件发生的状态即为事件的最终状态,返回客户端;

(八)使用docker构建微服务:在已经构建完成的微服务模块程序中的pom.xml文件中添加docker依赖,编写dockerfile文件并执行创建docker镜像的maven镜像。

作为优选方案之一,所述实现服务消费和负载均衡步骤中,首选选择eurekaserver,它优先选择在同一个zone且负载较少的server;根据用户指定的策略,从server中取到的服务注册列表选择一个地址;运用ribbon实现负载均衡的步骤:

在父类项目下的构建一个用于服务消费的子模块,在配置文件中,添加关于ribbon的依赖以创建服务消费者;

在模块程序启动类中使用注解@bean向程序的ioc注入一个bean:resttemplate;通过注解@loadbalanced注解表明这个restremplate开启负载均衡的功能;

编写一个用于消费服务的service类,通过上一步注入ioc容器的resttemplate来消费目标服务的所提供的接口;可直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名;

编写controller类调用上一步骤服务类,消费目标服务。

作为优选方案之二,所述实现服务消费和负载均衡步骤中,创建接口并为接口添加注解即可使用feign;运用feign实现负载均衡的步骤:

在父类项目下的构建一个用于服务消费的子模块,在配置文件中,添加关于feign的依赖以创建服务消费者;

在模块程序的启动类中,加上@enablefeignclients注解开启feign的功能;

编写一个feign接口,通过@feignclient(“服务名”),来指定具体调用的服务;

编写controller类,对外暴露一个的api接口,通过上一步骤定义的feign客户端提供的接口来消费目标服务。

作为优选方案之三,所述服务熔断步骤中,运用ribbon实现负载均衡的熔断步骤:

参照ribbon实现负载均衡的步骤构建服务消费者程序消费指定服务,添加熔断器hystrix所需依赖;

在模块程序的启动类中添加注解@enablehystrix注解开启hystrix熔断器功能;

在消费服务的service类的方法上加上@hystrixcommand注解;该注解对该方法创建了熔断器的功能,并指定了fallbackmethod熔断方法,熔断方法可直接返回了一个字符串,以告警服务发生异常,以熔断。

作为优选方案之四,所述服务熔断步骤中,运用feign实现负载均衡的熔断步骤:

参照实现负载均衡的步骤构建服务消费者程序消费指定服务,添加熔断器hystrix所需依赖;

feign是自带断路器的,在springcloud中,没有默认打开;需要在配置文件中配置打开;修改配置文件中的feign.hystrix.enabled值,设置为true;

在包含feignclient的接口的注解中加上fallback的指定类;

编写fallback的指定类实现包含feignclient的接口,并注入到ioc容器中,可编写熔断提示方法以告警服务发生异常。

作为优选方案之五,在api网关设置步骤中,在网关程序中添加过滤器,以拦截过滤不符合要求的请求或是添加安全认证,以增加安全性。

本发明相对于现有技术的进步在于:

熔断器可以实现快速失败,如果在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器。

springcloudconfig提供了一种在分布式系统中外部化配置服务器和客户端的支持,配置服务器的中心位置用来管理所有环境下应用的外部属性。configserver存储后端默认使用git存储配置信息,可以容易支持标记配置环境的版本,同时可以用一个使用广泛的工具管理配置内容;同样支持添加其他存储方式的实现。

apigateway是微服务架构中不可或缺的部分。通过apigateway可以统一向外部系统提供restapi,springcloud中使用zuul作为apigateway,zuul提供了动态路由、监控、回退、安全等功能;zuul并不依赖eureka,可以脱离eureka运行。

在微服务架构中使用事件溯源处理状态有很多的好处:聚合可以被认为是产生任何对象的一致性状态;它提供校订方法用来进行重播产生对象中状态变化的历史;它能使用事件流提供分析数据许多必要输入;能够采取补偿方式对不一致应用状态实现事件回滚;它也避免了复杂的微服务之间的同步,为微服务之间的异步非阻塞操作铺平了道路;使用reactor的进行异步操作的处理聚合,再对数据溯源进行操作,以保证操作事务的最终一致性及微服务间异步非阻塞操作。

由于微服务架构里面强调了单个组件本身是可以在独立的进程里面运行,各个组件之间在部署的时候就能够做到进程级别的隔离。那么一台服务器我们可能需要初始化几十个甚至更多的进程来进行应用组件的部署。为了保持进程的隔离性,我们可以用虚拟机,但是当几十个进程都完全用独立的虚拟机就不现实的,而这个问题的解决刚好就是利用paas平台里面的轻量docker容器来做这个事情,每个docker是独立的容器刚好又完全做到进程级别的隔离,资源占用率又最小,这些特点刚好满足微服务架构的开发测试和自动化部署。

具体实施方式:

实施例:

一种基于springcloud的微服务构建方法,包括如下过程:

(一)父本创建:创建一个父项目,以便对项目中的maven依赖进行统一管理,添加springboot依赖。

(二)服务发现及注册:

服务发现是微服务架构中关键原则之一,手动配置每个客户端或某种形式的约定较为困难,并且很脆弱;使用eureka可保障cap理论中的a和p(即可用性和分区容错性);

具体的服务发现及注册的步骤如下:

在父类项目下构建一个用于服务注册的子模块,在配置文件中,添加关于eureka的依赖以创建注册中心服务;在注册中心工程的启动类代码中添加注解@enableeurekaserver、@enableeurekaclient,直接运行该工程的启动类的main方法,即可启动注册中心服务端;在其他服务中,首先在依赖配置文件下添加服务注册依赖,其次在application主类中添加注解@enableeurekaclient,然后在配置文件中添加关于服务注册的配置信息,最后启动服务,eurekaclient即可自动将服务注册到eurekaserver;打开注册中心服务的端口地址,可观察到注册在线的服务实例。

(三)实现服务消费和负载均衡:

使用resttemplate消费服务(或者例如httpclient之类的http工具),集群环境下每个服务部署多个实例,利用ribbon或feign实现服务消费者消费服务提供者的负载均衡。

ribbon:ribbon是一个客户端负载均衡器,运行在客户端上。它是一个经过了云端测试的ipc库,可以很好地控制http和tcp客户端的一些行为;feign已经默认使用了ribbon;

ribbon工作分为两步:选择eurekaserver,它优先选择在同一个zone且负载较少的server;根据用户指定的策略,在从server中取到的服务注册列表选择一个地址;

运用ribbon实现负载均衡的步骤:在父类项目下的构建一个用于服务消费的子模块,在配置文件中,添加关于ribbon的依赖以创建服务消费者(服务消费者也需遵从服务发现注册服务的步骤注册上发现服务);

在模块程序启动类中使用注解@bean向程序的ioc注入一个bean:resttemplate,通过注解@loadbalanced注解表明这个restremplate开启负载均衡的功能;

编写一个用于消费服务的service类,通过上一步注入ioc容器的resttemplate来消费目标服务的所提供的接口;可直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名;

编写controller类调用上一步骤服务类,消费目标服务。

feign:feign是一个声明式的webservice客户端,它使得编写webservice客户端更加容易,创建接口并为接口添加注解即可使用feign。feign可以使用feign注解或jax-rs注解,还支持热插拔的编码器和解码器。springcloud为feign添加了springmvc的注解支持,并整合eureka和ribbon提供负载均衡。运用feign实现负载均衡的步骤:

在父类项目下的构建一个用于服务消费的子模块,在配置文件中,添加关于feign的依赖以创建服务消费者(服务消费者也需遵从服务发现注册服务的注册上发现服务);

在模块程序的启动类中,加上@enablefeignclients注解开启feign的功能;

编写一个feign接口,通过@feignclient(“服务名”),来指定具体调用的服务;

编写controller类,对外暴露一个的api接口,通过上一步骤定义的feign客户端提供的接口来消费目标服务。

(四)服务熔断:

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而导致整个系统不可用,这种现象称为雪崩效应,为避免雪崩效应,使用hystrix来实现熔断器。熔断器可以实现快速失败,如果在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器。熔断器也可以使用应用程序诊断错误是否已经修正,若已修正,应用程序会尝试再次调用操作。运用ribbon实现负载均衡的熔断步骤:

参照ribbon实现负载均衡的步骤构建服务消费者程序消费指定服务,添加熔断器hystrix所需依赖;

在模块程序的启动类中添加注解@enablehystrix注解开启hystrix熔断器功能;

在消费服务的service类的方法上加上@hystrixcommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackmethod熔断方法,熔断方法可直接返回了一个字符串,以告警服务发生异常,以熔断。

运用feign实现负载均衡的熔断步骤:

参照实现负载均衡的步骤构建服务消费者程序消费指定服务,添加熔断器hystrix所需依赖;

feign是自带断路器的,在springcloud中,没有默认打开。需要在配置文件中配置打开。修改配置文件中的feign.hystrix.enabled值,设置为true;

在包含feignclient的接口的注解中加上fallback的指定类;

编写fallback的指定类实现包含feignclient的接口,并注入到ioc容器中,可编写熔断提示方法以告警服务发生异常。

(五)配置中心:

运用config实现配置中心的步骤:

在父类项目下构建一个用于服务注册的子模块,在配置文件中,添加关于config的依赖以创建配置中心服务;

在模块程序的入口类加上注解@enableconfigserver注解开启配置服务器的功能;

在程序的配置文件中配置配置仓库信息,具体如下:

spring.application.name=config-server

server.port=8888

spring.cloud.config.server.git.uri=https://github.com/forezp/springcloudconfig/

spring.cloud.config.server.git.searchpaths=respo

spring.cloud.config.label=master

spring.cloud.config.server.git.username=yourusername

spring.cloud.config.server.git.password=yourpassword

在目标程序中添加配置中心依赖,在其配置文件bootstrap.properties中添加关于配置中心相关信息;

配置成功后即可在目标程序中读取配置中心文件内容。

(六)api网关

apigateway是微服务架构中不可或缺的部分;通过apigateway可以统一向外部系统提供restapi,springcloud中使用zuul作为apigateway,zuul提供了动态路由、监控、回退、安全等功能;zuul并不依赖eureka,可以脱离eureka运行。zuul实现api网关的步骤:

在父类项目下的构建一个用于网关的子模块,在配置文件中,添加关于zuul的依赖以创建api网关服务(服务消费者也需遵从服务发现注册服务的注册上发现服务);

在模块程序的启动类中添加注解@enablezuulproxy,开启zuul的功能;

在配置文件中添加网关相关内容,格式如:

若是想实现服务过滤,可直接在网关程序中添加过滤器,以拦截过滤不符合要求的请求或是添加安全认证,以增加安全性。

(七)分布式事务一致性管理:

当建立微服务时,我们被强迫面对结构状态的最终一致性问题,这是因为每个微服务都特定暴露自己拥有的数据库资源,每个数据库都根据自己类型配置了不同的一致性和高可用性权衡策略。

eventsourcing(事件溯源)是借鉴数据库事务日志的一种数据持久方式,在es中,事务单元变得更细粒度,使用一系列有序的事件来代表存储在数据库中的领域模型状态,一旦一个事件被加入事件日志,它就不能被移走或重新排序,事件被认为是不可变的,事件序列只能被追加方式存储。

运用reactor实现分布式事务一致性的步骤:

定义事件的状态类型;

在分布式事务执行异步操作时,记录事件信息及状态到es中(标准的存储库是apachekafka);

使用reactor从es中获取事件并才产生操作事件流;

执行事件流直至最后一个事件发生的状态即为事件的最终状态,返回客户端。

(八)使用docker构建微服务:

在已经构建完成的微服务模块程序中的pom.xml文件中中添加docker依赖即可,程序如下:

编写dockerfile文件并执行创建docker镜像的maven镜像即可。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1