您的位置:首页 > 编程语言 > Java开发

我们的微服务架构及Spring Cloud各个组件的概要

2018-01-21 22:46 253 查看

初识spring cloud

我们目前的架构



我们将来的架构



什么是Spring Boot

Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置。

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架(不知道这样比喻是否合适)。

更多介绍

springboot学习资料汇总

什么是Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,Spring Cloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,Spring Cloud做为大管家就需要提供各种方案来维护整个生态。

Spring Cloud就是一套分布式服务治理的框架,既然它是一套服务治理的框架,那么它本身不会提供具体功能性的操作,更专注于服务之间的通讯、熔断、监控等

springcloud学习资料汇总

为什么选择使用spring cloud

随着项目的发展和业务的增加,单体应用面对的业务需求更加广泛,不断扩大的需求使得单体应用变的越来越臃肿。

松耦合性,服务之间功能独立,能够独立部署,服务之间相互依赖

高扩展性,分散资源,团队协同工作,可无限扩展,更高的代码重用率。

作为一个新手,准备实施微服务框架时,为了避免前辈踩过的坑,在一些核心问题的解决方案上,我们的选择多之又多,这必然会导致在做技术选型的初期,需要花费巨大的时间调研,分析与实验精力

Spring Cloud整合了来自不同公司或组织的诸多开源框架。它不仅是解决微服务中的某一个问题,而是一个解决微服务架构实施的综合性解决框架。

Spring Cloud具有非常强大的技术后盾Spring,具有非常活跃的技术社区,频繁的优化和更新。

spring cloud目前国内使用情况

中国联通子公司 http://flp.baidu.com/feedland/video/?entry=box_searchbox_feed&id=144115189637730162&from=timeline&isappinstalled=0

上海米么金服

指点无限(北京)科技有限公司

易保软件 目前在定制开发中http://www.ebaotech.com/cn/

广州简法网络

深圳睿云智合科技有限公司 持续交付产品基于Spring Cloud研发 http://www.wise2c.com

猪八戒网,目前调研中

上海云首科技有限公司

华为 整合netty进来用rpc 包括nerflix那套东西 需要注意的是sleuth traceid的传递需要自己写。tps在物理机上能突破20w

东软

南京云帐房网络科技有限公司

四众互联(北京)网络科技有限公司

深圳摩令技术科技有限公司

广州万表网

视觉中国

上海秦苍信息科技有限公司-买单侠

爱油科技(大连)有限公司 爱油科技基于SpringCloud的微服务实践

广发银行

卖货郎(http://www.51mhl.com/

拍拍贷

甘肃电信

新浪商品部

春秋航空

冰鉴科技

万达网络科技集团-共享商业平台-共享供应链中心

网易乐得技术团队

饿了么某技术团队

高阳捷迅信息科技–话费中心业务平台–凭证查询及收单系统

组件及功能介绍

spring-boot-actuator

actuator是springboot中一个用来做系统健康检测的一个模块,它提供一个resetful的api接口,可以将系统运行过程中的磁盘空间、线程数、以及程序连接的数据库情况通过json返回,然后再结合预警、监控模块进行实时系统监控。

- 功能:

HTTP方法路径描述鉴权
GET/autoconfig查看自动配置的使用情况true
GET/configprops查看配置属性,包括默认配置true
GET/beans查看bean及其关系列表true
GET/dump打印线程栈true
GET/env查看所有环境变量true
GET/env/{name}查看具体变量值true
GET/health查看应用健康指标false
GET/info查看应用信息false
GET/mappings查看所有url映射true
GET/metrics查看应用基本指标true
GET/metrics/{name}查看具体指标true
POST/shutdown关闭应用true
GET/trace查看基本追踪信息true
配置文件增加:

management.security.enabled=false


pom文件增加:

<dependency>
<
4000
;groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>






spring-boot-actuator 学习

spring-cloud-netfix

spring-cloud-eureka

云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

服务注册 每个服务单元向注册中心登记自己提供的服务,将主机与端口号,版本号,通讯协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。另外,服务中心还需要以心跳的方式去检测清单中的服务是否可用,如不可用,需要从服务清单中删除,达到删除故障服务的效果。

服务发现 由于在服务治理下运作,服务间的调用不再采用通过具体的实例地址来实现,而是通过向服务服务名发起请求调用实现(ribbon),服务注册中心返回服务名对应的所有的实例清单。



注意:

服务续约任务调用时间间隔,默认30s

服务缓存清单默认每30s更新一次

服务失效时间默认90s

默认每60s讲当前清单中超过90s(没有续约)的服务剔出去

自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制。(Eureka自我保护机制,通过配置 eureka.server.enable-self-preservation来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置)

1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。


spring-cloud-zuul

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

过滤器

filterType:过滤类型

返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
* pre:路由之前
* routing:路由之时
* post: 路由之后
* error:发送错误调用


filterOrder:过滤器的执行顺序

shouldFilter:判断该过滤器

run:过滤器具体的逻辑

请求路由

cookie与头信息

Spring Cloud Zuul 在请求路由时,会过滤掉HTTP请求头中的一些敏感信息,包括Cookie、Set-Cookie、Authorization三个属性

设置方法:

对指定路由开启自定义敏感头

zuul.routes..customSensitiveHeaders=true

将指定路由的敏感头信息设置为空

zuul.routers..sensitiveHeaders=

禁用过滤器

​zuul...disable=true

其中SimpleClassName代表过滤器的类名,filterType代表过滤器类型

动态路由

动态过滤器

spring-cloud-ribbon

提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。

通过RestTemplate实现面向服务接口的调用。支持GET,POST,PUT,DELETE 。可以返回对象。

负载均衡策略

RandomRule 从实例列表随机选取。选择逻辑在一个while(server == null)循环之内,正常情况下都应该选出一个服务示例,如果出现死循环获取不到服务实例,则有可能存在并发的Bug

RoundRobinRule(默认) 按照线性轮循一次选择每个实例。随机次数超过十次,结束尝试

RetryRule 内部还定义了一个IRule,默认RoundRobinRule。在指定时间内反复尝试,超时返回null

weightedResponseTimeRule 基于RoundRobinRule增加了根据实例的运行情况来计算权重,然后根据权重挑选实例。主要有三个核心内容:

定时任务

每30s执行一次权重计算

权重计算

记录每个实例的统计信息,累加所有实例的平均响应时间,得到总平均响应时间totalResponseTime

循环所有的实例计算其权重,weightSoFar+=totalResponseTime - 实例平均响应时间,其中weightSoFar初始化值为0。每个实例权重结果保存到ArrayList currentWeights中。

实例选择

判断最后一个实例的权重是否< 0.001d,若小于,采用RoundRobinRule策略

生成一个[0,最大权重值)区间内的随机数。

遍历权重清单currentWeights,若权重大于等于随机的得到的数值,就选择这个实例

其他

spring-cloud-Feign

Feign是一种声明式、模板化的HTTP客户端。

Spring Cloud Feign 在RestTemplate的基础上作了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。我们只需要创建一个接口并用注解的方式来配置它。

spring-cloud-hystrix

熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

在分布式架构中,当某个服务单元发生故障(类似电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝), 想调用方返回一个错误响应,而不是长时间等待,这样就不会使得线程因调用故障服务被长时间占用不放,避免了故障在分布式系统中的蔓延

针对这一机制,Spring Cloud Hystrix实现了断路器,线程隔离等一系列服务保护功能。它也是基于Netfix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

​ Hystrix具备:

服务降级

服务熔断

请求总数(默认20)

错误百分比(默认50)

线程和信号隔离

请求缓存

请求合并

服务监控

成功数,短路/熔断数,超时数,线程拒绝数,失败/异常数,最近10s的错误比例,请求频率,断路器状态,百分位延迟统计,集群下的主机报告



集群监控(Turbine)

spring-cloud-config

随着微服务架构的实施,我们拆分出了很多的微服务以及子系统,各种配置信息都以明文形式配置在配置文件中,同时各种定时任务也散落在各个微服务以及子系统中,非常难管理

git

配置文件内容

#spring.cloud.config.server.git.uri:配置git仓库地址

#spring.cloud.config.server.git.searchPaths:配置仓库路径

#spring.cloud.config.label:配置仓库的分支

#spring.cloud.config.server.git.username:访问git仓库的用户名

#spring.cloud.config.server.git.password:访问git仓库的用户密码


例子:

spring.cloud.config.server.git.uri=https://github.com/super-potato/spring-cloud-config.git
spring.cloud.config.server.git.searchPaths=springcloudconfig
spring.cloud.config.label=master
spring.cloud.config.server.git.username=super-potato
spring.cloud.config.server.git.password=






http请求地址和资源文件映射如下

#/{application}/{profile}[/{label}]

#/{application}-{profile}.yml

#/{label}/{application}-{profile}.yml

#/{application}-{profile}.properties

#/{label}/{application}-{profile}.properties


例子:

spring.application.name=server-zuul
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8888/ server.port=8088




svn

spring-cloud-bus

事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

消息代理是一种消息验证、传输、路由的架构模式。它在应用程序之间起到通信调度并最小化应用之间的依赖的作用,使得应用程序可以高效地解耦通信过程。

应用场景:

将消息路由到一个或多个目的地

消息转换为其他的表现方式

执行消息聚焦、消息的分解,并将结果发送到其他的目的地,然后重新组合相应返回给消息用户。

调用web服务来检索数据

响应错误事件

使用发布-订阅模式来提供内容或基于主题的消息路由

支持的两个消息中间件:

kafka

属性名说明默认值
spring.cloud.stream.kafka.binder.brokersKafka的服务端列表localhost
spring.cloud.stream.kafka.binder.defaultBrokerPortKafka服务端的默认端口,当
brokers
属性中没有配置端口信息时,就会使用这个默认端口
9092
spring.cloud.stream.kafka.binder.zkNodesKafka服务端连接的ZooKeeper节点列表localhost
spring.cloud.stream.kafka.binder.defaultZkPortZooKeeper节点的默认端口,当
zkNodes
属性中没有配置端口信息时,就会使用这个默认端口
2181
rabbitMQ

属性名说明默认值
spring.rabbitmq.hostlocalhost
spring.rabbitmq.port5672
spring.rabbitmq.usernamesang
spring.rabbitmq.password123456

spring-cloud-stream

消息驱动微服务。数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。

spring-cloud-sleuth

日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。

spring-cloud-zookeeper

操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。

spring-cloud-CLI

基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。

spring-docker

使用docker构建微服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐