关于学习SpringCloud的整理
这段时间学习了SpringCloud的一些东西,现在整理下来方便以后复习或者供给大家学习参考,如果有不对的地方希望大家指正,我会虚心接受.
1.eureka
1.1 eureka作用
实例化服务,注册到eureka,eureka记录服务,客户端获取服务,基于负载均衡调用服务,定期发送检查心跳.
1.2 eureka记录
服务提供者在启动时,会检测配置属性中的: eureka.client.register-with-erueka=true 参数是否为true,事实上默认就是true。如果值确实为true,则会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,EurekaServer会把这些信息保存到一个双层Map结构中 .
- 第一层Map的Key就是服务id,一般是配置中的 spring.application.name 属性,user-service
- 第二层Map的key是服务的实例id。一般host+ serviceId + port,例如: localhost:user-service:8081值则是服务的实例对象,也就是说一个服务,这样可以同时启动多个不同实例,形成集群。
1.3 配置
以下是服务端的配置参数参考
server: port: ${port:9091} spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: 123 url: jdbc:mysql://localhost:3306/bill-manager application: name: bill-service #整合mybatis mybatis: type-aliases-package: com.bobby.pojo #别名搜索 mapper-locations: classpath:/mybatis/*.xml eureka: client: service-url: defaultZone: HTTP://127.0.0.1:10086/eureka instance: prefer-ip-address: true # ip地址 ip-address: 127.0.0.1 lease-expiration-duration-in-seconds: 5 lease-renewal-interval-in-seconds: 5
1.4 消费端拉取服务备份时间间隔
eureka: client: registry-fetch-interval-seconds: 30
1.5 失效保护
eureka: server: enable-self-preservation: false # 关闭自我保护模式(缺省为打开) eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)
1.6 负载均衡
1.6.1 使用方法
1.添加注解
@LoadBalanced
RestTemplate();
2.使用带服务id的地址
1.6.2 均衡策略与修改
轮循 user-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 格式是: {服务名称}.ribbon.NFLoadBalancerRuleClassName ,值就是IRule的实现类。
2. 熔断器(Hystrix)
2.1 雪崩问题
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路.请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞.
Hystrix 解决雪崩问题的手段,主要包括:
2.2 线程隔离
Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。
2.3 服务降级
用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息).触发服务降级的情况:
- 线程池已满
- 请求超时
使用方法 - 消费者启动类添加注释@EnableCircuitBreaker
- 编写降级逻辑
- 通过Contrller映射方法添加@HystrixCommand(fallbackMethod = “queryByIdFallBack”)注释,指定降级逻辑,或在Controller类添加@DefaultProperties(defaultFallback = “defaultFallback”)指定默认降级逻辑
超时设置 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000
2.4 服务熔断
状态机有3个状态:
- Closed:关闭状态(断路器关闭),所有请求都正常访问。
- Open:打开状态(断路器打开),所有请求都会被降级。Hystrix会对请求情况计数,当一定时间内失败请求,百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
- Half Open:半开状态,不是永久的,断路器打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半
开状态。此时会释放部分请求通过,若这些请求都是健康的,则会关闭断路器,否则继续保持打开,再次进 行休眠计时 - 修改熔断策略
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 #服务降级超时时间 circuitBreaker: errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50% sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒 requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
3. Feign
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
3.1 使用Feign
- 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟Mybatis的mapper很像
- @FeignClient ,声明这是一个Feign客户端,同时通过 value 属性指定服务名称
- 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取果
- @GetMapping中的/user,请不要忘记;因为Feign需要拼接可访问的地址
3.2 Feign 内置ribbon配置
ribbon: ConnectTimeout: 1000 # 连接超时时长 ReadTimeout: 2000 # 数据通信超时时长 MaxAutoRetries: 0 # 当前服务器的重试次数 MaxAutoRetriesNextServer: 0 # 重试多少次服务 OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试
3.3 Feign 内置Hystrix配置
feign: hystrix: enabled: true # 开启Feign的熔断功能
写在最后
关于SpringCloud的学习大多是一些概念和配置方法上的,跟具体逻辑关联不大,容易学习,继续加油.
|