Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具,它为基于JVM的微服务开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一站式的开发框架。而上文提到的微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过RESTful API方式进行通信。

一次典型的对基于Spring Cloud架构的访问如下

#1 client请求通过统一的API智能路由网关Zuul来访问内部服务,这样客户端就不用知道服务端的详细地址或者相关信息,仅仅通过API gateway就可以访问后端服务,同时zuul可以对请求进行鉴权或者验证。

#2 智能路由网关Zuul接收到请求后,从服务注册发现中心Eureka获取可用服务的host列表,通过负载均衡算法计算后获取服务实例的host并转发请求;这样内部服务于外部调用方,或者内部服务之间的依赖耦合转变成了对Eureka的依赖。

#3 获取到指定类型的服务后由客户端负载均衡器Ribbon统一分发到后端service具体实例。

#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进行的请求都会被其拦截并动态分配服务实例 。

使用spring cloud hystrix 实现服务容错保护
微服务架构中server之间可能存在相互调用的依赖,服务A需要调用服务B,同时服务A也为服务C提供服务;如果因为某些网络故障导致服务A队服务B的调用不可达,最终导致服务A也不可用,这样的情况称为服务故障雪崩,spring cloud Hystrix通过引入断路由的故障监控,在服务不可用并且满足某些条件的前提下,向服务调用方返回一个错误响应,而不是一味地等待。
@EnableCircuitBreaker:标注于服务调用方的启动类,表示开启断路由功能
@HystrixCommand(fallbackMethod=”failCallBackFunc”):标注于服务提供方的目标方法上,表示如果目标方法调用超时或者失败的话,返回名字为failCallBackFunc的资源方法。

使用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,路径分支,用户名,密码,文件版本等。

使用Spring Cloud需要了解一些概念的更多相关文章

  1. Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收

    前言 不写随笔的日子仿佛就是什么都没有产出一般--上节说到要学Spring Cloud Bus,这里发现按照官方文档的顺序反而会更好些,因为不必去后边的章节去为当前章节去打基础,所以我们先学习Spri ...

  2. Spring Cloud Stream如何消费自己生产的消息?

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  3. Spring Cloud(中文版)

    原文链接:Spring Cloud I.云原生应用 Spring Cloud上下文:应用上下文服务 2.1.Bootstrap应用程序上下文 2.2.应用程序上下文层次结构 2.3.更改Bootstr ...

  4. Spring Cloud Stream如何消费自己生产的消息

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  5. spring Cloud网关之Spring Cloud Gateway

    Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...

  6. Spring Cloud Gateway应用篇(十三)

    一.概述 在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成.其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能. ...

  7. Spring Cloud微服务笔记(一)微服务概念

    微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...

  8. Spring Cloud Stream 核心概念

    Spring Cloud Stream简介 Spring cloud stream是一个构建与Spring Boot和Spring Integration之上的框架,方便开发人员快速构建基于Messa ...

  9. Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别

    注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...

随机推荐

  1. Suse 11 sp4 安装Oracle 11g

    环境信息 suse 11 sp4 64位 企业版配置:虚拟机,1U4CORE,4GB内存,100GB存储(实际可用空间20GB) linux环境配置修改 在安装oracle之前,需要先对linux 的 ...

  2. PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...

  3. C# 基础之类的实例化

    使用new运算符跟类的实例构造函数来完成实例化 类的实例对象是对类的具体化

  4. 关于presentViewController 后调用pushViewController

    错误代码: LoginViewController *loginVc = [[LoginViewController alloc] int]; [self presentViewController ...

  5. CF #536div2E(dp)

    简单入门版:洛谷1280 时间交叉和倒序处理的思路是相同的,相较之下此题更多的条件是:1.每个任务可以在很多个时间点中选一个去做:2.会有捣乱. 解决方法:1.每个时间点选哪个根据规则的话是固定的可预 ...

  6. SpirngMVC-JSON

    Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下: 配置json转换器 在注解适配器中加入messa ...

  7. layer窗口抖动

    详细学习网址 http://www.layui.com/doc/modules/layer.html#use ..................................... //使用方法 ...

  8. 74HC14D(6反向施密特触发器)

    74HC14D:6反向施密特触发器:延迟特性,反向特性,整形特点. 施密特触发器是具有特殊功能的非门,当加在它的输入端A的电压逐渐上升到某个值时(正阈值电压),输出端Y会突然从高电平跳到低电平,而当输 ...

  9. 牛客网Java刷题知识点之什么是JSP、JSP有哪些优点、JSP的9大内置对象、JSP的四大域对象、JSP的四种范围

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21175&query=&asc= ...

  10. php后端程序开发学习网站梳理

    博主只列举自己经常用到的: 看教学视频:慕课网,网易云课堂,百度传课 看博文和知识点:csdn 看源码:github 刷题:codewars 学习框架:thinkphp官网 下载相关资源:csdn 看 ...