# 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步骤
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2
3
4
- 配置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交互的地址和注册服务都需要依赖这个地址
2
3
4
5
6
7
8
9
10
11
12
13
14
- 启动类加上注解
@EnableEurekaServer
- 查看Eureka 访问EurekaServer http://{ip}:{port}/
Eureka客户端-服务提供者搭建步骤
- 引入依赖
<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>
2
3
4
5
6
7
8
9
10
- 新增配置
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
2
3
4
5
6
7
8
9
10
11
12
13
- 添加注解
@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
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();
}
}
2
3
4
5
6
7
8
9
配置负载均衡规则:注意千万不要建在主启动类同一级目录下,不然会有问题。
@Configuration
public class MyRule {
//切换负载均衡算法为随机
@Bean
public IRule MyRule() {
return new RandomRule();
}
}
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>
2
3
4
feign客户端
@FeignClient(value = "SPRING-CLOUD-PROVIDER")
public interface FeignService {
@GetMapping("/provider/list")
public String list(@RequestParam("name") String name);
}
2
3
4
5
6
7
客户端启动类新增注解 @EnableFeignClients(basePackages = "com.biubiu")
# 三、服务熔断,服务降级,监控 hustrix、hustrix-dashboard
服务雪崩:微服务之间由于某一个服务故障,导致级联故障的现象 服务熔断:通过断路器(Hystrix)的故障监控,当某个异常条件被触发时直接熔断整个服务。向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。服务熔断是解决服务雪崩的重要手段 服务降级:关闭微服务系统中某些边缘服务以保证系统核心服务正常运行
就是为了保证高可用,不至于崩掉
# 四、网关,路由 zuul Gateway
- 统一所有服务入口,对外隐藏微服务的ip地址
- 实现请求路由转发,请求过程负载均衡
- 身份认证、防报文重发与数据篡改、业务鉴权、响应数据脱敏、流量与并发控制,甚至基于API调用的计量或者计费等
简单来说:网关 = 路由转发 + 过滤器
微服务常用网关主要有两个:一个是Netflix的zuul和Spring的Gateway