原文:SpringCloud 组件概述

SOA 时代,用户、资讯、图片资源、产品。。。等等等等一系列的 服务 ,我们都可以用 SpringBoot 来实现,做成一个个的服务,随着服务的数量变多,比如到达100个以后,可能还会面临 分布式服务 的部署,这样服务的数目就更是 了一倍,如何方便的统一的可视化的管理这些微服务,保证这些服务的高可用性至关重要,SpringCloud 就是一种 服务治理的解决方案。其中包含了众多的组件帮助使用者方便的完成 服 务注册和发现服务调用方式断路器负载均衡服务路由和过滤分布式配置集群选主分布式消息等功能。下面将一一介绍这些组件。

注册中心 Eureka

Eureka 意为 古希腊语:发现 。 Eureka 由 Eureka ServerEureka 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仓库 中 。这个组件中分为两个角色 ConfigServerConfigClient
单独开一个 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 需要在配置文件中声明 不然会报解析错误。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐