使用Spring Cloud需要了解一些概念
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需要了解一些概念的更多相关文章
- Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收
前言 不写随笔的日子仿佛就是什么都没有产出一般--上节说到要学Spring Cloud Bus,这里发现按照官方文档的顺序反而会更好些,因为不必去后边的章节去为当前章节去打基础,所以我们先学习Spri ...
- Spring Cloud Stream如何消费自己生产的消息?
在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...
- Spring Cloud(中文版)
原文链接:Spring Cloud I.云原生应用 Spring Cloud上下文:应用上下文服务 2.1.Bootstrap应用程序上下文 2.2.应用程序上下文层次结构 2.3.更改Bootstr ...
- Spring Cloud Stream如何消费自己生产的消息
在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...
- spring Cloud网关之Spring Cloud Gateway
Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...
- Spring Cloud Gateway应用篇(十三)
一.概述 在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成.其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能. ...
- Spring Cloud微服务笔记(一)微服务概念
微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...
- Spring Cloud Stream 核心概念
Spring Cloud Stream简介 Spring cloud stream是一个构建与Spring Boot和Spring Integration之上的框架,方便开发人员快速构建基于Messa ...
- Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别
注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...
随机推荐
- zookeeper 搭建
zookeeper 版本为zookeeper 3.4.8 操作系统为ubuntu 12.04 64位 zookeeper 单机搭建 解压zookeeper 包 .tar.gz -C /root/sof ...
- 解决DDOS攻击生产案例
根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP. 当然各个公司的IP并发数各有不同,上面只是举例说明. 因为我的Nginx的WEB日 ...
- MyBatist庖丁解牛(二)
站在巨人的肩膀上 https://blog.csdn.net/xiaokang123456kao/article/details/76228684 一.概述 我们知道,Mybatis实现增删改查需要进 ...
- Unable to load script from assets 'index.android.bundle'.Make sure your bundle is packaged correctly or you're running a packager server
curl -k 'http://localhost:8081/index.android.bundle?platform=android' > android/app/src/main/asse ...
- 1-zookeeper基本原理和使用
1 分布式应用 1.1 分布式系统原理 在一个网络中,每台服务器上各跑一个应用,然后彼此连接起来就组成一套系统.比如提供完成的游戏服务,需要有认证应用,道具应用,积分应用,游戏主应用等,应用并非跑在一 ...
- [软件工程基础]2017.10.30 第三次 Scrum 会议
决议 游心与李煦通沟通生成报告脚本问题,并调试相应代码 李煦通部署服务器,并做一定安全检查 石奇川设计实验流程和题库前端页面 王嘉睿爵测试网站基本流程,提出关于用户体验方面的建议 刘子渊阅读代码,为机 ...
- 解决XP“不是有效Win32程序” 不是改Platform toolset
背景 最近在写一个窗口程序,想在Windows XP上也能跑.先用vs 2015的App Wizard生成了一个实例窗口程序,按照网上大部分攻略,将 "Properties - Genera ...
- CF #541div2 E
题目本质:忽略串的变化,只记载26个字母的相关变化. 解决方法: 在上一次与本次的转移过程中,情况并不多,主要取决于本次串的首尾字母,若不是本次的首尾字母,会被置1:如果是的话,分情况接一下并更新.另 ...
- 【aspnetcore】用ConcurrentQueue实现一个简单的队列系统
第一步:定义队列服务接口 public interface ISimpleQueueServer { /// <summary> /// 添加队列消息 /// </summary&g ...
- nginx之location简单匹配总结
location匹配规则与优先级 = 精确匹配,匹配成功则停止匹配 ^~ 前缀普通字符匹配,匹配成功则停止匹配 ~ 正则匹配,区分大小写:多个正则按顺序匹配 ~* 正则匹配,不区分大小写:多个 ...