springcloud选型推荐:https://start.spring.io/actuator/info
springcloud技术选型
注册中心
一、Eureka
1)eureka自我保护机制
如果EurekaServer端在一定时间内(默认90s)没有收到EurekaClient的心跳包,便会直接
从服务注册列表中剔除该服务,但是在短时间内(90s)内丢失了大量的服务实例心跳,
这时候EurekaSever会开启 自我保护机制,不会剔除该服务(该现象可能出现在网络不
通但是EurekaClient服务其实是可用的情况下) AP
二、Zookeeper
1)Zookeeper的微服务节点是临时性节点。也就是说,微服务下线后,Zookeeper过一会
就会将微服务剔除 CP
查看节点 ls /services
三、Consul
启动 consul agent -dev
consul --version 查看consul版本
localhost:8500
当节点挂了之后,consul就会立马剔除掉该服务
Eureka Zookeeper Consul 小总结
负载均衡
一、Ribbon
@Configuration
public class MyRibbonRule {
@Bean
public IRule myRule(){
IRule irule = null;
//irule = new RoundRobinRule(); //轮询
irule = new RandomRule(); //随机轮询
//irule = new RetryRule(); //先按照RoundRibbonRule方式,如果获取失败则在指定时间内重试,获取可用服务
//irule = new WeightedResponseTimeRule(); //对RoundRobinRule的扩展,相应速度越快的实例权重越大
//irule = new BestAvailableRule(); //先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选一个并发量最小的服务
//irule = new AvailabilityFilteringRule(); //先过滤掉故障实例,再选择并发量较小的实例
//irule = new ZoneAvoidanceRule(); //复合判断server所在区域的性能和server的可用性选择服务器
return irule;
}
}
客户端调用
OpenFeign
原来调用微服务的方式为 restTemplate + ribbon负载均衡
需要在restTemplate的@Bean上面加@LoadBlanced实现负载均衡
OpenFeign直接整合了restTemplate + ribbon调用方式,且内置Ribbon,而且能用客户端
调用的方式来调用API。
OpenFeigin超时控制:默认1s超时
//application.yml
ribbon: #ribbon访问接口超时时间设置,同上面的配置一个意思
ConnectTimeout: 5000
ReadTimeout: 5000
openfeign日志打印功能
1、开启feign.Logger的configuration
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL; //详细日志
}
2、yml配置
#开启openfeign的调用日志
logging:
level:
#feign日志以什么级别监控哪个接口
com.yiyang.service.PaymentService: debug
断路器
一、Hystrix
主要的作用:降级 熔断 接近实时的监控
除此之外,还有限流、服务隔离等等
图形化的服务监控:hystrixDashboard
服务降级:fallback
系统不可用,需要有一个兜底的方法,比如返回一个友好提示
出现降级的情况:程序异常,超时,服务熔断触发服务降级,线程池满了
服务熔断:break
类比保险丝达到最大服务访问数,直接拒绝访问,然后调用服务降级的方法并
返回友好提示
服务线路:limit
秒杀 高并发等操作,比如限制qps数量
断路器概念:
“断路器”本身就是一种开关设置,当某个服务单元发生故障后,通过断路器的故障监控
(类似熔断保险丝),向调用方返回一个复合预期的、可处理的备选响应(FallBack),
而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程
不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
一般需要使用降级 熔断 限流的场景有:
1、服务提供方8001超时了,调用者80不能一直卡死等待,需要服务降级
2、对方服务8001 down机了,80不能一直卡死等待,需要降级
3、8001服务OK,但是调用者80自己出故障或者有自我要求(自己等待的时间小于
服务执行时间)
服务降级:
既可以配置在服务提供者,也可以配置在服务消费者。一般的来说,服务降级是放在
微服务消费者一端。
微服务提供者降级配置如下:
//指定需要降级的方法
@Override
@HystrixCommand(fallbackMethod = "getByIdTimeoutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
//@EnableCircuitBreaker 开启服务降级配置
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //开启服务降级注解
public class PaymentApplicationHystrix8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentApplicationHystrix8001.class, args);
}
}
微服务消费者降级配置如下(结合OpenFeign使用):
服务熔断:
满足条件:
1、满足一定的阈值的时候(默认10s内超过20个请求次数)
2、当失败率达到一定的时候(默认10s内超过50%的请求失败)
3、达到以上阈值,断路器会开启
4、当开启的时候,所有的请求将不会被转发
5、一段时间后(默认是5s),这个时候断路器会变成半开状态,会让其中一个请求访问,若成功,断路器会关闭,若失败,继续开启,虚幻4和5
https://github.com/Netflix/Hystrix/wiki/Configuration 断路器属性解释
HystrixDashboard:#####
注意:
1、dashboard和被监控的服务,都需要引入 spring-boot-starter-actuator
2、被监控的模块启动类里面要加上 如下代码:
/**
* 此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑
* ServletRegistrationBean是因为springboot的默认路径不是/hystrix.stream,
* 只要在自己的项目里配置上下面的servlet就可以了。
* @author lsw
* @date 2022/4/9 11:39
*/
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
监控地址:http://localhost:9001/hystrix
网关
一、gateway
gateway核心三要素:路由、断言、过滤器
gateway作用:为外部请求提供服务接口,满足路由规则,断言规则,过滤器规则就可以
访问。
配置中心
一、springcloud config
Client代表有通用配置的微服务
Server代表配置中心微服务
server链接github或者gitee等远程仓库yml,客户端链接config服务端,当github内容变动,
通过curl -X POST "http://localhost:3355/actuator/refresh"动态刷新客户端yml配置。
但是如果用N个客户端,就要刷新N次,所以就出现了服务总线,就是为了解决多次
刷新的问题。
服务总线
bus
config服务端和客户端都要引入spring-cloud-starter-bus-amqp依赖,意思是引入bus和
rabbitmq。最后通过curl -X POST "http://localhost:3344/actuator/bus-refresh"来刷新通
知config客户端。
现在就记个大概,后面有时间详细贴代码。
注意:bus支持的消息队列有 rabbitmq和kafka
Spring cloud stream
服务链路追踪
Sleuth Zipkin
spring cloud alibaba
https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/README-zh.md
注册中心 + 配置中心
Nacos
https://github.com/alibaba/Nacos
等同于spring cloud的 eureka config bus
nacos单机版数据持久化用的是嵌入式数据库 derby
nacos集群
待续...持续学习更新中