SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
目录
一:Eureka注册中心
1. Eureka原理
2. 动手实践
①搭建EurekaServer
②服务注册
③服务发现
二:Ribbon负载均衡
1. 负载均衡原理
2. 负载均衡策略
3. 懒加载
tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以点击网站进行学习人工智能学习网站
一:Eureka注册中心
前面已经分析了,无论是SpringCloud还是SpringCloudAlibaba,两者的注册中心都有Eureka,所以现在就来学习一下Eureka。
| Dubbo | SpringCloud | SpringCloudAlibaba | |
| 注册中心 | zookeeper、Redis | Eureka、Consul | Nacos、Eureka |
| 服务远程调用 | Dubbo协议 | Feign(http协议) | Dubbo、Feign |
| 配置中心 | 无 | SpringCloudConfig | SpringCloudConfig、Nacos |
| 服务网关 | 无 | SpringCloudGateway、Zuul | SpringCloudGateway、Zuul |
| 服务监控和保护 | dubbo-admin,功能弱 | Hystix | Sentine |
1. Eureka原理
服务调用出现的问题
①服务消费者该如何获取服务提供者的地址信息?--------》注册中心
②如果有多个服务提供者,消费者该如何选择?--------》负载均衡
③消费者如何得知服务提供者的健康状态?--------》心跳反应

Eureka的原理
在Eureka的结构当中,分为两个角色:
第一个角色:eureka-server(注册中心)服务端,记录和管理微服务。
第二个角色:user-service(服务提供者)和 order-service(服务消费者);不管是服务者还是消费者都是微服务,所以提供者和消费者统称为Eureka的客户端client。
①user-service在启动的那一刻,会把自己的信息注册给eureka;注册中心会记录服务器名称、IP端口等信息。此时如果有人想消费,就不需要自己去记录信息,直接找eureka,拉取服务器信息;这实际上就解决了上述的第一个问题。
②例如:此时拿到了3个记录信息,如何选呢?通过负载均衡的知识选出来一个,然后就可以远程调用发请求;这就解决了上述的第二个问题。
③那选出来的这个会不会是挂的呢?不会,因为提供者服务每隔30秒都会向eureka发一次心跳,来确认自己的状态;如果检测到不跳了、挂了,eureka就会把它从注册中心的列表中剔除掉,消费者就可以拉取到最新的信息;这就解决了上述的第三个问题。

总结:在Eureka架构中,微服务角色有两类
(1)EurekaServer:服务端,注册中心
作用:记录服务信息,进行心跳监控。
(2)EurekaClient:客户端
Provider:服务提供者,例如上述的 user-service
①注册自己的信息到EurekaServer。
②每隔30秒向EurekaServer发送心跳。
Consumer:服务消费者,例如上述的 order-service
①根据服务名称从EurekaServer拉取服务列表。
②基于服务列表做负载均衡,选中一个微服务后发起远程调用。
2. 动手实践
接下来就动手实践:总共分为三个部分:搭建注册中心、服务注册、服务发现。

①搭建EurekaServer
以下搭建信息是基于这篇博客的内容SpringCloud 【实用篇】| 服务拆分及远程调用http://t.csdnimg.cn/pj77E
第一步:创建Maven的独立项目eureka-server,引入spring-cloud-starter-netflix-eureka-server的依赖
注:从这里也可以看出实际上Spring已经集成了Erueka,直接引入依赖使用即可!与我们后面学习的Nacos注册中心不同!
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>cn.itcast.demo</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!--引入eureka起步依赖--><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies></project>
第二步:编写启动类,添加@EnableEurekaServer注解,表示自动装配的开关
package cn.itcast.eureka;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
// 假如@EnableEurekaServer注解
@EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}
第三步:添加application.yml文件,配置信息
注:为什么还要配置eureka的地址信息,自己配置自己?
答:eureka自己也是一个微服务,在启动时,会将自己也注入到eureka上,为了以后集群之间通信去用,相互做注册进行通信。
#配置端口号
server:port: 10086
#eureka的服务器名称
spring:application:name: eureka-server
#eureka的地址
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
启动eureka,进行访问
此时的注册列表就自己,把自己注册进去了!

②服务注册
将user-service服务和order-service服务注册到EurekaServer(已user-service为例),步骤如下:
第一步:在项目user-service引入spring-cloud-starter-netflix-eureka-client的依赖
<!--加如eureka的依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
第二步:在application.yml文件,编写下面的配置:
spring:application:name: user-service #新加入的eureka服务器的名称
eureka: #新加入的eureka地址client:service-url:defaultZone: http://127.0.0.1:10086/eureka
启动order-service和user-service,此时的注册列表
此时的注册列表就把order-service和user-service项目注册进去了!

补充:我们可以将user-service多次启动, 模拟多实例部署,但为了避免端口冲突,需要修改端口设置:

此时的eureka页面
此时对于注册进去的user-service启动了两个实列!

③服务发现
在order-service完成服务拉取:服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡。
第一步:修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
// 原来是硬编码的方式,写死了
String url = "http://localhost:8081/user/"+order.getUserId();
// 现在使用加入eureka注册中心的服务器名称代替IP和端口号
String url = "http://user-service/user/"+order.getUserId();
第二步:在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解@LoadBalanced:
package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 注册RestTemplate@Bean@LoadBalanced // 加入负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}}
此时重启order-service,连续进行两次访问,此时应该访问UserApplication--->8081还是UserApplication2--->8082呢?
UserApplication日志信息显示:

UserApplication2日志信息显示:

发现两个是轮循方式访问,成功实现了负载均衡,至于负载均衡的原理下面会讲!
总结:
①搭建EurekaServer
引入eureka-server依赖;
启动类上添加@EnableEurekaServer注解;
在application.yml中配置eureka端口号、地址、服务器名称;
②服务注册
引入eureka-client依赖;
在application.yml中配置eureka地址、服务器名称;
③服务发现
用服务提供者的服务名称(代替端口号和IP)远程调用;
给注入的RestTemplate添加@LoadBalanced注解;
二:Ribbon负载均衡
前言:对于高版本的SpringCloud的Ribbon组件已经弃用了被Spring Cloud Loadbalancer替代!
前面我们用EurekaClient(注册中心)实现了服务的拉取和负载均衡,我们只是指定了一个服务器的名称、加了@LoadBalanced注解,一切就自动完成了!那么是什么时候进行的服务拉取?什么时候进行的负载均衡?负载均衡的原理是什么?策略是什么?接下来就学习SpringCloud的第二个组件Ribbon。
1. 负载均衡原理
order-service发起请求http://userservice/user/1,实际上这个请求并不是真实可用的地址,在浏览器是无法进行访问,是无法到达后面某个服务的;中间会被Ribbon把请求拦下来进行处理,去找到真实的地址;通过服务器名称userservice找eureka确定真实的地址(IP和Port),拉取服务,然后做负载均衡。

源码分析
@LoadBalanced注解就相当于一个标记,标记RestTemplate发起的请要被Ribbon拦截。
// 注册RestTemplate@Bean@LoadBalanced // 假如负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}
这个拦截的动作是通过LoadBalancerInterceptor类去完成的
这个类实现了ClientHttpRequestInterceptor接口(客户端Http请求的拦截器);会去拦截由客户端发起的Http请求;而RestTemplate就是发Http请求的客户端。
package org.springframework.cloud.client.loadbalancer;import java.io.IOException;
import java.net.URI;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.Assert;public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {private LoadBalancerClient loadBalancer;private LoadBalancerRequestFactory requestFactory;public LoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRequestFactory requestFactory) {this.loadBalancer = loadBalancer;this.requestFactory = requestFactory;}public LoadBalancerInterceptor(LoadBalancerClient loadBalancer) {this(loadBalancer, new LoadBalancerRequestFactory(loadBalancer));}// 重写的Intercept方法public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));}
}
在重写的intercept方法上打断点

浏览器发送localhost:8080/order/101请求回到断点

拿到地址后,调用getHost方法拿到主机名
拿到服务器名称去找eureka完成服务的拉取;把服务器名称交给loadBalancer去执行,实际上loadBalancer对象就是一个RibbonLoadBalanceClient(负载均衡客户端)

execute方法就是执行的意思,所以要跟进这个方法,会进入RibbonLoadBalanceClient对象的excute方法(一些版本的Jar包会进入接口LoadBalanceClient的excute方法,在其实现类多打一个断点即可)

这个ILoadBalancer对象(实际上是DynamicServerListLoadBalance-动态服务列表负载均衡器)就可以拿到对应的服务(成功被拉取到服务列表)

拉取到服务列表,接下来就是进行负载均衡!

此时getServer方法又调用了chooseServer方法,又去转到ZoneAwareLoadBalancer类调用父类的chooseServer方法

最终调用到BaseLoadBalancer类的rule类的choose方法

rule类是一个IRule接口,默认的负载均衡规则ZoneAvoidanceRule

这个接口还有其它负载均衡规则的实现类

负载均衡流程

2. 负载均衡策略
上面我们学写了负载均衡的原理,知道IRule接口决定了负载均衡的策略;接下来就分析IRule接口有哪些实现,以及将来如何修改每个实现!
Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则:

常见的负载均衡策略
| 内置负载均衡规则类 | 规则描述 |
| RoundRobinRule | 简单轮询服务列表来选择服务器。 |
| AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。 |
| WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
| ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。(先分区域,在区域内在轮循) |
| BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
| RandomRule | 随机选择一个可用的服务器。 |
| RetryRule | 重试机制的选择逻辑 |
通过定义IRule实现可以修改负载均衡规则,有两种方式:
第一种方式:在OrderApplication启动类中注册新的Rule-------这是全局的配置
package cn.itcast.order;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 注册RestTemplate@Bean@LoadBalanced // 加入负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}// 修改负载均衡的规则---随机@Beanpublic IRule randomRule(){return new RandomRule();}
}
第二种方式:在application.yml文件中修改配置-------针对某个服务进行配置
user-service: # 给某个微服务配置负载均衡规则,微服务的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
3. 懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:eager-load:enabled: true # 开启饥饿加载,clients是一个集合,后面可以配多个clients:- user-service # 指定对user-service这个服务饥饿加载
Ribbon负载均衡总结
①Ribbon负载均衡规则:规则接口是IRule,默认实现是ZoneAvoidanceRule,根据区域选择服务列表,然后轮询。
②负载均衡自定义方式
代码方式:配置灵活,但修改时需要重新打包发布;
配置方式:直观,方便,无需重新打包发布,但是无法做全局配置;
③饥饿加载:开启饥饿加载,指定饥饿加载的微服务名称。
相关文章:
SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗…...
SpringSecurity+JWT权限认证
SpringSecurity默认的是采用Session来判断请求的用户是否登录的,但是不方便分布式的扩展 虽然SpringSecurity也支持采用SpringSession来管理分布式下的用户状态,不过现在分布式的还是无状态的Jwt比较主流 一、创建SpringBoot的项目 spring-boot-starte…...
Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式
HTTP协议是“请求-响应”模式,浏览器必须先发请求给服务器,服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用,如在线游戏、股票实时报价和在线协同编辑等,浏览器需实时显示服务器的最新数据&#x…...
安全框架springSecurity+Jwt+Vue-2(后端开发)
一、创建项目及配置 ①:创建新的项目及常用包 ②:引入依赖和配置 devtools:项目的热加载重启插件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&…...
6.1.webrc媒体协商
那今天呢?我们来看一下y8 rtc的媒体协商,那实际上在我们之前的课程中呢?我已经向你介绍过y8 rtc的媒体协商了。只不过呢,角度是不一样的,在之前介绍外边tc媒体协商的时候呢,我们是从应用的角度来看。那web …...
Android WebView中打开外部超链接无反应
什么是外部超链接? 相当于是跳转到一个新的网址页面 解决方案选择: 1.在WebView内部中打开外部超链接 设置setSupportMultipleWindows为false即可 webView.settings.setSupportMultipleWindows(false)2.打开系统浏览器打开新页面 设置setSupportMul…...
JMeter集结点的使用场景以及如何使用?
JMeter是一个开源的负载测试工具,它被广泛用于测试应用程序、Web服务和网络协议等的性能。在JMeter中,集结点(JMeter Cluster)是一种分布式测试环境,它允许多个JMeter实例同时工作来模拟高并发负载。 使用集结点的场景…...
2023最新面试题
第一家 自我介绍介绍一下最近一个(最熟悉的一个)项目 项目几个人在负责 项目实际在用了吗,哪个平台在用啊(在哪里上线) 你认为你自己做的项目里面哪个比较难做呢,项目里面有什么难点?常用的是V…...
shell 脚本的函数和数组
函数 —— 封装的一个公式:sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块,在函数中写执行的命令即可;使用函数可以避免代码重复,增加可读性,简化脚本,使用函数可以将大的工程分割为若…...
【RocketMq系列-02】RocketMq的架构解析和高性能设计
RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…...
【数据结构/C++】线性表_单链表的基本操作
#include <iostream> using namespace std; // 2. 单链表 // ElemType 的定义 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *LinkList; // 初始化单链表 bool InitList(LinkList &L) {L (LNode *)malloc(sizeof(LNode…...
flink1.13.6版本的应用程序(maven版)
问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程,指…...
深度学习之四(循环神经网络Recurrent Neural Networks,RNNs)
概念 循环神经网络(Recurrent Neural Networks,RNNs)是一类专门用于处理序列数据的神经网络,它在处理时考虑了序列数据的顺序和上下文信息。RNNs 在自然语言处理、时间序列分析、语音识别等领域得到广泛应用。 1. 基本结构: RNN 的基本结构包含一个或多个循环单元,每个…...
【论文精读】HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face
HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face 前言Abstract1 Introduction2 Related Works3 HuggingGPT3.1 Task PlanningSpecification-based InstructionDemonstration-based Parsing 3.2 Model SelectionIn-context Task-model Assignment 3…...
安装gitlab
安装gitlab 环境 关闭防火墙以及selinux,起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网:GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址: [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…...
Nginx模块开发之http handler实现流量统计(1)
文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…...
JSP编写自己的第一个WebServlet实现客户端与服务端交互
我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…...
三、Keil安装芯片包、下载固件库、建立STM32工程模板
目录 一、首先在Keil软件上安装好芯片包 二、下载官方固件库 三、建立基于固件库的Keil5工程模板 一、首先在Keil软件上安装好芯片包 STM32有很多系列的芯片,我们平常用的最多的是STM32F1系列的,因此安装F1系列的芯片包在我们初学时,只按照…...
微信相框M1-03花屏抢救照片数据
故障现象 相册屏幕花屏,无法显示,拔掉电源黑屏(内部自带锂电池的) 问题排查 开始怀疑屏幕故障,拆开看到内部,发现是锂电池时间长鼓包后,顶到PCB,PCB板已经翘曲了,导致花…...
小程序可拖拽按钮
你有没有遇到过在页面中有一个固定在某个位置的按钮,永远的挡住了你想要看的区域? 在小程序的列表页面中,常常会有一个提报的入口固定在右下角,如果这个按钮不可拖动的话,可能会挡住下面的事件,让用户操作起…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

