关于java:SpringCloud

58次阅读

共计 3501 个字符,预计需要花费 9 分钟才能阅读完成。

SpringCloud

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<List<Item>> 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

正文完
 0