Nacos学习(一)——基本介绍、安装与负载均衡策略

目录

一、Nacos基本介绍

二、安装与使用

(一)Nacos安装

1.上传到linux上解压

2.按需修改配置文件

3.单机启动

4.查看Nacos启动日志

5.浏览器访问Nacos服务

6.关闭Nacos服务

(二)Nacos使用

1.新建一个项目

2.最外部依赖如下

3.provider-service包的依赖

4.配置文件:application.properties

5.创建启动类

6.服务被成功注册

7.修改注册ip

三、使用Nacos实现服务间的简单通讯

1.新建Controller

2.新建Model——consumer-service

3.pom添加依赖

4.修改application.properties文件 

5.新建Controller 

6.启动两个Model

7.浏览器访问Consumer-Service中的接口

四、Nacos中负载均衡

(一)轮询策略(默认)

(二)随机策略

(三)权重策略

(四)调用不同的服务,使用不同的负载均衡策略

1.新建user-service模块

2.修改consumer-service模块

3.修改调用方ConsumerController

4.创建ProviderConfig

5.创建UserConfig

6.重新启动Consumer-service服务


一、Nacos基本介绍

        Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建云原生应用。它是 Naming and Configuration Service 的缩写,支持多种应用场景,包括微服务架构中的服务注册与发现、动态配置管理以及分布式系统的服务管理。

        官网:https://nacos.io/

主要功能和使用场景:

1. 服务发现

  • 提供服务的动态注册与发现能力。

2. 动态配置管理

  • 提供集中化的配置管理功能,允许开发者在运行时动态更新配置而无需重启应用。
  • 提供配置的历史版本管理和回滚功能。

3. 服务管理

  • 提供服务的元数据管理能力,支持自定义标签和属性。
  • 支持流量管理,例如负载均衡、灰度发布等。
  • 提供服务治理能力,如限流、熔断、降级等。

4. 多语言支持

  • Nacos 提供了多种语言的 SDK,包括 Java、Python、Go、Node.js 等。
  • 开发者可以方便地将 Nacos 集成到不同技术栈的应用中。

5. 高可用性和扩展性

  • Nacos 支持集群部署,提供高可用性。
  • 支持水平扩展,满足大规模微服务架构的需求。

6. 生态集成

  • Nacos 是 Spring Cloud Alibaba 的重要组件之一,能够无缝集成到 Spring Cloud 和 Dubbo 等微服务框架中。
  • 与 Kubernetes 等容器编排工具兼容,适合云原生环境。

使用场景

  • 微服务架构:作为服务注册中心和配置中心,支持服务间的通信和动态配置管理。
  • 分布式系统:用于管理分布式系统的配置和服务依赖关系。
  • 云原生应用:结合 Kubernetes 和其他云原生工具,提供统一的服务治理能力。 

二、安装与使用

(一)Nacos安装

安装前提:虚拟机已安装jdk,我这里使用jdk11

1.上传到linux上解压

 tar -zxvf nacos-server-2.0.4.tar.gz

2.按需修改配置文件

根据个人虚拟机情况修改

/home/soft/nacos/bin/startup.sh文件:# 87行   JAVA_OPT="${JAVA_OPT} -Xms128m -Xmx128m -Xmn64m"-Xms512m:堆内存初始大小为 512 MB。
-Xmx512m:堆内存最大大小为 512 MB。
-Xmn256m:年轻代大小为 256 MB,老年代大小为 256 MB。

3.单机启动

[root@lxm102 bin]# ./startup.sh -m standalone
/home/soft/jdk-11.0.17/bin/java   -Xms128m -Xmx128m -Xmn64m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/home/soft/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/home/soft/nacos/plugins/health,/home/soft/nacos/plugins/cmdb,/home/soft/nacos/plugins/selector -Dnacos.home=/home/soft/nacos -jar /home/soft/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/home/soft/nacos/conf/ --logging.config=/home/soft/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /home/soft/nacos/logs/start.out

4.查看Nacos启动日志

[root@lxm102 bin]# tail -f ../logs/start.out 
2025-02-18 16:50:44,566 INFO Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5d3f99d7, org.springframework.security.web.context.SecurityContextPersistenceFilter@782ac148, org.springframework.security.web.header.HeaderWriterFilter@7cc1f72c, org.springframework.security.web.csrf.CsrfFilter@79d63a4f, org.springframework.security.web.authentication.logout.LogoutFilter@23afc725, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@61d2f267, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@12365bd8, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@561d88ee, org.springframework.security.web.session.SessionManagementFilter@54463380, org.springframework.security.web.access.ExceptionTranslationFilter@1b8fa2fa]2025-02-18 16:50:44,764 INFO Initializing ExecutorService 'taskScheduler'2025-02-18 16:50:44,985 INFO Exposing 16 endpoint(s) beneath base path '/actuator'2025-02-18 16:50:45,539 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'2025-02-18 16:50:45,558 INFO Nacos started successfully in stand alone mode. use embedded storage

5.浏览器访问Nacos服务

http://虚拟机ip:8848/nacos

用户名和密码都是nacos,登录后页面如下:

6.关闭Nacos服务

[root@lxm102 bin]# sh shutdown.sh 
The nacosServer(26890) is running...
Send shutdown request to nacosServer(26890) OK

(二)Nacos使用

1.新建一个项目

2.最外部依赖如下

<modules><module>provider-service</module>
</modules>
<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.6.11</version>
</parent>
<dependencyManagement><dependencies><!--spring cloud 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.4</version><type>pom</type><scope>import</scope></dependency><!--spring loud alibaba 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.4.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

3.provider-service包的依赖

<parent><artifactId>spring-cloud-alibaba-demo</artifactId><groupId>org.javatest</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider-service</artifactId>
<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--nacos依赖,跟nacos通信使用--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
</dependencies>

4.配置文件:application.properties

server.port=8000
spring.application.name=provider-service#nacos的地址
spring.cloud.nacos.discovery.server-addr=192.168.157.102:8848

5.创建启动类

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

6.服务被成功注册

点击详情:

7.修改注册ip

application.properties文件新增一行

spring.cloud.nacos.discovery.ip=192.168.0.16

重新启动后,ip注册成功 

三、使用Nacos实现服务间的简单通讯

1.新建Controller

给provider-service包新建Controller

@RestController
public class ProviderController {@Value("${server.port}")private String port;@GetMapping("/provider")public String provider() {return "provider-service:" + port;}
}

2.新建Model——consumer-service

3.pom添加依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--nacos依赖,跟nacos通信使用--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
</dependencies>

4.修改application.properties文件 

server.port=8888
spring.application.name=consumer-service#nacos的地址
spring.cloud.nacos.discovery.server-addr=192.168.157.102:8848
spring.cloud.nacos.discovery.ip=192.168.0.16

5.新建Controller 

@RestController
public class ConsumerController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/getport")public String hello() {List<ServiceInstance> instances = discoveryClient.getInstances("provider-service");ServiceInstance serviceInstance = instances.get(0);String ip = serviceInstance.getHost();int port = serviceInstance.getPort();String url = "http://" + ip + ":" + port + "/provider";RestTemplate restTemplate = new RestTemplate();return restTemplate.getForObject(url, String.class);}
}

6.启动两个Model

现在是Consumer-Service访问Provider-Service,启动后成功注册在Nacos中:

7.浏览器访问Consumer-Service中的接口

http://localhost:8888/getport

四、Nacos中负载均衡

(一)轮询策略(默认)

搭建provider伪集群

启动两个配置,有下面两个实例,就说明伪集群搭建成功

在consumer-service模块中添加下面的依赖:

注意:spring-cloud-starter-loadbalancer这个依赖,哪一方调用,哪一方才添加,被调用方不添加这个依赖。

<!--负载均衡组件-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

在consumer-service模块中新增Config类: 

@Configuration
public class Config {// 负载均衡的本质是AOP@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

ConsumerController中添加下面的接口: 

@Autowired
private RestTemplate restTemplate;@GetMapping("/balancer")
public String balancer() {String url = "http://provider-service/provider";return restTemplate.getForObject(url, String.class);
}

在使用RestTemplate的时候,会自动将服务名替换为ip和端口号,进行负载均衡。

浏览器每刷新一次,都会访问不同的端口: 

                

负载均衡默认使用轮询策略的原因:

        在LoadBalancerClientConfiguration类中声明了new RoundRobinLoadBalancer()这一bean对象,说明默认使用的是轮询策略。

(二)随机策略

修改配置类,创建的是RandomLoadBalancer

@Configuration
// 告诉LoadBalance框架,使用的是当前的配置类获取负载均衡策略
@LoadBalancerClients(defaultConfiguration = Config.class)
public class Config {// 负载均衡的本质是AOP@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}// 使用随机策略@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

重启项目:

 

刷新浏览器后,8000和8001出现是随机的。 

(三)权重策略

将原来的RandomLoadBalancer改为NacosLoadBalancer,会报错,原因是缺少参数: 

缺少的就是这个参数:

点进这个参数 :

@ConfigurationProperties("spring.cloud.nacos.discovery") 是一个注解,用于将配置文件中以 spring.cloud.nacos.discovery 为前缀的属性绑定到 Java 对象的字段中。

因此,最终的Config: 

@Configuration
// 告诉LoadBalance框架,使用的是当前的配置类获取负载均衡策略
@LoadBalancerClients(defaultConfiguration = Config.class)
public class Config {// 负载均衡的本质是AOP@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}// 使用随机策略/*@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}*//*** 使用Nacos权重随机策略** @param environment* @param loadBalancerClientFactory* @return*/@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);}
}

重启consumer服务,访问浏览器,8001的权重高,被访问到的概率更大,而不是访问次数。 

开发中,偏向于哪台机器承接更多的访问量,就把哪台机器的权重调的更大一些即可。

(四)调用不同的服务,使用不同的负载均衡策略

@LoadBalancerClients(defaultConfiguration = {Config.class})

这表示只有一个负责均衡策略 NacosLoadBalancer(权重随机策略),当我们想对不同的服务,采用不同的策略怎么办呢?

现在要求:调用provider-service集群使用权重随机,调用user-service服务使用轮询。

1.新建user-service模块

application.properties文件:

#server.port=7000
spring.application.name=user-service#nacos的地址
spring.cloud.nacos.discovery.server-addr=192.168.157.102:8848
spring.cloud.nacos.discovery.ip=192.168.0.16

pom.xml文件: 

<dependencies><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>
</dependencies>

UserController: 

@RestController
public class UserController {@Value("${server.port}")private String port;@GetMapping("/userport")public String userport() {return "user-service:" + port;}
}

user-service同样创建伪集群 

 

启动user-service集群

2.修改consumer-service模块

3.修改调用方ConsumerController

@RestController
public class ConsumerController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/getport")public String hello() {List<ServiceInstance> instances = discoveryClient.getInstances("provider-service");ServiceInstance serviceInstance = instances.get(0);String ip = serviceInstance.getHost();int port = serviceInstance.getPort();String url = "http://" + ip + ":" + port + "/provider";RestTemplate restTemplate = new RestTemplate();return restTemplate.getForObject(url, String.class);}@Autowiredprivate RestTemplate restTemplate;@GetMapping("/balancer")public String balancer() {String url = "http://provider-service/provider";return restTemplate.getForObject(url, String.class);}/*** 调用user-service*/@GetMapping("/user")public String user() {String url = "http://user-service/userport";return restTemplate.getForObject(url, String.class);}
}

4.创建ProviderConfig

/*** 配置访问provider-service时,使用的负载均衡策略*/
public class ProviderConfig {@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;/*** 使用权重随机策略* @param environment* @param loadBalancerClientFactory* @return*/@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);}
}

5.创建UserConfig

/*** 配置访问provider-service时,使用的负载均衡策略*/
public class UserConfig {/*** 使用轮询策略* @param environment* @param loadBalancerClientFactory* @return*/@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

6.重新启动Consumer-service服务

访问provider-service时使用随机权重

访问user-service时使用轮询

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…

JVM 类加载器深度解析(含实战案例)

上期文章内容&#xff1a;JVM类加载过程详解&#xff1a;从字节码到内存的蜕变之旅 目录 一、类加载器的本质是什么&#xff1f; 二、类加载机制全景 1.1 三阶段生命周期 1.2 关键数据结构 三、类加载器体系架构 2.1 四层标准类加载器 2.2 类加载器树形结构 四、双亲委派…

仿 Sora 之形,借物理模拟之技绘视频之彩

来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer&#xff08;以下简称“PD”&#xff09;。PD与OpenAI旗下的Sora相似&#xff0c;能够借助物理模拟技术来生成视频&#xff0c;这意味着PD所生成的视频蕴…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

【开源免费】基于SpringBoot+Vue.JS善筹网站(JAVA毕业设计)

本文项目编号 T 205 &#xff0c;文末自助获取源码 \color{red}{T205&#xff0c;文末自助获取源码} T205&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

vue+elementplus创建初始化安装

项目创建初始化 D:\Tool\mysql\education_vue 这个路径下cmd 或打开vscode&#xff0c;把项目丢进code中打开 安装element plus Container 布局容器 | Element Plus npm install element-plus --save 把项目初始文件Homeview AboutView删了&#xff0c;Router index.js中删一…

Word接入DeepSeek(API的作用)

1.打开”Word”&#xff0c;点击“文件”。 2.点击“选项”。 3.点击“信任中心”——“信任中心设置”。 4. 勾选”启用所有宏“&#xff0c;点击”确定“。 5.点击“自定义功能区”&#xff0c;勾选上“开发工具”&#xff0c;点击“确定”。 6.返回“文件——开发工具“下的…

Macos机器hosts文件便捷修改工具——SwitchHosts

文章目录 SwitchHosts软件下载地址操作添加方案切换方案管理方案快捷键 检测 SwitchHosts SwitchHosts 是一款 Mac 平台上的免费软件&#xff0c;它可以方便地管理和切换 hosts 文件&#xff0c;支持多种 hosts 文件格式。 软件下载地址 SwitchHosts 操作 添加方案 添加 …

Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅

摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车&#xff0c;搭载5.0 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;接通空调开关后&#xff0c;有时出风忽大忽小&#xff0c;有时不出风&#xff0c;有时要等2 min左右才出风&#xff1b;有时两三天出现一次&#xff0c;…

Django项目之订单管理part1

一.前言 我们前面把django的常用知识点给讲完了&#xff0c;现在我们开始项目部分&#xff0c;项目是一个订单管理系统&#xff0c;我们同时也会在项目之中也会讲一些前面没有用到的知识点。 项目大概流程如下&#xff1a; 核心的功能模块&#xff1a; 认证模块&#xff0c;用…

低代码与 Vue.js:技术选型与架构设计

在当下数字化转型的浪潮中&#xff0c;企业对应用开发的效率和质量有着极高的追求。低代码开发平台的兴起&#xff0c;为企业提供了一条快速构建应用的捷径&#xff0c;而 Vue.js 作为热门的前端框架&#xff0c;与低代码开发平台的结合备受关注。如何做好两者的技术选型与架构…

LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装

LlamaFactory https://llamafactory.readthedocs.io/zh-cn/latest/ 安装 必须保证版本匹配&#xff0c;否则到训练时&#xff0c;找不到gpu cuda。 否则需要重装。下面图片仅供参考。因为cuda12.8装了没法用&#xff0c;重新搞12.6 cudacudnnpytorch12.69.612.6最新&#xf…

【GPT】从GPT1到GPT3

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 从GPT1 到GPT3 1. GPT1 论文&#xff1a; https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/lan…

Jredis和SpringDataRedis学习笔记

jredis基础操作 jredis连接池 其中有个静态方法getJedis能够将练级池中的连接拿取出来并返回 通过setMaxWaitMitllis设置一个响应时间&#xff0c;如果连接池里面没有连接&#xff0c;那么请求连接方在等待超过响应时间时就会报错 springDataRedis 通过这样一个代码将redisTe…

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

vite调试node_modules下面插件

在使用vite进行开发的时候,我们可能想要修改node_modules中插件的源码.特别是集成一个SDK&#xff0c;需要调试去判断问题时&#xff0c;或者研究第三方源码时后; vite默认是走缓存的&#xff0c;所以当修改后不会看到你打印的日志&#xff0c;这个时候有几种方法可以选择; 方式…

大数据开发治理平台~DataWorks(核心功能汇总)

目录 数据集成 功能概述 使用限制 功能相关补充说明 数据开发 功能概述 数据建模 功能概述 核心技术与架构 数据分析 功能概述 数据治理 数据地图 功能概述 数据质量 功能概述 数据治理资产 功能概述 使用限制 数据服务 功能概述 数据集成 DataWorks的数据…

JAVA生产环境(IDEA)排查死锁

使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤&#xff1a; 1. 编写并运行代码 首先&#xff0c;我们编写一个可能导致死锁的示例代码&#xff1a; public class DeadlockExample {private static final Obj…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介&#xff1a;Ollama 是一个强大的开源框架&#xff0c;是一个为本地运行大型语言模型而设计的工具&#xff0c;它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xff0c;可以让用户执行一条命令就在本地运…