micro-service(2):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,路径分支,用户名,密码,文件版本等。

原文地址:https://www.cnblogs.com/leo-chen-2014/p/9393348.html

时间: 2024-09-30 03:31:40

micro-service(2):Spring Cloud科普扫盲的相关文章

基于Spring Cloud的微服务落地

请点击此处输入图片描述 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的微服务框架就是集成了包括Netfilix OSS以及Spring的Spring Cloud.它包括: Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以实现应用配置的外部化存储,支持客户端配置信息刷新.加密/解密配置内容等. Spring Clo

Spring Cloud 子项目介绍

Spring Cloud由以下子项目组成. Spring Cloud Config 配置中心——利用git来集中管理程序的配置. 项目地址:https://spring.io/projects/spring-cloud-config Spring Cloud Netflix 集成众多Netflix的开源软件,包括 Eureka.Hystrix.Zull.Archaius 等. 项目地址:https://spring.io/projects/spring-cloud-netflix Eureka

Spring Cloud Gateway入坑记

Spring Cloud Gateway入坑记 前提 最近在做老系统的重构,重构完成后新系统中需要引入一个网关服务,作为新系统和老系统接口的适配和代理.之前,很多网关应用使用的是Spring-Cloud-Netfilx基于Zuul1.x版本实现的那套方案,但是鉴于Zuul1.x已经停止迭代,它使用的是比较传统的阻塞(B)IO + 多线程的实现方案,其实性能不太好.后来Spring团队干脆自己重新研发了一套网关组件,这个就是本次要调研的Spring-Cloud-Gateway. 简介 Spring

spring cloud 2.x版本 Gateway动态路由教程

摘要 本文采用的Spring cloud为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的几篇Spring cloud Gateway文章的实现. 参考 Gateway路由网关教程 Gateway自定义过滤器教程 前言 写了几篇关于Spring Cloud Gateway的文章后发现,Gateway涉及的知识范围太广了,真是深刻体会了"一入Spring cloud深似海". 现实生产环境中,使用Spring Cloud Gateway都是作为所有流量

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Building Microservices with Spring Cloud - Service discovery

What is service discovery and why we use it? A way for service to register it self A way for a service to deregister it self A way for a client to find other services A way to check the health of a service and remove unhealthy instances Spring Cloud

没使用Spring Cloud的版本管理导致Eureka服务无法注册到Eureka服务注册中心

创建了一个Eureka Server的服务注册集群(两个Eureka服务),都能相互注册,写了一个Eureka客户端服务无法注册到服务发现注册中心 注册中心1: 注册中心2: 服务正常: pom依赖文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://

Spring Cloud官方文档中文版-服务发现:Eureka服务端

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Service Discovery: Eureka Server 服务发现:Eureka服务端 How to Include Eureka Server 如何创建Eurek

Spring Cloud官方文档中文版-声明式Rest客户端:Feign

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Declarative REST Client: Feign 声明式Rest客户端:Feign Feign is a declarative web service client. It