SpringCloud架构概览
theme: juejin
highlight: SpringCloud
一. 概述:
Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的一些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。它们将在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑,裸机数据中心以及诸如Cloud Foundry之类的托管平台。
二. 特征
Spring Cloud专注于为典型的用例和可扩展性机制(包括其他用例)提供良好的开箱即用体验。
1. 分布式/版本化配置
2. 服务注册和发现
3. 路由
4. 服务到服务的通话
5. 负载均衡
6. 断路器
7. 全局锁
8. 领导选举和集群状态
9. 分布式消息传递
三. Spring Cloud Netflix
3.1 概述:
Spring Cloud Netflix通过自动配置并绑定到Spring Environment和其他Spring编程模型习惯用法,为Spring Boot应用程序提供Netflix OSS集成。使用一些简单的批注,您可以快速启用和配置应用程序内部的通用模式,并使用经过实战检验的Netflix组件构建大型分布式系统。提供的模式包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡(Ribbon)。
3.2 特征:
Spring Cloud Netflix功能:
1. 服务发现:可以注册Eureka实例,并且客户端可以使用Spring托管的Bean发现实例
2. 服务发现:可以使用声明性Java配置创建嵌入式Eureka服务器
3. 断路器:Hystrix客户端可以使用简单的注释驱动的方法装饰器来构建
4. 断路器:具有声明性Java配置的嵌入式Hystrix仪表板
5. 声明式REST客户端:Feign创建一个用JAX-RS或Spring MVC注释修饰的接口的动态实现。
6. 客户端负载均衡器:功能区
7. 外部配置:从Spring Environment到Archaius的桥梁(使用Spring Boot约定启用Netflix组件的本机配置)
8. 路由器和过滤器:Zuul过滤器的自动注册,以及用于反向代理创建的简单配置约定
摘用:spring官网
3.3 Eureka
3.3.1 Eureka详解 (参考上图)
renewal:续约
Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址(和Dubbo的注册中心类似)。
提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约
消费者:服务调用方,会定期去Eureka拉取服务列表,然后使用负载均衡算法选出一个服务进行调用。
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
首先,Eureka是一个注册中心,和zookeeper功能类似,其中不同的一点是zookeeper是一个软件,启动直接可以使用,而Eureka是需要我们自己开发的。
3.3.2 Eureke使用(服务端)
1. Eureka注册中心所需依赖
<!-- Eureka服务端 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
复制代码
2. 启动类加上一个注解
@SpringBootApplication
//开启Eureka注册服务
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
复制代码
3. 编辑项目配置文件(application.properties)
# 服务端口设置
server.port=8080
# 网关服务名称
spring.application.name=DEMO-API-SERVER
# eureka显示名称以及相关配置
eureka.instance.instance-id=${eureka.instance.ip-address}:${spring.application.name}:${eureka.instance.nonSecurePort}
eureka.client.service-url.defaultZone=http://127.0.0.1:8888/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=127.0.0.1
复制代码
3.3.3 Eureke使用(客户端)
1. Eureka注册中心所需依赖
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
复制代码
2. 启动类加上一个注解
@SpringBootApplication
//开启Eureka注册服务
@EnableEurekaClient
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
复制代码
第三步:再次访问http://127.0.0.1:8888可以看到有两个服务注册到Eureka上
3.4 Zuul网关
3.4.1 概述:
来自于客户端的请求或者服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul所有服务的统一入口。
3.4.2 Zuul使用
1. Zuul服务端需要引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
复制代码
2. Zuul服务端需要在启动类加上一个注解
@SpringBootApplication
// 开启Eureka注册服务
@EnableEurekaClient
// 开启Zuul的网关功能
@EnableZuulProxy
// 开启Eureka的客户端发现
@EnableDiscoveryClient
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
复制代码
3. 编辑项目配置文件(application.properties)
# 添加路由前缀(这里是映射路径)
zuul.prefix.routes.test-service=/test-service/**
# 开启熔断机制,超过六秒即开启熔断机制,网关内的时间排序:zuul的通信时间 > hystrix熔断时间 > retry重试时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
复制代码
test-service 这里是在 Eureka 上注册的一个服务,这里配置了他的映射路径。路径就要以 /api/test-service 开头的请求都会被分发到该服务上。
Zuul 是集成了另外一个组件负载均衡的组件 Ribbon ,所以,如果 Eureka 上有两个名称为 test-service 的服务,可以自动的进行负载均衡,默认的策略是轮询
熔断机制:
Zuul 还集成了 Hystix 熔断机制。但是所有的超时策略都是走的默认值,比如熔断的超时时间只有6S,也就是说,访问一个服务,如果6s没有响应,就判定为异常,我们也可以自己设置超时时间
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END