Spring Cloud Alibaba快速入門02-Nacos(中)

文章目錄

  • 實現注冊中心-服務發現
    • 模擬掉線
    • 遠程調用
      • 1.訂單和商品模塊的接口
        • 商品服務
        • 訂單服務
      • 2.抽取實體類
      • 3.訂單服務拿到需要調用服務的ip和端口
    • 負載均衡
      • 步驟1
      • 步驟2
      • 步驟3
      • 步驟4
    • 面試題:注冊中心宕機,遠程調用還能成功嗎?
      • 1、調用過;遠程調用不在依賴注冊中心,可以通過
      • 2、沒調用過:(第一次發起遠程調用);不能通過


在這里插入圖片描述

實現注冊中心-服務發現

在這里插入圖片描述使用@EnableDiscoveryClient開啟服務發現功能

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient//開啟服務發現功能
@SpringBootApplication
public class ProductApplication {public static void main(String[] args) {SpringApplication.run(ProductApplication.class, args);}
}

導入單元測試依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!--只在test目錄下生效-->
</dependency>

執行

import com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery;
import com.alibaba.nacos.api.exception.NacosException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;import java.util.List;@SpringBootTest
public class DiscoveryTest {@AutowiredDiscoveryClient discoveryClient;@Testvoid discoveryClientTest(){for (String service : discoveryClient.getServices()) {System.out.println("service = " + service);//獲取ip+portList<ServiceInstance> instances = discoveryClient.getInstances(service);for (ServiceInstance instance : instances) {System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());}}/*service = qf-service-orderip:192.168.109.1;port = 8080ip:192.168.109.1;port = 8081service = qf-service-productip:192.168.109.1;port = 8181ip:192.168.109.1;port = 8180ip:192.168.109.1;port = 8182*/}@AutowiredNacosServiceDiscovery nacosServiceDiscovery;@Testvoid  nacosServiceDiscoveryTest() throws NacosException {for (String service : nacosServiceDiscovery.getServices()) {System.out.println("service = " + service);List<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);for (ServiceInstance instance : instances) {System.out.println("ip:"+instance.getHost()+";"+"port = " + instance.getPort());}}/*service = qf-service-orderip:192.168.109.1;port = 8080ip:192.168.109.1;port = 8081service = qf-service-productip:192.168.109.1;port = 8181ip:192.168.109.1;port = 8180ip:192.168.109.1;port = 8182*/}
}

DiscoveryClient是spring的規范,NacosServiceDiscovery是nacos的

模擬掉線

在這里插入圖片描述
運行nacosServiceDiscoveryTest()

service = qf-service-order
ip:192.168.109.1;port = 8080
service = qf-service-product
ip:192.168.109.1;port = 8181
ip:192.168.109.1;port = 8180
ip:192.168.109.1;port = 8182

遠程調用

在這里插入圖片描述

這里暫時使用RestTemplate實現遠程調用
在這里插入圖片描述

1.訂單和商品模塊的接口

先完善訂單和商品模塊的接口,完成啟動各自項目后調用各自的接口即可

商品服務
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Product {private Long id;private BigDecimal price;private String productName;private int num;
}
import com.qf.entity.Product;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;@RestController
public class ProductController {@GetMapping("/product/{id}")public Product getProduct(@PathVariable("id") Long id){Product product = new Product();product.setId(id);product.setProductName("華為手機");product.setPrice(new BigDecimal(5000));product.setNum(100);return product;}
}
訂單服務
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;@Data
public class Order {private Long id;private Long userId;private BigDecimal totalAmount;private String address;private List<Product> productList;
}

Controller

import com.qf.entity.Order;
import com.qf.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("/create")public Order createOrder(@RequestParam("userId") Long userId,@RequestParam("productId") Long productId) {return orderService.createOrder(userId, productId);}
}

服務類

import com.qf.entity.Order;
import org.springframework.web.bind.annotation.RequestParam;public interface OrderService {Order createOrder(@RequestParam("userId") Long userId, @RequestParam("productId") Long productId);
}
import com.qf.entity.Order;
import com.qf.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;
import java.util.List;@Slf4j
@Component
public class OrderServiceImpl implements OrderService {@Overridepublic Order createOrder(Long userId, Long productId) {Order order = new Order();order.setId(1L);order.setUserId(userId);order.setTotalAmount(new BigDecimal(100));order.setAddress("北京");order.setProductList(null);return order;}
}

2.抽取實體類

因為在遠程調用時要使用對方的實體類,所以直接將實體類單獨放在一個項目(取名model)中
在services父項目中依賴model

<dependency><groupId>com.qf</groupId><artifactId>model</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

項目結構
在這里插入圖片描述

3.訂單服務拿到需要調用服務的ip和端口

配置類

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class BeanConfig {@BeanRestTemplate restTemplate(){return new RestTemplate();}
}

訂單服務類

import com.qf.entity.Order;
import com.qf.entity.Product;
import com.qf.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;@Slf4j
@Component
public class OrderServiceImpl implements OrderService {@Overridepublic Order createOrder(Long userId, Long productId) {Product product = getProductFromRemote(productId);Order order = new Order();order.setId(1L);order.setUserId(userId);order.setTotalAmount(new BigDecimal(100));order.setAddress("北京");order.setProductList(Arrays.asList(product));return order;}//遠程調用@AutowiredDiscoveryClient discoveryClient;@AutowiredRestTemplate restTemplate;private Product getProductFromRemote(Long productId) {//1、獲取到商品服務所在的所有機器IP+portList<ServiceInstance> instances = discoveryClient.getInstances("qf-service-product");//拿取第一個地址ServiceInstance instance = instances.get(0);//拼接遠程URLString url = "http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + productId;log.info("遠程請求:{}", url);//2、給遠程發送請求,自動將json格式轉為對象Product product = restTemplate.getForObject(url, Product.class);return product;}
}

訂單調用接口時,通過RestTemplate實現遠程調用商品服務,在nacos中下線商品服務可以看到日志調用其他端口。
現在只是從nacos拿到商品服務第一個ip和端口,接下來通過負載均衡依次調用多個商品服務的ip和端口

負載均衡

在這里插入圖片描述

步驟1

order添加依賴

<!--        單元測試--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!--只在test目錄下生效--></dependency>
<!--        nacos負載均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

步驟2

測試類

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;import java.util.List;@SpringBootTest
public class LoadBalancerTest {@AutowiredDiscoveryClient discoveryClient;@AutowiredLoadBalancerClient loadBalancerClient;@Testvoid Test(){List<ServiceInstance> instances = discoveryClient.getInstances("qf-service-product");ServiceInstance choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());choose = loadBalancerClient.choose("qf-service-product");System.out.println(choose.getHost()+"-"+choose.getPort());System.out.println();}
}

此時商品服務在線情況
在這里插入圖片描述
輸出

192.168.109.1-8181
192.168.109.1-8180
192.168.109.1-8082
192.168.109.1-8181
192.168.109.1-8180
192.168.109.1-8082

步驟3

在訂單服務實現類中添加負載均衡代碼

@Override
public Order createOrder(Long userId, Long productId) {Product product = getProductFromRemoteWithLoadBalance(productId);Order order = new Order();order.setId(1L);order.setUserId(userId);order.setTotalAmount(new BigDecimal(100));order.setAddress("北京");order.setProductList(Arrays.asList(product));return order;
}//負載均衡
@Autowired
private LoadBalancerClient loadBalancerClient;
// 完成負載均衡發送請求
private Product getProductFromRemoteWithLoadBalance(Long productId){//1、獲取到商品服務所在的所有機器IP+portServiceInstance choose = loadBalancerClient.choose("qf-service-product");//遠程URLString url = "http://"+choose.getHost() +":" +choose.getPort() +"/product/"+productId;log.info("遠程請求:{}",url);//2、給遠程發送請求Product product = restTemplate.getForObject(url, Product.class);return product;
}

打印

2025-02-20T07:24:15.842+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-2] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8181/product/22
2025-02-20T07:24:16.641+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-1] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8180/product/22
2025-02-20T07:24:17.349+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-3] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8082/product/22
2025-02-20T07:24:17.823+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-4] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8181/product/22
2025-02-20T07:24:18.311+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-5] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8180/product/22
2025-02-20T07:24:18.836+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-6] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8082/product/22
2025-02-20T07:24:19.697+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-7] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8181/product/22
2025-02-20T07:24:20.328+08:00  INFO 40732 --- [qf-service-order] [nio-8080-exec-8] com.qf.service.Impl.OrderServiceImpl     : 遠程請求:http://192.168.109.1:8180/product/22

可以看到在輪詢訪問商品服務

步驟4

基于注解的負載均衡

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class BeanConfig {@BeanRestTemplate restTemplate(){return new RestTemplate();}@Bean@LoadBalancedRestTemplate restTemplateAndLoadBalanced(){return new RestTemplate();}
}

服務類

@Slf4j
@Component
public class OrderServiceImpl implements OrderService {@Overridepublic Order createOrder(Long userId, Long productId) {Product product = getProductFromRemoteWithLoadBalanceAnnotation(productId);Order order = new Order();order.setId(1L);order.setUserId(userId);order.setTotalAmount(new BigDecimal(100));order.setAddress("北京");order.setProductList(Arrays.asList(product));return order;}//負載均衡@AutowiredRestTemplate restTemplateAndLoadBalanced;//注解方式// 基于注解的負載均衡private Product getProductFromRemoteWithLoadBalanceAnnotation(Long productId){String url = "http://qf-service-product/product/"+productId;//2、給遠程發送請求; service-product 會被動態替換Product product = restTemplateAndLoadBalanced.getForObject(url, Product.class);return product;}
}

在商品服務中打斷點或打印,可以發現輪詢的訪問每個商品服務

面試題:注冊中心宕機,遠程調用還能成功嗎?

在這里插入圖片描述
一般情況下訂單服務會先從注冊中心拿到地址列表,在訪問商品服務。為了不每次遠程調用都訪問注冊中心,增加了實例緩存,實例緩存實時更新在注冊中心中的地址列表。

1、調用過;遠程調用不在依賴注冊中心,可以通過

當訂單服務從注冊中心中拿過商品服務的列表后,因為放在了實例緩存中,所以當注冊中心(nacos)關閉時,只要商品服務未關閉,仍然是可以繼續訪問的。

2、沒調用過:(第一次發起遠程調用);不能通過

重新開啟nacos,重啟所有的服務,但訂單服務先不訪問商品服務。
關閉nacos,訂單服務訪問商品服務,此時發生報錯

2025-02-20T07:53:38.094+08:00 ERROR 30652 --- [qf-service-order] [nio-8080-exec-1] scoveryClientServiceInstanceListSupplier : Exception occurred while retrieving instances for service qf-service-productjava.lang.RuntimeException: Can not get hosts from nacos server. serviceId: qf-service-productat com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient.getInstances(NacosDiscoveryClient.java:72) ~[spring-cloud-starter-alibaba-nacos-discovery-2023.0.3.2.jar:2023.0.3.2]at org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient.getInstances(CompositeDiscoveryClient.java:54) ~[spring-cloud-commons-4.1.4.jar:4.1.4]at org.springframework.cloud.loadbalancer.core.DiscoveryClientServiceInstanceListSupplier.lambda$new$0(DiscoveryClientServiceInstanceListSupplier.java:64) ~[spring-cloud-loadbalancer-4.1.4.jar:4.1.4]at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:137) ~[reactor-core-3.6.10.jar:3.6.10]...

所以當訂單服務沒調用過商品服務時(第一次發起遠程調用),,此時nacos宕機,調用失敗。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96066.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】數據可視化之熱力圖

熱力圖&#xff08;Heatmap&#xff09;是一種通過顏色深淺來展示數據分布、密度和強度等信息的可視化圖表。它通過對色塊著色來反映數據特征&#xff0c;使用戶能夠直觀地理解數據模式&#xff0c;發現規律&#xff0c;并作出決策。 目錄 基本原理 sns.heatmap 代碼實現 基…

如何 正確使用 nrm 工具 管理鏡像源

目錄 nrm 是啥&#xff1f; nrm 的安裝 查看你當前已有的鏡像源 怎么切換到目標鏡像源 添加鏡像源 刪除鏡像源 測試鏡像源速度 nrm 是啥&#xff1f; 鏡像源&#xff1a;可以理解為&#xff0c;你訪問或下載某jar包或依賴的倉庫。 nrm&#xff08;Node Registry Manag…

關于對逾期提醒的定時任務~改進完善

Spring Boot 中實現到期提醒任務的定時Job詳解在金融或借貸系統中&#xff0c;到期提醒是常見的功能需求。通過定時任務&#xff0c;可以定期掃描即將到期的借款記錄&#xff0c;并生成或更新提醒信息。本文基于提供的三個JobHandler類&#xff08;FarExpireRemindJob、MidExpi…

springboot配置請求日志

springboot配置請求日志 一般情況下&#xff0c;接口請求都需要日志記錄&#xff0c;Java springboot中的日志記錄相對復雜一點 經過實踐&#xff0c;以下方案可行&#xff0c;記錄一下完整過程 一、創建日志數據模型 創建實體類&#xff0c;也就是日志文件中要記錄的數據格式 …

Redis(50) Redis哨兵如何與客戶端進行交互?

Redis 哨兵&#xff08;Sentinel&#xff09;不僅負責監控和管理 Redis 主從復制集群的高可用性&#xff0c;還需要與客戶端進行有效的交互來實現故障轉移后的透明連接切換。下面詳細探討 Redis 哨兵如何與客戶端進行交互&#xff0c;并結合代碼示例加以說明。 哨兵與客戶端的交…

【.Net技術棧梳理】04-核心框架與運行時(線程處理)

文章目錄1. 線程管理1.1 線程的核心概念&#xff1a;System.Threading.Thread1.2 現代線程管理&#xff1a;System.Threading.Tasks.Task 和 Task Parallel Library (TPL)1.3 狀態管理和異常處理1.4 協調任務&#xff1a;async/await 模式2. 線程間通信2.1 共享內存與競態條件2…

(JVM)四種垃圾回收算法

在 JVM 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是核心機制之一。為了提升性能與內存利用率&#xff0c;JVM 采用了多種垃圾回收算法。本文總結了 四種常見的 GC 算法&#xff0c;并結合其優缺點與應用場景進行說明。1. 標記-清除&#xff08;Mark-Sweep&#xff09;…

論文閱讀:VGGT Visual Geometry Grounded Transformer

論文閱讀&#xff1a;VGGT: Visual Geometry Grounded Transformer 今天介紹一篇 CVPR 2025 的 best paper&#xff0c;這篇文章是牛津大學的 VGG 團隊的工作&#xff0c;主要圍繞著 3D 視覺中的各種任務&#xff0c;這篇文章提出了一種多任務統一的架構&#xff0c;實現一次輸…

python編程:一文掌握pypiserver的詳細使用

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、 pypiserver 概述 1.1 pypiserver是什么? 1.2 核心特性 1.3 典型應用場景 1.4 pypiserver優缺點 二、 安裝與基本使用 2.1 安裝 pypiserver 2.2 快速啟動(最簡模式) 2.3 使用私有服務器安裝包 2.4 向私有服務…

Git reset 回退版本

- 第 121 篇 - Date: 2025 - 09 - 06 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文章目錄Git reset 回退版本1 介紹三種命令區別3 驗證三種的區別3 如果不小心git reset --hard將「工作區」和「暫存區」中的內容刪除&#xff0c;剛才的記錄找不到了&#xff0c;怎么辦呢&…

ARM 基礎(2)

ARM內核工作模式及其切換條件用戶模式(User Mode, usr) 權限最低&#xff0c;運行普通應用程序。只能通過異常被動切換到其他模式。快速中斷模式(FIQ Mode, fiq) 處理高速外設中斷&#xff0c;專用寄存器減少上下文保存時間&#xff0c;響應周期約4個時鐘周期。觸發條件為FIQ中…

Flutter 性能優化

Flutter 性能優化是一個系統性的工程&#xff0c;涉及多個層面。 一、性能分析工具&#xff08;Profiling Tools&#xff09; 在開始優化前&#xff0c;必須使用工具定位瓶頸。切忌盲目優化。 1. DevTools 性能視圖 DevTools 性能視圖 (Performance View) 作用&#xff1a;…

Spring事件監聽機制(三)

為了理解EvenListener注解的底層原理&#xff0c;我們可以自己實現一個類似的注解模擬實現。1.定義MyListener注解Target({ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)public interface MyListener {}2.注解使用Componentstatic class SmsService {private static…

基于Springboot + vue3實現的小區物業管理系統

項目描述本系統包含管理員和用戶兩個角色。管理員角色&#xff1a;用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。房屋信息管理&#xff1a;管理房屋信息&#xff0c;包括新增、查看、修改和刪除房屋信息。車輛信息管理&#xff1a;管理…

交叉熵和KL散度

這個問題之前我也是傻傻分不清&#xff0c;決定整理一下&#xff0c;用更印象深刻的方式讓人記住。核心聯系&#xff1a;交叉熵 KL 散度 真實分布的熵 交叉熵作為 “絕對” 度量&#xff0c;會綜合真實分布的熵&#xff08;固有難度&#xff09;與預測誤差&#xff0c;直接體…

HTML 各種事件的使用說明書

HTML 各種事件的使用說明書 1. HTML 事件簡介 HTML事件是瀏覽器或用戶在網頁上執行的動作或發生的事情。當這些事件發生時&#xff0c;可以通過JavaScript來響應和處理這些事件&#xff0c;從而實現網頁的交互功能。事件處理是Web前端開發中實現動態交互的核心機制。 基本概…

Kafka面試精講 Day 10:事務機制與冪等性保證

【Kafka面試精講 Day 10】事務機制與冪等性保證 在分布式消息系統中&#xff0c;如何確保消息不丟失、不重復&#xff0c;是系統可靠性的核心挑戰。Kafka自0.11版本起引入了冪等性Producer和事務性消息機制&#xff0c;徹底解決了“至少一次”語義下可能產生的重復消息問題&am…

時序數據庫簡介和安裝

一、簡介1. 什么是時序數據庫&#xff1f;時序數據庫是專門用于存儲和處理時間序列數據的數據庫系統。時間序列數據是指按時間順序索引的一系列數據點。每個數據點都包含&#xff1a;一個時間戳&#xff1a;記錄數據產生的時間。一個或多個指標值&#xff1a;例如溫度、濕度、C…

comfyUI 暴露網絡restful http接口

https://zhuanlan.zhihu.com/p/686893291 暴露websocket接口。 打開開發者選項 如圖

linux系統address already in use問題解決

linux系統上某個端口被占用&#xff0c;如何解決&#xff1f;1.找到占用的進程編號&#xff1a;netstat -tulnp | grep :80002.強制殺死該進程kill -9 80603其他說明&#xff1a;1.查找占用端口的進程&#xff0c;可以用&#xff1a;lsof -i :8001 # 或者使用 netstat -tulnp |…