基于SpringCloud微服务系统设计方案Word下载.docx
《基于SpringCloud微服务系统设计方案Word下载.docx》由会员分享,可在线阅读,更多相关《基于SpringCloud微服务系统设计方案Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
系统监控、高可用性、自动化技术
散布式庞杂性:
网络延迟、系统容错、散布式事务
安排依赖性强:
办事依赖、多版本问题
性能(办事间通讯本钱高):
无状态性、进程间调用、跨网络调用
数据一致性:
散布式事务管理需要跨越多个节点来包管数据的瞬时一致性,因此比起传统的单体架构的事务,本钱要高很多。
另外,在散布式系统中,通常会考虑通过数据的最终一致性来解决数据瞬时一致带来的系统不成用。
重复开发:
微办事理念崇尚每个微办事作为一个产品看待,有自己的团队开发,甚至可以有自己完全不合的技术、框架,那么与其他微办事团队的技术共享就产生了矛盾,重复开发的工作即产生了。
没有最好的,只有最适合自己的。
5.架构设计
5.1.思维设计
微办事架构设计的根本目的是实现价值交付,微办事架构只有遵循DevOps理念方可进行的更顺畅,思维方法的转变是最重要的。
实现微办事技术架构,现有产品需要进行技术上的改进以及相关配套办事的实现,采取分阶段实施、以及试点产品优先实施的战略,主要包含如下:
一、技术上的改进:
1、前后端别离,web前端通过Http/Https协议调用微办事的API网关,由API网关再经过路由办事调用相应的微办事
2、不合微办事之间通过REST方法互相调用
3、微办事之间通过消息中间件实现消息交互机制
二、配套办事与功能实现:
1、需要进行相应的自动化办事实现,包含自动化构建、自动化装置安排、自动化测试、自动化平台宣布(Docker实现)
2、管理办事,对微办事架构,必须配套相应的监控与管理办事、日志管理办事等
3、协作办事,运用DevOps思想提升开发、测试、运维的高效沟通与协作,实现开发与运维的一体化
5.2.微办事架构设计
1、我们把整个系统根据业务拆分红若干个子系统或微办事。
2、每个子系统可以安排多个应用,多个应用之间使用负载均衡。
3、需要一个办事注册中心Eureka,所有的办事都在注册中心注册,负载均衡也是通过在注册中心注册的办事来使用一定战略来实现。
Eureka可安排多个,进行高可用包管。
4、所有的客户端都通过同一个网关地址拜访后台的办事,通过路由配置ZUUL网关来判断一个URL请求由哪个办事处理。
请求转发到办事上的时候使用负载均衡Ribbon。
5、办事之间采取feign进行调用。
6、使用断路器hystrix,及时处理办事调用时的超时和毛病,避免由于其中一个办事的问题而招致整体系统的瘫痪。
7、还需要一个监控功能,监控每个办事调用花费的时间等。
8、使用SpringCloudConfig进行统一的配置管理,需要考虑与公司的配置管理平台如何配合使用。
9、Hystrix,监控和断路器。
我们只需要在办事接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。
10、HystrixDashboard,监控面板,他提供了一个界面,可以监控各个办事上的办事调用所消耗的时间等。
11、Turbine,监控聚合,使用Hystrix监控,我们需要掀开每一个办事实例的监控信息来检查。
而Turbine可以帮忙我们把所有的办事实例的监控信息聚合到一个处所统一检查。
这样就不需要挨个掀开一个个的页面一个个检查。
架构的可靠性包管:
在关键节点做主备、集群安排,避免单点故障。
待后续确认问题:
1、AccessControl:
Zuul网关提供了相关控制功能,与我司CAS如何结合使用
2、ConfigServer:
SpringCloud提供了远程配置中心,与我司的配置管理平台如何结合使用
6.设计阶段
6.1.总体设计
1、功能规划:
对产品功能进行拆分,拆分为若干个微办事;
一个功能可以创建多个微办事并安排在多个办事器节点上,以便进行负载均衡。
2、设计原子办事层,梳理和抽取核心应用、公共应用,作为自力的办事下沉到核心和公共能力层,逐渐形成稳定的办事中心,使应用能更快速的响应多变的客户需求。
3、为每个办事设计API接口(REST方法)
4、为不合的办事进行分类,不合类型的办事需要的资源不合,可以配置不合的资源,包含CPU、内存、存储等。
6.2.办事拆分原则
1、粒度微小:
根据业务功能划分办事粒度,总的原则是办事内部高内聚,办事之间低耦合。
2、责任单一:
每个办事只做一件事,即单一职责原则。
3、隔离性原则:
每个办事相互隔离,且不互相影响
4、业务无关优先原则:
基础办事,是一些基础组件,与具体的业务无关。
比方:
短信办事、邮件办事。
这里的办事最容易划分出来做微办事,也是我们第一优先级别离出来的办事。
6.3.办事规划
为实现负载均衡,允许相同的办事在多个节点注册相同的办事名,不合的端口。
如果没有前期的规划,不合的办事提供者可能会注册相同的办事名,招致消费者调用办事时产生调用混乱。
因此,需进行办事名的统一规划:
1、规划期统一制定每个办事提供者的办事名或者模块标示。
2、办事名的命名规则:
ModuleName_ServiceName,且所有字符小写,不合单词之间以下划线分隔。
如用户管理模块提供了获取用户信息的办事,则命名为:
user_get_info。
3、新增办事名时,需要提出申请,审批通过后方可使用,为减少审批庞杂度,可只审批ModuleName,即在模块内部可以自由增加办事名,不需要进行审批。
6.4.开发战略
总体原则:
不合的微办事需进行物理隔离。
1、SVN战略:
SVN上创建自力的分支,不合微办事的代码提交不受相互影响;
由配置管理员统一控制。
问题:
开发分支与集成分支,都将增加很多,维护工作量增加。
2、编译战略:
代码编译时,各个微办事自力编译、打包,根绝直接的依赖;
3、工程构建:
代码开发时,各微办事创建自力的工程,工程之间不克不及产生直接依赖
4、继续集成:
每个微办事自力执行继续集成。
5、版本集成:
由统一的集成工具,实现自动化的版本集成,将所有微办事集成到统一的版本宣布包中。
6.5.版本战略
每个微办事可以自力制作版本,陪伴着办事的增多,SVN分支增多,版本也将增多,版本管理的庞杂度将成指数级增加。
在办事之间依赖较多时,每个办事的升级或降级都将影响其他办事的正常运行。
因此需执行如下战略:
1、所有办事的版本制作交由专业的版本管理员执行。
2、采取自动化的版本制作战略,最年夜水平的减少人工操纵。
3、每个办事的版本必须有详细的版本计划、版本说明,对版本说明要制定模板,明确需要提交的内容、版本号、SVN标签等。
4、对项目经理的要求提升,需对整体的版本计划有严格的制定,尤其是版本之间的依赖关系要很是明确,版本升级、降级的风险评估需完全充分。
5、接口管理:
严格执行接口管理制度,任何接口的变动必须进行审批、发公告等流程。
6.6.数据库挑战与战略
每个微办事都有自己自力的数据库,那么后台管理的联合查询怎么处理?
这应该是年夜家会普遍遇到的一个问题,有三种处理计划。
1)严格依照微办事的划分来做,微办事相互自力,各微办事数据库也自力,后台需要展示数据时,调用各微办事的接口来获取对应的数据,再进行数据处理后展示出来,这是标准的用法,也是最麻烦的用法。
2)将业务高度相关的表放到一个库中,将业务关系不是很紧密的表严格依照微办事模式来拆分,这样既可以使用微办事,也避免了数据库分离招致后台系统统计功能难以实现,是一个折中的计划。
3)数据库严格依照微办事的要求来切分,以满足业务高并发,实时或者准实时将各微办事数据库数据同步到NoSQL数据库中,在同步的过程中进行数据清洗,用来满足后台业务系统的使用,推荐使用MongoDB、HBase等。
第一种计划适合业务较为简单的小公司;
第二种计划,适合在原有系统之上,慢慢演化为微办事架构的公司;
第三种适合年夜型高并发的互联网公司。
建议,我们以后采取第二种计划。
6.7.负载均衡
不再采取一般的增加负载均衡办事器的方法进行负载均衡,如F5、Nginx、LVS等,而是把负载均衡的功能以库的方法集成到办事消费方的进程内,这种计划称为软负载均衡(SoftLoadBalancing)或者客户端负载均衡。
在SpringCloud中配合Eureka的办事注册功能,Ribbon子项目则为REST客户端实现了负载均衡。
使用Ribbon进行负载均衡,其工作原理可以归纳综合为下面四个步调:
1.Ribbon首先根据其所在Zone优先选择一个负载较少的EurekaServer;
2.按期从EurekaServer更新并过滤办事实例列表;
3.根据指定的负载均衡战略,从可用的办事器列表中选择一个办事实例的地址;
4.然后通过RestClient进行办事调用。
Ribbon自己提供了下面几种负载均衡战略:
∙RoundRobinRule:
轮询战略,Ribbon以轮询的方法选择办事器,这个是默认值。
所以示例中所启动的两个办事会被循环拜访;
∙RandomRule:
随机选择,也就是说Ribbon会随机从办事器列表中选择一个进行拜访;
∙BestAvailableRule:
最年夜可用战略,即先过滤出故障办事器后,选择一个以后并发请求数最小的;
∙WeightedResponseTimeRule:
带有加权的轮询战略,对各个办事器响应时间进行加权处理,然后在采取轮询的方法来获取相应的办事器;
∙AvailabilityFilteringRule:
可用过滤战略,先过滤出故障的或并发请求年夜于阈值一部分办事实例,然后再以线性轮询的方法从过滤后的实例清单中选出一个;
∙ZoneAvoidanceRule:
区域感知战略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并前往过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认1)和最小过滤百分比(默认0),最后对满足条件的办事器则使用RoundRobinRule(轮询方法)选择一个办事器实例。
6.8.性能战略
1、网络优化:
优化组网结构,提升网络间通讯性能;
2、配置优化:
优化SpringCloud组件集以及其他组件的配置信息,使得性能最年夜化。
6.9.技术管理战略
微办事的架构理念中指出各微办事可以自力建设,可以使用不合的技术、语言、框架等,以便能更快速的使用新技术、新框架等响应特定客户需求,解决单体应用架构更新技术、更新框架时面临的困难或阻碍。
但这也同时带来了诸多问题,如下:
1、各办事是否可以任意使用自己的技术、自己的组件、框架呢?
如果这样,势必带来更年夜的管理困难、维护困难、技术共享困难。
2、公共的办法如何实现共享?
如格式化时间的一个简双办法需要共享,也需要封装为一个办事接口吗?
管理战略:
1、总体原则:
仍然需要进行统筹考虑,所有组件统一管理,组件放置在产品仓库中,每个产品或办事需要共享组件时,从产品仓库获取。
2、特殊情况:
特殊办事需要使用特殊的组件、框架,需提出申请,统筹规划后进行决策。
7.开发阶段
7.1.办事的调用
7.1.1.AIP网关调用
所有办事通过Zuul网关进行调用,不允许直接调用微办事提供者。
Zuul可能会成为系统瓶颈,在项目庞杂时可考虑为Zuul进行主备或负载均衡处理。
7.1.2.同步伐用
采取HTTPREST方法进行调用,针对业务需求可以进行负载均衡,负载均衡的调用方法有两种:
1、FeignClient
2、RestTemplate
建议使用FeignClient方法进行办事调用。
不管是什么方法,他都是通过REST接口调用办事的http接口,参数和结果默认都是通过Jackson序列化和反序列化。
因为SpringMVC的RestController界说的接口,前往的数据都是通过Jackson序列化成JSON数据。
7.1.3.异步伐用
rabbitMq、kafka、SpringCloudStream均是可以选择的计划。
∙SpringCloudStream,基于Redis、Rabbit、Kafka实现的消息微办事,简单声明模型用以在SpringCloud应用中收发消息。
7.1.4.办事间调用的权限验证
一般我们的API接口都需要某种授权才干拜访,登岸胜利以后,然后通过token或者cookie等方法才干调用接口。
使用SpringCloudNetfix框架的话,登录的时候,把登录请求转发到相应的用户办事上,登岸胜利后,会设置cookie或headertoken等。
然后客户端接下来的请求就会带着这些验证信息,从Zuul网关传到相应的办事上进行验证。
Zuul网关在把请求转发到后台的办事的时候,会默认把一些header传到办事端,如:
Cookie、SetCookie、Authorization。
这样,客户端请求的相关headers就可以传递到办事端,办事端设置的cookie也可以传到客户端。
可是,如果你想禁止某些header透传到办事端,可以在Zuul网关的application.yml配置里通过下面的方法禁用:
zuul:
routes:
users:
path:
/users/**
sensitiveHeaders:
Cookie,SetCookie,Authorization
serviceId:
user
刚才说了我们的某个办事有时候需要调用另一个办事,这时候,这个请求不是客户端倡议,他的请求的header里面也不会有任何验证信息。
这时候,要么,通过防火墙等设置,包管办事间调用的接口,只能某几个地址拜访;
要么,就通过某种方法设置header。
同时,如果你想在某个办事里面获得这个请求的真是IP,(因为请求的通过网关转发而来,你直接通过request获得ip获得的是网关的IP),就可以从headerXForwardedHost获得。
如果想禁用这个header,也可以:
zuul.addProxyHeaders=false
如果你使用RestTemplate的方法调用,可以在请求里面添加一个有header的Options。
也可以通过如下的拦截器的方法设置,它对RestTemplate方法和FeignClient的方法都可以起作用:
@Bean
publicRequestInterceptorrequestInterceptor(){
returnnewRequestInterceptor(){
@Override
publicvoidapply(RequestTemplatetemplate){
StringauthToken=getToken();
template.header(AUTH_TOKEN_HEADER,authToken);
}
};
}
7.1.5.办事编排
主要的作用是减少项目中的相互依赖。
比方现在有项目a调用项目b,项目b调用项目c...一直到h,是一个调用链,那么项目上线的时候需要先更新最底层的h再更新g...更新c更新b最后是更新项目a。
这只是这一个调用链,在庞杂的业务中有很是多的调用,如果要记住每一个调用链对开发运维人员来说就是灾难。
有这样一个好办法可以尽量的减少项目的相互依赖,就是办事编排,一个核心的业务处理项目,担任和各个微办事打交道。
比方之前是a调用b,b失落用c,c调用d,现在统一在一个核心项目W中来处理,W办事使用a的时候去调用b,使用b的时候W去调用c。
其实可以理解为面向对象的设计,减少办法之间的一层层嵌套调用,而采纳一个办法进行业务流程的串连,如办法W实现一个完整的业务处理,则采纳下面方法:
functionw()
{
1、调用办法a;
2、调用办法b;
3、调用办法c;
7.2.办事的熔断处理
在办事之间进行调用时,由于各种原因会招致远程办事不成用或压力过载等异常招致的故障蔓延,此时需要有一种机制进行呵护处理。
SpringCloud通过Netflix的Hystrix组件实现熔断和降级处理解决此问题。
断路器(CricuitBreaker)是一种能够在远程办事不成用时自动熔断(掀开开关),并在远程办事恢复时自动恢复(闭合开关)的设施,SpringCloud通过Netflix的Hystrix组件提供断路器、资源隔离与自我修复功能。
SpringcloudHystrix熔断器
7.3.统一日志管理
不合微办事安排在不合节点上,登录每个节点检查日志是比较麻烦的,同时对需要关联多个微办事日志联合检查阐发的情况将更加麻烦。
陪伴节点数量的增加,如果没有合适的管理机制与工具,定位问题、发明问题的庞杂性将越来越年夜,将成指数级增长,因此需要进行统一日志管理。
1、建立统一的日志管理规范;
2、开发并使用统一的日志组件,为所有微办事提供统一的日志办事,由log4j或Blitz4j封装;
3、在每个办事节点上安排日志收集Agent组件,由此Agent进行日志的收集与转发;
4、建立统一的日志中心,所有日志写入日志中心。
说明:
上述日志的实现由公司的“日志管理平台”进行实现,采取的是ELK集合框架。
7.4.统一监控管理
使用Hystrix组件进行办事的监控,使用Nagios进行办事器等资源的监控。
1、Hystrix,监控和断路器。
2、HystrixDashboard,监控面板,他提供了一个界面,可以监控各个办事上的办事调用所消耗的时间等。
3、Turbine,监控聚合,使用Hystrix监控,我们需要掀开每一个办事实例的监控信息来检查。
7.5.统一配置管理
实现各微办事的统一参数配置以及版本管理,可采取公司的配置管理平台或者SpringCloudConfig配置中心。
SpringCloudConfig配置中心
SpringCloudConfig就是我们通常意义上的配置中心。
SpringCloudConfig把应用原本放在本地文件的配置抽取出来放在中心办事器,实质是配置信息从本地迁移到云端。
从而能够提供更好的管理、宣布能力。
SpringCloudConfig分办事端和客户端,办事端担任将git(svn)中存储的配置文件宣布成REST接口,客户端可以从办事端REST接口获取配置。
但客户端其实不克不及主动感知到配置的变更,从而主动去获取新的配置,这需要每个客户端通过POST办法触发各自的/refresh。
为解决配置信息能及时通知到各办事,同时减少每个微办事处理配置信息更新的庞杂度,为此我们通过消息总线来解决此问题,计划如下:
1.Git仓库、ConfigServer、以及微办事“ServiceA”、“ServiceB”的实例中都引入了SpringCloudBus,所以他们都连接到了RabbitMQ的消息总线上。
2.从Git仓库中配置的修改到倡议/bus/refresh的POST请求这一步可以通过Git仓库的WebHook来自动触发。
3./bus/refresh请求不再发送到具体办事实例上,而是发送给ConfigServer,并通过destination参数来指定需要更新配置的办事或实例。
4.由于所有连接到消息总线上的应用城市接受到更新请求,所以在WebHook中就不需要维护所有节点内容来进行更新,从而解决了通过WebHook来逐个进行刷新的问题。
7.6.散布式session
采取Redis作为缓存组件以及session的共享组件。
7.7.REST资源响应结构
制定规范和解析办法。
7.8.API调用链追踪
微办事架构上通过业务来划分办事的,通过REST调用,对外流露的一个接口,可能需要很多个办事协同才干完成这个接口功能,如果链路上任何一个办事呈现问题或者网络超时,城市形成招致接口调用失败。
随着业务的不竭扩张,办事之间互相调用会越来越庞杂。
SpringCloudSleuth主要功能就是在散布式系统中提供追踪解决计划,并且兼容支持了zipkin,你只需要在pom文件中引入相应的依赖即可。
7.9.单位测试
做微办事架构,进行系统测试的庞杂度较年夜,为包管产品质量与开发、测试效率,单位测试是必不成少的。
可采取Mock方法进行测试模拟,由继续集成进行自动化单位测试的执行以及结果输出。
7.10.代码调试
对单体架构系统,可直接本地化调试,但对微办事架构,接口间的调用需采取远程通讯的方法,也就是说被调用的办事必须启动后方可被调用,因此当微办事增多时,你可能需要启动年夜量的微办事或者web办事器,这给本地化调用与调试带来了困难。
解决计划待研究。
8.测试
8.1.自动化测试
单位测试:
由开发人员实现。
采取Mock方法进行测试模拟,由继续集成进行自动化单位测试的执行以及结果输出。
业务测试:
开发进行实现,测试也需考虑如何实现。
将多个办事或业务单位进行串连,测试一个完整的业务,甚至是不合业务之间组成的系统测试,需要采取相关的自动化测试框架执行,如RobotFramework自动化测试框架。
8.2.依赖测试
也可以称为接口测试或者契约测试,在微办事逐渐增多的情况下,如何有效包管办事之间能够依照接口的约定正常工作,即合适契约,成为微办事实施过程中,测试面临的主要挑战。
一、开发自动化的接口测试工具,
1、检测接口是否满足约定
2、检测接口是否产生变更
3、检测接口是否可以正常被调用。
二、测试办法:
采纳基于消费者驱动的契约测试,测试架构如下:
其优势如下:
从价值实现的角度界说契约
从消费者使用契约的角度出发,首先包管消费者基于此契约是可以实现