springcloud

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

微服务重新上线后节点ID对比
三、Consul

启动 consul agent -dev
consul --version 查看consul版本
localhost:8500

当节点挂了之后,consul就会立马剔除掉该服务

consul注册进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 断路器属性解释

hystrix工作流程-官方网站
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集群


nacos集群

待续...持续学习更新中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容