SpringCloud

SpringCloud

SpringCloud_第1张图片

SpringCloud

  • 框架集
  • 提供了一整套微服务解决方案(全家桶)
  • 基于http调用, Rest API

eureka

微服务治理,服务注册和发现

eureka和zookeeper区别

eureka:

  • 强调AP(可用性)
  • 集群结构:对等结构

zookeeper:

  • 强调CP(一致性)
  • 集群结构:主从结构

eureka注册和发现

1、注册
服务提供者启动时,向eureka一次次反复注册,直到注册成功为止
2、拉取注册表
服务发现者每30秒拉取一次注册表(刷新注册表)
3、心跳
服务发现者每30秒发送一次心跳数据
eureka连续3次收不到一个服务的心跳,会删除这个服务
4、自我保护模式
特殊情况
如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式
在保护模式下,所有服务都不删除
网络恢复后,可以自动退出保护模式,恢复正常

开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式

搭建eureka服务器
1、添加eureka server依赖
2、yml配置

1、主机名
2、禁用保护模式
3、针对单台服务器,配置不向自己注册,也不从自己拉取注册表
spring:
  application:
    name: eureka-server
server:
  port: 2001                          #默认8761
eureka:
  instance:
    hostname: eureka1                 #主机名,集群中区分不同服务器
 server:
    enable-self-preservation: false   #开发期间禁用保护模式
 client:
    register-with-eureka: false       #单台服务器不向自己注册
    fetch-registry: false             #单台服务器不从自己拉取

3、启动类注解@EnableEurenaServer,通过注解触发自动配置

单台eureka服务器启动后报错:Connect to localhost:8761 timedout
这是自动配置的一个默认集群服务器,但是这个默认服务器不存在,所以出错
后面自己搭建了集群服务,默认服务器就不会再自动配置

RestTemplase

SpringBoot提供的远程调用工具
类似于HttpClient,可以发送http请求,并处理响应,RestTemplate简化了RestAPI调用,只需要使用它一个方法,就可以完成请求、响应、json转换
方法:

  • getForObject(url,转换的类型.class,提交的参数)
  • postForObject(url,协议体数据,转换的类型.class)

RestTemplate和Dubbo远程调用的区别:

  • RestTemplate:

    • http调用
    • 效率低
  • Dubbo:

    • RPC调用,java的序列化
    • 效率高

Ribbon

负载均衡、请求重试

负载均衡
Ribbon对RestTemplate做了封装,增强了RestTemplate的功能
1、获取地址表
2、轮询一个服务的主机地址列表
3、RestTemplate负责执行最终调用

添加负载均衡
1、ribbon依赖
2、@LoadBalanced注解,对RestTemplate进行功能增强
@LoadBalanced 负载均衡注解

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
                                //设置调用超时时间,超时后认为调用失败
 SimpleClientHttpRequestFactory f=new SimpleClientHttpRequestFactory();
 f.setConnectTimeout(1000);     //建立连接等待时间
 f.setReadTimeout(1000);        //连接建立后,发送请求后,等待接收响应的时间
 return new RestTemplate(f);
}

3、修改调用地址,使用服务ID,而不是具体主机地址

Ribbon重试
一种容错机制,当调用远程服务失败,可以自动重试调用
添加重试:
1、添加spring-retry依赖
2、配置重试参数

1、在yml中配置

  • MaxAutoRetries:单台服务器的重试次数
  • MaxAutoRetriesNextServer:更换服务器的次数

2、在java代码中设置

  • Connecttimeout:与远程服务建立网络连接的超时时间
  • ReadTimeout:连接已建立,请求已发送,等待响应的超时时间
 # 配置 Ribbon 重试次数
ribbon:
 # 次数参数没有提示,并且会有黄色警告
 # 重试次数越少越好,一般建议用 0, 1 MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 2

Hystrix

断路器,服务降级、熔断
系统容错工具

  • 降级
    调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
    快速失败
  • 熔断
    当访问量过大,出现大量失败,可以过热保护,断开远程服务不再调用
    限流
    防止故障传播,雪崩效应

降级
1、hystrix依赖
2、启动类添加注解@EnableCircuitBreaker
3、添加降级代码

//当调用远程服务失败,跳转到指定的方法,执行降级代码 
@HystrixCommand(fallbackMenthod="方法名")
远程调用方法(){
    restTemplate.getForObject(url...);
}

Hystrix超时

Hystrix有默认的超时时间:1秒

Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效

Hystrix熔断
断路器打开的条件:

  • 10秒内20次请求(必须首先满足)
  • 50%失败,执行了降级代码

断路器打开后,所有请求直接执行降级代码

断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用
如果调用成功,断路器可以自动关闭,恢复正常
如果调用仍然失败,继续保持打开状态几秒钟

Actuator

springboot提供的日志监控工具,可以暴露项目中多种监控信息

  • 健康状态
  • 系统环境变量
  • Spring容器中所有的对象
  • SpringMVC映射的所有路径
  • ...

添加actuator
1、添加actuator依赖
2、yml配置暴露监控数据

management:
  endpoints:
    web:
      exposure:
        include: "*"    
#"*"                            暴露所有的监控
#health                         只暴露健康状态
#["health","beans","mappings"]  暴露指定的多个监控

Hystrix Dashboard

仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
1、Hystrix dashboard依赖
2、@EnableHystrixDashboard(启动类加入)
3、yml - 允许对那台服务器开启监控

server:
  port: 4001
  
#允许对那台服务器开启监控
hystrix:
  dashboard:
    proxy-stream-allow-list: localhost
    
#调整Ribbon的重试参数
#针对所有服务的通用配置
ribbon:
  MaxAutoRetries: 1
  
#只针对item-service这一个服务有效
#对其他服务不应用这个配置
item-service:
  ribbon:
    MaxAutoRetries: 2

Feign

微服务应用中,ribbon 和 hystrix 总是同时出现,feign 整合了两者

集成工具

  • 远程调用:声明式客户端
  • ribbon负载均衡和重试
  • hystrix降级和熔断

声明式客户端接口
只需要声明一个抽象接口,就可以通过接口做远程调用,不需要再使用调用RestTemplate

//调用远程的商品服务,获取订单的商品列表
//通过注解,配置:
//1、调用那个服务
//2、调用服务的那个路径
//3、向路径提交什么参数数据
@FeignClient(name="item-service")
public interface ItemClient(){
    @GetMapping("/{orderId}")
    JsonResult> getItems(@PathVariable String orderId);
}

在这里使用@GetMapping("/{orderId}"),指定的是向远程服务调用的路径

Feign继承Ribbon
无需额外配置,已经启用了负载均衡和重试
默认重试参数:

  • MaxAutoRetries: 0
  • MaxAutoRetriesNextServer: 1
  • ReadTimeout: 1000

feign 启用 hystrix
feign 默认没有启用 hystrix,添加配置,启用 hystrix
1、yml配置

feign:
  hystrix:
    enabled: true

你可能感兴趣的:(java)