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 | <dependency> |
定义接口,使用@FeignClient注解开启,绑定服务名
Hystrix
在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。
Hystrix旨在执行以下操作:
- 提供保护并控制延迟和失败,以及通过第三方客户端库(通常是通过网络)访问的依赖项的失败。
- 停止复杂的分布式系统中的级联故障。
- 快速失败,迅速恢复。
- 回退并在可能的情况下正常降级。
- 启用近乎实时的监视,警报和操作控制。
服务熔断
服务降级
一般是某个服务故障或者是异常引起的,类似现实世界中的 保险丝 ,当某个异常条件被触发,直接熔断整个服务,而不是一直等待,直到此服务超时。
实现类实现FallbackFactory
接口,返回一个接口的实现类,在服务接口中指定实现类
还需要在yaml配置中开启服务降级
1 | feign: |
服务熔断和服务降级总结
相同点
- 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
- 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
- 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改)
- 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段 ;
不同点
- 触发原因不太一样:
服务降级一般是从 整体负荷考虑;
服务熔断一般是 某个服务(下游服务)故障引起 ; - 管理目标的层次不太一样:
降级一般需要对业务有层级之分(核心业务,非核心业务);
熔断 其实是一个框架级的处理,每个微服务都需要(无层级之分
Zuul
路由网关
在启动类上添加@EnableZuulProxy注解
pom
1 | <dependency> |
SpringCloud Config
Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以在中心位置管理所有环境中应用程序的外部属性。客户端和服务器上的概念都与Spring Environment
和PropertySource
抽象映射相同,因此它们非常适合Spring应用程序,但可以与以任何语言运行的任何应用程序一起使用。在应用程序从开发人员到测试人员再到生产人员的整个部署过程中,您可以管理这些环境之间的配置,并确保应用程序具有它们迁移时所需的一切。服务器存储后端的默认实现使用git,因此它轻松支持带标签的配置环境版本,并且可以通过各种工具来访问这些内容来管理内容。添加替代实现并将其插入Spring配置很容易
HTTP服务具有以下形式的资源:
1 | /{application}/{profile}[/{label}] |
application
在SpringApplication
中作为spring.config.name
注入(在常规Spring Boot应用中通常是application
),profile
是有效配置文件(或逗号分隔)属性列表),而label
是可选的git标签(默认为master
。)
Server
1 | <dependency> |
1 | server: |
在启动类上使用注解@EnableConfigServer开启
Client
1 | <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.
找不到Mapper接口
- 解决方案:
- 在Mapper接口上添加@Mapper注解
- 在启动类或者其他配置类上添加@MapperScan注解扫描Mapper对应的包