SpringCloud 组件概述
在 SOA
时代,用户、资讯、图片资源、产品。。。等等等等一系列的 服务
,我们都可以用 SpringBoot
来实现,做成一个个的服务,随着服务的数量变多,比如到达100个以后,可能还会面临 分布式服务
的部署,这样服务的数目就更是 翻
了一倍,如何方便的统一的可视化的管理
这些微服务,保证这些服务的高可用性
至关重要,SpringCloud
就是一种 服务治理
的解决方案。其中包含了众多的组件帮助使用者方便的完成 服 务注册和发现
、服务调用方式
、断路器
、负载均衡
、服务路由和过滤
、分布式配置
、集群选主
,分布式消息
等功能。下面将一一介绍这些组件。
注册中心 Eureka
Eureka
意为 古希腊语:发现
。 Eureka 由 Eureka Server
和 Eureka Client
组成,Eureka Server 是服务的注册中心,用于管理注册服务的列表。
同时 Eureka Server
也可以做成高可用的集群模式,Eureka Server
采用的是 Peer to Peer
对等通信,这是一种去中心化的架构,没有 Master/Slave
的概念,节点之间通过互相注册来提高注册中心集群的可用性,在eureka.client.serviceUrl.defaultZone
中需要相互注册(N注册其他N-1个)。
Eureka 的自我保护模式
当注册中心每分钟收到心跳续约数量低于一个阀值,instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),就会触发自我保护。不再注销任何服务实例,默认的自我保护系数为0.85。
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
调用端负载均衡 Ribbon
Ribbon : 把。。。撕成条状。
在 Ribbon
的入口方法加上 @LoadBalanced
注解,添加负载均衡功能,再注册到Eureka Client ,这样 Ribbon与 Eureka 一起用的时候,Ribbon负载均衡使用的列表就是 Eureka Server
中注册的服务实例列表。一般进行负载均衡之后,Ribbon会通过 RestTemple 进行服务调用从而消费服务。
断路器 Hystrix
在微服务架构中,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
@HystrixCommand(fallbackMethod = "hiError")
在方法中添加注解,实现断路返回字符串,而不是等待响应超时的结果
服务消费者 Feign
Feign 默认集成了 Ribbon,并与Eureka结合,默认实现了负载均衡的效果,是基于接口的注解。同样注册到 Eureka Server
中去。在启动类加上 @EnableFeignClients注解
,在接口处指定 @FeignClient(value = "调用的服务名称")
,加上Ribbon 完成 对别调用服务的负载均衡效果。如果再加上 ,fallback = SchedualServiceHiHystric.class
就可以完成上面的断路器 Hystrix 的功能,
路由网关 Zuul
zuul:
routes:
api-a:
path: /api-a/**
serviceId: service-ribbon
api-b:
path: /api-b/**
serviceId: service-feign
很明显,api-a
的路由会分发给 service-ribbon
,而 api-b
的路由会分发给 service-feign
。
实现 ZuulFilter
接口,可以定义参数验证,做安全验证功能。
分布式配置中心 Spring Cloud Config
顾名思义,这是一个保存各个服务的配置文件的组件。远端可以放在 Git仓库
中 。这个组件中分为两个角色 ConfigServer
和 ConfigClient
。
单独开一个 Eureka Server 作为分布式配置中心的 注册中心8889,用于管理。
在 ConfigServer 中
spring.application.name=config-server
server.port=8888
spring.cloud.config.server.git.uri=http://gitlab.imacco.com/siwei/ScloudConfig.git
spring.cloud.config.server.git.searchPaths=
#spring.cloud.config.label=master
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=
eureka.client.service-url.defaultZone=http://localhost:8889/eureka/
在Git仓库,我的配置文件是
当访问 /foo/dev 时就会访问 foo-dev.yml 文件,解析其中的配置 foo: 1
。
http请求地址和资源文件映射如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
ConfigClient
的配置如下:
spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
#spring.cloud.config.uri=http://localhost:8888/
eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
server.port=8881
入口类
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi(){
return foo;
}
当访问: http://localhost:8881/foo/dev
就会得到 1
。
8881 上运行的 config-client 从 8889 找到了config-server 8889,获取了foo属性,而 8889 config-server则是从 git仓库获得 foo-dev 文件 。
获取的 value 需要在配置文件中声明 不然会报解析错误。
下一篇: SpringCloud微服务概述
推荐阅读
-
php数组的概述及分类与声明代码演示_PHP教程
-
Javascript-EXTJS组件开发完整代码
-
在vue中如何实现图片loading组件
-
php通过COM类调用组件的实现代码_php技巧
-
4.1 段落样式概述 4.2 下划线、删除线和顶划线text-decoration
-
windows下面php5.2.17和php5.3.18和php5.4.8各个版本的imagick组件下载
-
微信小程序 loading 组件实例详解
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
数据库事务概述
-
C Primer Plus 第二章——C语言概述