SpringCloud

什么是微服务

  • 微服务架构是一个分布式系统,按照业务划分成为不同的服务单元,解决单体系统性能不足等问题
  • 微服务是一种架构风格,一个大型软件应用由多个服务单元组成,系统中的服务单元可以单独部署,各个服务单元之间是松耦合的

什么是SpringCloud

SpringCloud是一种生态,是微服务系统架构的一站式解决方案,在我们构建微服务的过程中需要做如服务注册发现配置中心消息总线负载均衡断路器数据监控等操作,SpringCloud为我们提供了一套方案,让我们在SpringBoot的基础上就能轻松的实现微服务项目的构建

SpringCloud和SpringBoot的关系

  • SpringBoot可以离开SpringCloud独立使用,但是SpringCloud离不开SpringBoot,依赖于它
  • SpringBoot专注于快速方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架

微服务技术栈

微服务开发

作用: 快速开发服务

  • Spring
  • SpringMvc
  • SpringBoot

微服务注册与发现

作用: 注册服务,发现服务,管理服务

Eureka

Zookeeper

  • ZooKeeper是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务

Zookeeper 和 Eureka 区别

Zookeeper 保证 CP,Eureka 保证 AP:

  • C:数据一致性;
  • A:服务可用性;
  • P:服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。

微服务调用(协议)

通信协议

Rest

  • 通过HTTP/HTTPS发送Rest请求进行数据交互

RPC

  • 远程过程调用(Remote Procedure Call)

Eureka

注解:

@EnableDiscoveryClient@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。

不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。

1
SpringCloud E版本后无需注解

配置文件详解

以下配置都是以 eureka.server 开头:

参数 描述 备注
eureka.server.eviction-interval-timer-in-ms server清理无效节点的时间间隔 默认60秒
eureka.server.enable-self-preservation 是否开启自我保护,默认true true false
eureka.server.renewal-percent-threshold 开启自我保护的系数 默认:0.85

client参数配置:

参数 描述 备注
eureka.client.enabled 是否开启client,默认true true false
eureka.client.register-with-eureka 是否注册 默认true
eureka.client.fetch-registry 是否检索服务 true false
eureka.client.serviceUrl.defaultZone 默认服务注册中心地址 多个用”,”隔开
eureka.client.eureka-server-connect-timeout-seconds 连接server服务器超时时间 默认5秒
eureka.client.eureka-connection-idle-timeout-seconds 连接server的连接空闲时长 默认30秒
eureka.client.eureka-server-read-timeout-seconds 连接server读取数据超时时间 默认8秒
eureka.client.eureka-server-total-connections 连接server的最大连接数 默认200
eureka.client.eureka-server-total-connections-per-host 对单个server的最大连接数 默认50
eureka.client.eureka-service-url-poll-interval-seconds 获取集群中最新的server节点数据 默认0
eureka.client.heartbeat-executor-thread-pool-size client维持与server的心跳线程数 默认2
eureka.client.service-url 列出所有可用注册中心的地址

eureka instance 相关配置:

参数 描述 备注
eureka.instance.lease-renewal-interval-in-seconds 服务续约任务调用间隔时间,默认30秒 client每隔30秒向server上报自己状态,避免被server剔除
eureka.instance.lease-expiration-duration-in-seconds 服务时效时间,默认90秒 当server 90秒内没有收到client的注册信息时,会将该节点剔除
eureka.client.registry-fetch-interval-seconds client本地缓存清单更新间隔,默认30秒 client每隔30秒,向server请求可用服务清单。对于API网关类应用,可以适当降低时间间隔
eureka.instance.prefer-ip-address 注册服务时是否使用IP注册,默认false true false
eureka.instance.ip-address server端的ip地址
eureka.instance.hostname server端的hostname 默认localhost
eureka.instance.instance-id 注册到server的实例

Ribbon

Feign

feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,SpringCloud集成了Ribbon和Eureka,可在Feign时提供负载均衡的http客户端

调用微服务两种方法

  • 微服务名字ribbon
  • 接口和注解feign

依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>

定义接口,使用@FeignClient注解开启,绑定服务名

image-20200831221441674

image-20200831214909029


Hystrix

Netflix/Hystrix

在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。

Hystrix旨在执行以下操作:

  • 提供保护并控制延迟和失败,以及通过第三方客户端库(通常是通过网络)访问的依赖项的失败。
  • 停止复杂的分布式系统中的级联故障。
  • 快速失败,迅速恢复。
  • 回退并在可能的情况下正常降级。
  • 启用近乎实时的监视,警报和操作控制。

服务熔断

image-20200901124823236

服务降级

一般是某个服务故障或者是异常引起的,类似现实世界中的 保险丝 ,当某个异常条件被触发,直接熔断整个服务,而不是一直等待,直到此服务超时。

实现类实现FallbackFactory接口,返回一个接口的实现类,在服务接口中指定实现类

image-20200901125112745

image-20200901130103845

还需要在yaml配置中开启服务降级

1
2
3
feign:
hystrix:
enabled: true

服务熔断和服务降级总结

相同点
  • 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
  • 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
  • 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改)
  • 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段 ;
不同点
  • 触发原因不太一样:
    服务降级一般是从 整体负荷考虑;
    服务熔断一般是 某个服务(下游服务)故障引起 ;
  • 管理目标的层次不太一样:
    降级一般需要对业务有层级之分(核心业务,非核心业务);
    熔断 其实是一个框架级的处理,每个微服务都需要(无层级之分

Zuul

路由网关

image-20200902174957528

在启动类上添加@EnableZuulProxy注解

pom

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>

SpringCloud Config

Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以在中心位置管理所有环境中应用程序的外部属性。客户端和服务器上的概念都与Spring EnvironmentPropertySource抽象映射相同,因此它们非常适合Spring应用程序,但可以与以任何语言运行的任何应用程序一起使用。在应用程序从开发人员到测试人员再到生产人员的整个部署过程中,您可以管理这些环境之间的配置,并确保应用程序具有它们迁移时所需的一切。服务器存储后端的默认实现使用git,因此它轻松支持带标签的配置环境版本,并且可以通过各种工具来访问这些内容来管理内容。添加替代实现并将其插入Spring配置很容易

HTTP服务具有以下形式的资源:

1
2
3
4
5
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

applicationSpringApplication中作为spring.config.name注入(在常规Spring Boot应用中通常是application),profile是有效配置文件(或逗号分隔)属性列表),而label是可选的git标签(默认为master。)

Server

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8888

spring:
application:
name: springcloud-config-server
# 从git获取配置
cloud:
config:
server:
git:
uri: https://gitee.com/aurora5/springcloud-config.git

在启动类上使用注解@EnableConfigServer开启

Client

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
1

常见错误以及解决方案

  • java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver

因为Druid中默认使用的SpringBoot版本是1.5.12,这个版本中引入了RelaxedPropertyResolver

  • 在pom.xml中添加

    1
    2
    3
    4
    5
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.8.RELEASE</version>
    </parent>

覆盖掉druid-spring-boot-starter中的springboot版本,解决


  • Field deptMapper in cn.this52.springcloud.service.DeptServiceImpl required a bean of type 'cn.this52.springcloud.mapper.DeptMapper' that could not be found.

  • image-20200829183055573

找不到Mapper接口

  • 解决方案:
    • 在Mapper接口上添加@Mapper注解
    • 在启动类或者其他配置类上添加@MapperScan注解扫描Mapper对应的包

评论