Spring Cloud 以及 Spring Cloud Alibaba 使用总结

news2025/1/10 11:24:38

title: Spring Cloud 以及 Spring Cloud Alibaba 使用总结
date: 2023-01-13 11:54:15
tags:

  • Spring
    categories:
  • Spring
    cover: https://cover.png
    feature: false

1. 版本对应

官网版本说明:版本说明 · alibaba/spring-cloud-alibaba Wiki (github.com)

在这里插入图片描述

这里使用 Spring Boot 2.7.7、Spring Cloud 2021.0.4、Spring Cloud Alibaba 2021.0.4.0,搭配 JDK 8

<properties>
        <spring.cloud.version>2021.0.4</spring.cloud.version>
        <spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
</properties>

<dependencyManagement>
            <!-- Spring Cloud Dependencies-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Alibaba Dependencies -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
</dependencyManagement>

2. Nacos

见另一篇:服务器 Nacos 集群搭建及使用总结_凡 223 的博客

3. Gateway

3.1 引入依赖

包括 Gateway 网关依赖和 Nacos 服务注册发现的依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

3.2 配置

将 Gateway 注册进 Nacos,同时进行 Gateway 相关的配置

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 124.222.xxx.90:8848
    gateway:
      routes:
        - id: provider1 # 路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8000  # 匹配提供服务的路由地址
          # 网关断言匹配
          predicates:
            - Path=/user/**    # 路径相匹配的进行路由

3.3 启动类

启动类添加 @EnableDiscoveryClient 注解

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

3.4 服务 Provider-1

1、POM

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、YAML

这里的端口与前面 Gateway 的配置文件里的 uri 端口一致

server:
  port: 8000
spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: 124.222.xxx.90:8848

3、启动类

@SpringBootApplication
@EnableDiscoveryClient
public class Service1Application {
    public static void main( String[] args ) {
        SpringApplication.run(Service1Application.class, args);
    }
}

4、Controller

@RestController
public class UserController {

    @GetMapping("/user/get")
    public String get() {
        return "provider-1 user get";
    }

    @GetMapping("/test")
    public String test() {
        return "provider-1 test";
    }
}

3.5 查看路由转发

分别启动 Gateway 和 Service,可以看到两个服务都注册了进来

在这里插入图片描述

访问 localhost:9000/user/get,通过网关的端口成功调用到服务 Provider-1

在这里插入图片描述

测试一下 Predicates 的效果,访问 /test,访问失败,路径不匹配

在这里插入图片描述

3.6 动态路由与负载均衡

将 3.4 的服务 Provider-1 再复制一份,为 Provider-2,这时就存在了两个服务

在这里插入图片描述

在这里插入图片描述

在 3.2 的配置中,uri 是固定的地址,那如何让 Gateway 转发两个服务或以上呢?

1、修改配置文件

开启动态路由,通过服务名来匹配服务

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 124.222.118.90:8848
    gateway:
      discovery:
        locator:
          enabled: true # 开启从注册中心动态创建路由的功能, 利用微服务名进行路由
      routes:
        - id: provider1 # 路由的ID, 没有固定规则但要求唯一, 建议配合服务名
          uri: lb://provider  # 匹配提供服务的路由地址
          # 网关断言匹配
          predicates:
            - Path=/user/**    # 路径相匹配的进行路由
        - id: provider2
          uri: lb://provider
          predicates:
            - Path=/user/**

2、配置中 uri 的协议为 lb,表示启用 Gateway 的负载均衡功能,此时需要引入 spring-cloud-starter-loadbalancer 依赖,版本在最开始已统一定义

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

3、查看路由转发

在这里插入图片描述

在这里插入图片描述

4. OpenFeign

4.1 引入依赖

这里同样需要引入 spring-cloud-starter-loadbalancer 依赖来实现 OpenFeign 自带的负载均衡

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

4.2 配置

服务注册进 Nacos,同时进行 OpenFeign 的相关配置,断路器的配置可见 5.2.2 服务降级的服务调用方部分

server:
  port: 7000
spring:
  application:
    name: consumer
  cloud:
    nacos:
      discovery:
        server-addr: 124.222.xxx.90:8848
feign:
  client:
    config:
      default:
        # 日志等级
        logger-level: full
        # 超时时间
        connect-timeout: 1500
        read-timeout: 1500
  # 断路器
  circuitbreaker:
    enabled: true

在这里插入图片描述

4.3 启动类

添加 @EnableFeignClients 注解开启 OpenFeign

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class Consumer1Application {
    public static void main( String[] args ) {
        SpringApplication.run(Consumer1Application.class, args);
    }
}

4.4 FeignService

新建一个接口,用于进行调用,在接口上添加 @FeignClient 注解,值为提供服务的服务名,在调用方法上添加对应的地址映射

@FeignClient("provider")
public interface FeignService {

    @GetMapping("/user/get")
    String get();
}

4.5 ConsumerController

将 FeignService 注入进来,然后调用方法

@RestController
public class ConsumerController {

    @Resource
    private FeignService consumerService;

    @GetMapping("/user/get")
    public String get() {
        return consumerService.get();
    }

    @GetMapping("/test")
    public String test() {
        return "consumer-1 test";
    }
}

4.6 查看远程调用

自带负载均衡功能

在这里插入图片描述

在这里插入图片描述

5. Hystrix

Hystrix 已经停止更新进入维护阶段

5.1 前期准备

5.1.1 引入依赖

该版本为 Hystrix 的最后一个版本

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

5.1.2 配置

server:
  port: 8002

spring:
  application:
    name: provider-hystrix
  cloud:
    nacos:
      discovery:
        server-addr: 124.222.xxx.90:8848

5.1.3 启动类

@SpringBootApplication
@EnableDiscoveryClient
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

5.1.4 HystrixService

public interface HystrixService {

    String normal();

    String timeout();
}
@Service
public class HystrixServiceImpl implements HystrixService {

    @Override
    public String normal() {
        return "normal";
    }

    @Override
    public String timeout() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return "timeout";
    }
}

5.1.5 HystrixController

@RestController
public class HystrixController {

    @Resource
    private HystrixService hystrixService;

    @GetMapping("/normal")
    public String normal() {
        return hystrixService.normal();
    }

    @GetMapping("/timeout")
    public String timeout() {
        return hystrixService.timeout();
    }
}

5.1.6 访问

访问 localhost:8002/normal,正常显示

在这里插入图片描述

访问 localhost:8002/timeout,等待 5 秒后显示

在这里插入图片描述

5.2 服务降级

5.2.1 服务提供方

1、HystrixService 添加 @HystrixCommand 注解,参数 fallbackMethod 为定义的回调方法,参数 @HystrixProperty 为超时时间

@Service
public class HystrixServiceImpl implements HystrixService {

    @Override
    public String normal() {
        return "normal";
    }

    @HystrixCommand(fallbackMethod = "globalFallback",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000")
    })
    @Override
    public String timeout() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }

        return "timeout";
    }


    public String globalFallback(){
        return "/(ㄒoㄒ)/调用接口超时或异常:\t"+ "\t当前线程池名字" + Thread.currentThread().getName();
    }
}

2、启动类添加 @EnableHystrix 注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

3、再次访问 timeout,触发服务降级

在这里插入图片描述4、统一配置,通过 @DefaultProperties 来进行默认配置,不用每个方法都进行配置

@Service
@DefaultProperties(defaultFallback = "globalFallback", commandProperties = {
        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000")
})
public class HystrixServiceImpl implements HystrixService {

    @Override
    public String normal() {
        return "normal";
    }

    @HystrixCommand
    @Override
    public String timeout() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }

        return "timeout";
    }


    public String globalFallback(){
        return "/(ㄒoㄒ)/调用接口超时或异常:\t"+ "\t当前线程池名字" + Thread.currentThread().getName();
    }
}

这里是在服务提供方进行了服务降级的处理,假如有其他服务调用该服务,但是服务提供方宕机了,无法触发服务降级(这里首先需要 OpenFeign 的超时时间大于服务提供方返回响应的时间,否则会直接报超时异常),因此调用方也需要进行服务降级的处理,可以配合 OpenFeign 进行处理

5.2.2 服务调用方

1、在 OpenFeign 的配置里开启断路器,开启了断路器之后,会先判断 Hystrix 的超时时间然后再判断 OpenFeign 的超时时间,Hystrix 默认的超时时间是 1 秒,所以需要重新设置 Hystrix 的超时时间

feign:
  client:
    config:
      default:
        # 日志等级
        logger-level: full
        # 超时时间
        connect-timeout: 1500
        read-timeout: 1500
  # 断路器
  circuitbreaker:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1500

2、添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

3、@FeignClient 注解添加 fallback 参数,FallbackServiceImpl 为处理类

@FeignClient(value = "provider-hystrix", fallback = FallbackServiceImpl.class)
public interface FeignService {

    @GetMapping("/timeout")
    String get();
}

4、FallbackServiceImpl 实现 FeignService,统一为调用接口里的方法进行异常处理

@Service
public class FallbackServiceImpl implements FeignService {

    @Override
    public String get() {
        return "服务调用失败,提示来自:Consumer-OpenFeign";
    }
}

5、关闭服务提供方,调用接口,触发服务调用方的服务降级

在这里插入图片描述

假如没有设置断路器,则会显示白页错误

在这里插入图片描述

5.3 服务熔断

修改 @HystrixCommand 注解的参数

@Service
public class HystrixServiceImpl implements HystrixService {

    @HystrixCommand(fallbackMethod = "circuitBreakerFallback", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 设置请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 失败率达到多少后跳闸
    })
    public String circuitBreaker(Integer id) {
        if (id < 0) {
            throw new RuntimeException("******id 不能负数");
        }
        String serialNumber = UUID.randomUUID().toString();

        return Thread.currentThread().getName() + "\t" + "调用成功,流水号: " + serialNumber;
    }

    public String circuitBreakerFallback(Integer id) {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " + id;
    }
}

涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值

  1. 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的 10 秒
  2. 请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为 20,意味着在 10 秒内,如果该 Hystrix 命令的调用次数不足 20 次,即使所有的请求都超时或其他原因失败,断路器都不会打开
  3. 错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了 30 次调用,如果在这 30 次调用中,有 15 次发生了超时异常,也就是超过 50% 的错误百分比,在默认设定 50% 阀值情况下,这时候就会将断路器打开

熔断类型:

  • 打开:请求不再进行调用当前服务,内部设置时钟一般为 MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态
  • 关闭:熔断关闭不会对服务进行熔断
  • 半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

5.4 服务监控 HystrixDashboard

1、引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置

这里需要配置允许 hostname,否则会报 Unable to connect to Command Metric Stream

server:
  port: 7001
hystrix:
  dashboard:
    proxy-stream-allow-list: "localhost"

3、启动类

添加 @EnableHystrixDashboard 注解

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardApplication.class, args);
    }
}

4、访问 http://localhost:7001/hystrix,已经可以看到仪表盘

在这里插入图片描述

5、在需要监控的服务,引入 spring-boot-starter-actuator 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

6、配置监控路径

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }

    // 配置监控路径
    @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;
    }
}

7、在仪表盘输入需要监控的服务路径

在这里插入图片描述

8、调用几次接口请求后,即可看到监控图

在这里插入图片描述

其他组件的使用待完善

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过应用场景深度理解监控宝在业务中的实践价值

近年来&#xff0c;越来越多的企业实现了核心业务系统互联网化&#xff0c;无论是企业内部员工还是企业外部用户或是供应链上下游合作伙伴&#xff0c;均通过互联网和Web应用与企业建立起了紧密的联系。基于此&#xff0c;网络性能对企业业务的影响也变得越来越重要&#xff0c…

阿里云服务器使用docker部署springboot+mysql+redis项目

首先&#xff0c;由于springboot中使用的内置的tomcat&#xff0c;需要讲将ttp转为https的自行搜索博客把&#xff1a; 步骤大概是再阿里云上注册免费SSL证书&#xff0c;下载证书后 拖到项目资源目录下&#xff0c;配置application.properties相关属性 下面引出博客主要内容……

校园网免认证上网的方法

很多时候&#xff0c;当流量不够用时&#xff0c;看着周围那么多热点又连不上&#xff0c;是不是有点心痒痒呢&#xff1f;那么有没有办法不需要要通过这些热点的认证即可上网呢&#xff1f;当然是有的。另外在此强调一点&#xff0c;本教程仅用于学习测试用途&#xff0c;请勿…

【靶机】vulnhub靶机my_file_server2

靶机下载地址&#xff1a;My File Server: 2 ~ VulnHubip&#xff1a;192.168.174.144Kali&#xff1a;192.168.174.128使用arp-scan扫描到ip是使用nmap扫描开放的端口信息&#xff0c;发现靶机开放端口信息如下21端口ftp服务&#xff0c;允许匿名&#xff08;anonymous&#x…

编译安装nacos集群部署

Nacos 基于 java 开发的&#xff0c;运行依赖于 java 环境。依赖 64 bit JDK 1.8服务器准备&#xff1a;192.168.11.139、192.168.11.141、192.168.11.142 1.首先上传jdk的包 三台都操作tar xzf jdk-8u121-linux-x64.tar.gz -C /usr/local/ 解压jdk的包cd /usr/local/ 切换至解…

计算机图形学 第9章 自由曲线曲面

第8章不学 目录 # 学习目标 # 消隐 ## 定义 1.线框模型 2.表面模型 3.实体模型 双表结构 定义三维顶点类 定义表面类 读入立方体的点表 读入立方体的面表 1.柏拉图多面体 柏拉图多面体对偶性 正四面体 正八面体 正十二面体 黄金数 黄金矩形 黄金三角形 光滑物体 …

Spring Bean 的生命周期

文章目录一、前言二 、Bean 的生命周期2.1 Bean 的定义信息2.2 Bean 的创建2.3 Bean 的使用2.4 Bean 的销毁2.5 循环依赖2.5.1 什么是循环依赖2.5.2 Spring 解决循环依赖2.5.2.1 三级缓存2.5.2.2 提前暴露2.5.3 注意2.5.3.1 三级缓存结构中 map 分别存储什么类型对象2.5.3.2 三…

JVM-内存与垃圾回收-1.JVM与Java体系结构

1.JVM与Java体系结构 1. JVM&#xff1a;跨语言的平台 Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已不再是简简单单的一门计算机语言了&#xff0c;它更是一个平台、一种文化、一个社区。 ● 作为一个平台&#xff0c;Java虚拟机扮…

机器人中的数值优化之BFGS(nonconvex and smooth)

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 wolfe conditions 2 cautious update 3 BFGS for nonconvex functions 1 wolfe conditions 当我们需要搜索方向是下降方向时&#xff0c;一定要让近似hessian的矩阵正定&#xff0c;这就需要满足wolfe条件 首先需要满…

34. 实战:基于某api实现歌曲检索与下载(附完整源代码)

目录 前言 &#xff08;相关链接在评论区&#xff09; 目的 &#xff08;相关链接在评论区&#xff09; 思路 &#xff08;相关链接在评论区&#xff09; 代码实现 1. 访问某音乐平台&#xff08;链接放在评论区了&#xff09;&#xff0c;抓包搜索接…

BUUCTF reverse题解汇总

本文是BUUCTF平台reverse题解的汇总 Page1 easyrereverse1reverse2内涵的软件新年快乐xorhelloworldreverse3不一样的flagSimpleRevJava逆向解密[GXYCTF2019]luck_guy[BJDCTF2020]JustRE刮开有奖简单注册器pyre[ACTF新生赛2020]easyrefinditrsa[ACTF新生赛2020]rome[FlareOn4]…

穿越寒冬春暖花开,当下便是在社科院杜兰金融管理硕士项目读研的好时光

时间无声的从指尖划过&#xff0c;严寒的冬天已经过去&#xff0c;春天即将到来。23考研期间&#xff0c;恰逢特殊时期&#xff0c;好多同学错失了考试的机会&#xff0c;忧心2023是否还可以读研。不要担心&#xff0c;免联考的社科院与杜兰大学金融管理硕士项目来了&#xff0…

【html】如何处理显示ttf字体图标

当看到某些文件的后缀名是ttf&#xff0c;表示是字体文件&#xff0c;除了显示字体&#xff0c;还能显示图标&#xff0c;如果需要显示的图标太多&#xff0c;就把它们放在一个文件中&#xff0c;方便统一管理图标&#xff0c;在此讲一下怎么显示字体图标。 打开文件 电脑上用…

超低损耗电路新研究:光芯片电路+量子计算

&#xff08;图片来源&#xff1a;网络&#xff09;在光通信以及使用光而不是电荷来存储和传输信息的量子计算机的设计中&#xff0c;要做到以最小的损耗传输&#xff0c;并能操纵最小单位光&#xff0c;光子起着至关重要的作用。现在&#xff0c;美国国家标准与技术研究院的研…

DynaSLAM-4 DynaSLAM中Mask R-CNN部分源码解析(Ⅲ)

目录 1.RPN 1.1 RPN层的作用与实现解读 1.2 候选框过滤ProposalLayer层 2. DetectionTargetType层 2.1 DetectionTargetType层作用 2.2 正负样本选择与标签定义 1.RPN 1.1 RPN层的作用与实现解读 上篇博客中我们解释了如何通过generate_pyramid_anchors在每一个特征层上…

Nacos学习:一、Nacos注册中心

Nacos 1. Nacos注册中心 ​ 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 ​ Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;帮助您实现动态服务发…

JVM笔记(4)—— 运行时数据区——堆空间

一、堆空间内存结构 堆空间内存分为年轻代和老年代。年轻代又细分为Eden区&#xff0c;Survivor1区和Survivor2区&#xff08;又称为from区和to区&#xff09; 为什么要对堆空间进行分代&#xff1f; 因为不同对象的生命周期不同&#xff0c;绝大部分对象都是临时对象&#x…

DIY 3D打印机——【有啥用啥版】

3D打印已经非常普及&#xff0c;手搓3D打印机的也很普遍了&#xff0c;不幸的是多年前买的三角洲&#xff08;delta型&#xff09;打印机年前罢工了&#xff0c;幸好它完成了一项重要使命&#xff1a;让手搓的铣床动起来&#xff0c;从而能够让铣床把受力部分的PLA零件自己加工…

高频卡顿问题分析

从监控图中可以看到&#xff0c;3.76k的用户&#xff0c;两分钟内报卡顿次数达到100万次 &#xff0c;很恐怖&#xff0c;这个是非正常的卡顿 由于没有日志&#xff0c;只能先看代码分析&#xff0c;出现高频卡顿的原因 问题描述 在播放过程&#xff0c;会频繁上报卡顿&…

Redis详解(二)

文章目录Redis的单线程模型Redis数据过期删除策略内存淘汰机制手写LRU持久化快照持久化(RDB)RDB优缺点AOF持久化AOF优缺点RDB和AOF的选择注意事项Redis修改配置后未生效(windows)Redis的单线程模型 Redis基于Reactor模式来设计开发了自己的一套高效的时间处理模型。 Redis内部…