Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具,它为基于JVM的微服务开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操做提供了一站式的开发框架。而上文提到的微服务架构就是将一个完整的应用从数据存储开始垂直拆分红多个不一样的服务,每一个服务都能独立部署、独立维护、独立扩展,服务与服务间经过RESTful API方式进行通讯。web
一次典型的对基于Spring Cloud架构的访问以下算法
#1 client请求经过统一的API智能路由网关Zuul来访问内部服务,这样客户端就不用知道服务端的详细地址或者相关信息,仅仅经过API gateway就能够访问后端服务,同时zuul能够对请求进行鉴权或者验证。spring
#2 智能路由网关Zuul接收到请求后,从服务注册发现中心Eureka获取可用服务的host列表,经过负载均衡算法计算后获取服务实例的host并转发请求;这样内部服务于外部调用方,或者内部服务之间的依赖耦合转变成了对Eureka的依赖。后端
#3 获取到指定类型的服务后由客户端负载均衡器Ribbon统一分发到后端service具体实例。api
#4 后端独立的service之间经过Feign进行通讯处理业务信息。
#5 断路由Hystrix负责处理服务超时熔断,从而避免由于服务提供者不可用致使的服务消费者不可用的雪崩效应。
#6 集群监控Turbine用于监控服务间的调用和熔断相关指标。服务器
使用Spring Boot快速构建spring app
随着spring整合套件的增多,配置文件也愈来愈多,spring boot用于简化冗余的配置文件,基于约定和包路径自动进行配置;spring-boot-starter-parent表示引用父项目模板中的缺省依赖和默认配置(好比src/main/resources/application.properties为spring boot项目的缺省配置文件);spring-boot-starter-web表示引入spring web全栈模块,包含spring MVC和Tomcat;spring-boot-maven-plugin表示能够直接经过mvc命令控制spring boot的启停。
@RestController:于sprint 4.0引入,是@Controller和@ResponseBody的集合,表示定义支持REST接口的控制器。
@EnableAutoConfiguration:启用基于约定和包路径的自动配置
@SpringBootApplication:基于spring boot的全家桶配置网络
使用spring cloud eureka进行服务注册和发现管理
随着系统内服务的增长,维护服务实例的访问host:port成为一件很是费时费力的事情,各类服务的host:port可能随时变化,而这类变化须要实时被记录下来,不然可能致使服务不可用;eureka就是用于充当service provider和service client之间的一个呼叫中心,提供服务注册和服务发现功能,让provider和client彻底解耦独立,不互相依赖。
@EnableEurakaServer:建立并启动一个服务注册中心。
@EnableDiscoveryClient:将当前app注册成为eureka的客户端应用(自身成为eureka管理的一个服务提供方)并具备发现其余服务的能力。
RestTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody():生成GET请求(也提供了postForEntity, put, delete请求的封装),eureka会返回一个Map包含hello-service和服务实例的地址列表,而后经过使用RestTemplate调用指定的服务HELLO-SERVICE/hello,spring cloud会将服务名字转换成对应的服务实例地址,string.class表示返回结果的数据类型;架构
使用spring cloud ribbon实现客户端负载均衡
一般所说的负载均衡通常指的是服务端负载均衡(硬件如F5,软件如Nginx),做用于服务端,未来自客户端的请求按必定策略分配给内部的服务实例;而客户端负载均衡则是做用于客户端,每个客户端均可以从注册中心获取一份可用服务实例的清单,经过客户端的负载均衡实现对系统的高可用、网络压力的缓解和处理能力的扩容。
经过spring cloud的封装能够将面向服务的REST模板请求自动封装成客户端负载均衡的服务调用;因为spring cloud内部基本都是基于REST的通讯,而服务方基本均可以作集群部署,所以ribbon是做为一个工具框架应用于大部分spring cloud的服务中。
@LoadBalanced:使用LoadBalancerInterceptor对Http请求进行客户端的负载均衡,全部经过restTemplate进行的请求都会被其拦截并动态分配服务实例 。mvc
使用spring cloud hystrix 实现服务容错保护
微服务架构中server之间可能存在相互调用的依赖,服务A须要调用服务B,同时服务A也为服务C提供服务;若是由于某些网络故障致使服务A队服务B的调用不可达,最终致使服务A也不可用,这样的状况称为服务故障雪崩,spring cloud Hystrix经过引入断路由的故障监控,在服务不可用而且知足某些条件的前提下,向服务调用方返回一个错误响应,而不是一味地等待。
@EnableCircuitBreaker:标注于服务调用方的启动类,表示开启断路由功能
@HystrixCommand(fallbackMethod=”failCallBackFunc”):标注于服务提供方的目标方法上,表示若是目标方法调用超时或者失败的话,返回名字为failCallBackFunc的资源方法。app
使用spring cloud feign整合ribbon和hystrix的功能进行声明式服务调用
通常应用中使用spring cloud ribbon和spring cloud hystrix都是同时出现,为了简化配置流程,使用feign统一配置客户端负载均衡和微服务容错保护。
@FeignClient(“target-service”):标注于目标服务的资源类,绑定服务名并指定@RequestMapping资源,
@EnableFeignClients:标注于服务调用方的启动类,而后经过@Controller就能够直接访问对应的资源,而且拥有负载均衡和服务容错保护功能。
使用spring cloud zuul实现对外API网关服务
外部请求访问内部服务的时候每每须要经过F5或者Nginx进行路由和负载均衡,最终发送到对应的服务实例上,运维人员须要手动维护路由规则、负载均衡规则和服务实例的地址,随着内部复杂性的增长,须要一个相似façade的服务对外部请求进行统一处理。Zuul不只能够实现路由和负载均衡(自动集成了ribbon和hystrix),还能够经过添加过滤器的方式实现用户登陆验证和访问鉴权的功能。
@EnableZuulProxy:开启zuul的API网关服务功能,并经过在application.properties中添加路由规则的配置就能够实现转发功能:
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:8081/
可是仍是推荐使用与eureka结合使用service id的方式,全部来自外部的请求首先会到达zuul实现的API网关服务器集群,而后根据路由规则找到request对应的serviceId,接着根据eureka注册中心获取serviceId和host:port list的mapping,而且自动实现负载均衡和断路由,最终将请求送到微服务的实例上。
zuul.routes.api-b-url.path=/api-b-url/**
zuul.routes.api-b-url.serviceId=helo-service
在zuul API网关上经过继承ZuulFilter并实现抽象方法来实现拦截器的定义:
public String filterType():表示过滤器在请求的那个生命阶段执行,pre类型实现请求鉴权和路由映射,routing类型实现请求转发到具体的实例,post类型处理请求返回的结果,error类型处理蒸锅过程里的异常错误。
public int filterOrder():当一个生命阶段有多个过滤器的时候须要决定执行的前后顺序
public boolean shouldFilter():当前的过滤器是否须要生效
public Object run():具体过滤的操做逻辑
使用spring cloud config实现集中式的外部配置支持随着spring cloud集群的增大,各项配置也须要统一进行管理和统一配置,spring cloud config能够实现经过一个做为微服务的实例统一从GIT仓库获取配置文件。@EnableConfigServer:标注微服务实例的启动类,而且在appication.properties中配置GIT的访问URL,路径分支,用户名,密码,文件版本等。