# SpringCloud 各组件

微服务:一系列围绕业务开发的可独立运行的小服务,一个服务通常实现了一组特性或功能,各个服务之间通过暴露出来的api连接交互。 优缺点:

  • 将单体应用架构拆分为多个单一职责的微服务,单独部署,服务之间通过网络通信
  • 每个服务可以有自己的团队负责,高度自治理
  • 松耦合,避免一个服务奔溃导致整个系统无法使用
  • 要开发人员处理分布式系统复杂性
  • 运维难度增加
  • 服务治理服务监控变得重要复杂

SpringCloud:当前最火的微服务架构

项目 名称 备注
注册中心 Eureka-Server、Consul、Nacos Nacos是阿里开源的集注册和配置中心为一体
负载均衡 & 服务调用 Ribbion、OpenFeign 服务直接通过Http调用
网关 Zuul、GateWay 路由,检验,过滤请求
配置中心 Config、Nacos 统一的配置
熔断 服务监控 hystrix、hystrix dashboard 监控和熔断

SpringCloud版本号:是根据伦敦地铁站字母命名的 Angel、Brixton、Camden、Dalston、Edgware、Finchley、Greenwich、Hoxton

# 一、注册中心Eureka

Eureka包含两个组件,Eureka Client和Eureka Server

  • Eureka Server 提供服务注册的服务,各节点启动之后会在Eureka Server进行注册,Eureka Server通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务! 里面有一个注册表,保存了各个服务所在的机器和端口号

Eureka Server主要有服务提供者和服务消费者;客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

  • Register:服务注册,把自己的IP和端口注册给Eureka
  • Renew:服务续约,发送心跳包,每30秒发送一次。告诉Eureka自己还活着
  • Cancel:服务下线,当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务
  • Get Registry:获取服务注册列表,获取其他服务列表
  • Replicate:集群中数据同步,eureka集群中的数据复制与同步。
  • Make Remote Call:远程调用,完成服务的远程调用。

搭建EurekaServer步骤

  1. 引入依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
1
2
3
4
  1. 配置Eureka
server:
  port: 7001

spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost # Eureka服务端实例名
  client:
    register-with-eureka: false # 是否将自己注册到EurekaServer中,默认的为true
    fetch-registry: false # 是否从EurekaServer中获取服务注册信息,默认的为true
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 设置与EurekaServer交互的地址和注册服务都需要依赖这个地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. 启动类加上注解 @EnableEurekaServer
  2. 查看Eureka 访问EurekaServer http://{ip}:{port}/

Eureka客户端-服务提供者搭建步骤

  1. 引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
  1. 新增配置
server:
  port: 9000

spring:
  application:
    name: spring-cloud-provider

eureka:
  client:
    register-with-eureka: true # 将自己注册进EurekaServer 默认true
    fetch-registry: true # 从EurekaServer中抓取已有的注册信息,默认为true
    service-url:
      defaultZone: http://localhost:7001/eureka
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 添加注解 @EnableEurekaClient

Eureka客户端-服务消费者搭建步骤(同上)

Eureka自我保护机制: 当我们关掉Client的时候,理论上注册中心不会有这个Client的注册信息了,但是实际会保留Client的注册信息,这是因为EurekaServer开启了自我保护机制

默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是"宁可信其有不可信其无!"。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行

# eureka server
# 关闭自我保护
eureka.server.enable-self-preservation=false
# 超时3s自动清除 60*1000  1分钟
eureka.server.eviction-interval-timer-in-ms=3000


# eureka client
# 用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10
# 指定客户端多久向eureka server发送一次心跳 默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
1
2
3
4
5
6
7
8
9
10
11
12

Eureka 2.0 (Discontinued) 已经停止更新了

# 二、负载均衡 Ribbon、Feign(OpenFeign)

负载均衡就是吧客户端请求均匀分配到各负载上(服务提供者机器上),Ribbon是在客户端进行负载均衡的

  • Ribbon:面向服务的
@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced //Ribbon负载均衡 默认是轮询
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
1
2
3
4
5
6
7
8
9

配置负载均衡规则:注意千万不要建在主启动类同一级目录下,不然会有问题。

@Configuration
public class MyRule {
    //切换负载均衡算法为随机
    @Bean
    public IRule MyRule() {
        return new RandomRule();
    }
}
1
2
3
4
5
6
7
8

启动类去配置 @RibbonClient(name = "SPRING-CLOUD-PROVIDER", configuration = RibbonRuleConfig.class)

  • Feign:面向对象的,类似接口方式,封装了Ribbon 引入依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
1
2
3
4

feign客户端

@FeignClient(value = "SPRING-CLOUD-PROVIDER")
public interface FeignService {

    @GetMapping("/provider/list")
    public String list(@RequestParam("name") String name);

}
1
2
3
4
5
6
7

客户端启动类新增注解 @EnableFeignClients(basePackages = "com.biubiu")

# 三、服务熔断,服务降级,监控 hustrix、hustrix-dashboard

服务雪崩:微服务之间由于某一个服务故障,导致级联故障的现象 服务熔断:通过断路器(Hystrix)的故障监控,当某个异常条件被触发时直接熔断整个服务。向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。服务熔断是解决服务雪崩的重要手段 服务降级:关闭微服务系统中某些边缘服务以保证系统核心服务正常运行

就是为了保证高可用,不至于崩掉

# 四、网关,路由 zuul Gateway

  • 统一所有服务入口,对外隐藏微服务的ip地址
  • 实现请求路由转发,请求过程负载均衡
  • 身份认证、防报文重发与数据篡改、业务鉴权、响应数据脱敏、流量与并发控制,甚至基于API调用的计量或者计费等

简单来说:网关 = 路由转发 + 过滤器

微服务常用网关主要有两个:一个是Netflix的zuul和Spring的Gateway

# 五、配置中心 Config、Nacos