在微服務整合dubbo,以為微服務版的若依為例

在微服務整合dubbo,以為微服務版的若依為例

  • 一、環境
  • 二、整合過程
    • 1、父模塊依賴
    • 2、生產者
    • 3、消費者
  • 三、修改若依的服務調用方式為dubbo
    • 1、改造系統模塊
    • 2、改造認證授權中心
  • 四、整合過程遇到的問題
    • 1、出現循環引用
    • 2、出現依賴沖突
    • 3、啟動出現端口號被占用
    • 4、出現某個類找不到
    • 5、找不到生產者

一、環境

微服務版若依3.6.3
dubbo2021.0.1
nacos2.2.1

二、整合過程

1、父模塊依賴

<?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"><modelVersion>4.0.0</modelVersion><groupId>com.ruoyi</groupId><artifactId>ruoyi</artifactId><version>3.6.3</version><name>human</name><url>http://www.ruoyi.vip</url><description>若依管理系統</description><properties><ruoyi.version>3.6.3</ruoyi.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-boot.version>2.7.13</spring-boot.version><spring-cloud.version>2021.0.8</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version><spring-boot-admin.version>2.7.10</spring-boot-admin.version><swagger.fox.version>3.0.0</swagger.fox.version><swagger.core.version>1.6.2</swagger.core.version><tobato.version>1.27.2</tobato.version><kaptcha.version>2.3.3</kaptcha.version><pagehelper.boot.version>1.4.7</pagehelper.boot.version><druid.version>1.2.16</druid.version><dynamic-ds.version>3.5.2</dynamic-ds.version><commons.io.version>2.11.0</commons.io.version><velocity.version>2.3</velocity.version><fastjson.version>2.0.34</fastjson.version><jjwt.version>0.9.1</jjwt.version><minio.version>8.2.2</minio.version><poi.version>4.1.2</poi.version><transmittable-thread-local.version>2.14.3</transmittable-thread-local.version><dubbo.version>2021.0.1.0</dubbo.version><hutool-all.version>5.8.16</hutool-all.version><lombok.version>1.18.24</lombok.version><minio.version>8.2.2</minio.version><guava.version>33.0.0-jre</guava.version></properties><!-- 依賴聲明 --><dependencyManagement><dependencies><!-- SpringCloud 微服務 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服務 --><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><!-- SpringBoot 依賴配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- FastDFS 分布式文件系統 --><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>${tobato.version}</version></dependency><!-- Swagger 依賴配置 --><dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>${swagger.core.version}</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>${swagger.core.version}</version></dependency><!-- 驗證碼 --><dependency><groupId>pro.fessional</groupId><artifactId>kaptcha</artifactId><version>${kaptcha.version}</version></dependency><!-- pagehelper 分頁插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.boot.version}</version></dependency><!-- io常用工具類 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons.io.version}</version></dependency><!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><!-- 代碼生成使用模板 --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>${velocity.version}</version></dependency><!-- JSON 解析器和生成器 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>${fastjson.version}</version></dependency><!-- JWT --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!-- 線程傳遞值 --><dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>${transmittable-thread-local.version}</version></dependency><!-- 核心模塊 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-core</artifactId><version>${ruoyi.version}</version></dependency><!-- 接口模塊 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-swagger</artifactId><version>${ruoyi.version}</version></dependency><!-- 安全模塊 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-security</artifactId><version>${ruoyi.version}</version></dependency><!-- 權限范圍 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datascope</artifactId><version>${ruoyi.version}</version></dependency><!-- 多數據源 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datasource</artifactId><version>${ruoyi.version}</version></dependency><!-- 分布式事務 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-seata</artifactId><version>${ruoyi.version}</version></dependency><!-- 日志記錄 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-log</artifactId><version>${ruoyi.version}</version></dependency><!-- 緩存服務 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-redis</artifactId><version>${ruoyi.version}</version></dependency><!-- 系統接口 --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-api-system</artifactId><version>${ruoyi.version}</version></dependency><!-- Dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>${dubbo.version}</version></dependency><!-- hutool工具類--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool-all.version}</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- Minio --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version></dependency><!--這個依賴是整合dubbo時要用到的--><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency></dependencies></dependencyManagement><modules><module>ruoyi-auth</module><module>ruoyi-gateway</module><module>ruoyi-visual</module><module>ruoyi-modules</module><module>ruoyi-api</module><module>ruoyi-common</module></modules><packaging>pom</packaging><dependencies><!-- bootstrap 啟動器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></pluginManagement></build><repositories><repository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></project>

2、生產者

因為我要調用若依的文件服務,所以直接將文件服務作為生產者。依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>com.ruoyi</groupId><artifactId>ruoyi-modules</artifactId><version>3.6.3</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ruoyi-modules-file</artifactId><description>ruoyi-modules-file文件服務</description><dependencies><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- FastDFS --><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId></dependency><!-- RuoYi Api System --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-api-system</artifactId></dependency><!-- RuoYi Common Swagger --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-swagger</artifactId></dependency><!-- Dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!-- hutool工具類--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><!-- Minio --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId></dependency><!-- Mysql Connector --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- RuoYi Common DataSource --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datasource</artifactId></dependency><!-- RuoYi Common DataScope --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datascope</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

主要是這個依賴

<!-- Dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2021.0.1.0</version>
</dependency>

先在文件服務的 bootstrap.yml 加上如下配置,解決循環引用

在這里插入圖片描述

# Tomcat
server:port: 9300# Spring
spring:application:# 應用名稱name: ruoyi-filemain:allow-circular-references: true  # 中斷循環引用profiles:# 環境配置active: devcloud:nacos:discovery:# 服務注冊地址server-addr: 127.0.0.1:8848config:# 配置中心地址server-addr: 127.0.0.1:8848# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

如何在nacos中對應的配置文件中添加如下配置:

在這里插入圖片描述

# dubbo相關配置
dubbo:protocol:name: dubbo  # dubbo協議port: -1  # -1表示端口從20880開始遞增,不會造成端口沖突registry:address: nacos://127.0.0.1:8848# check: false  # dubbo默認有啟動檢查scan:base-packages: com.ruoyi.file.service

接著在啟動類中加上 @EnableDubbo 注解

在這里插入圖片描述

接著是dubbo的接口,接口放在這里

在這里插入圖片描述

具體如下:

package com.ruoyi.system.api;import com.ruoyi.system.api.domain.SysFileInfo;
import org.springframework.web.multipart.MultipartFile;import java.util.List;/*** dubbo文件接口** @author:gan* @date: 2024-01-30 09:58*/
public interface DubboFileService {/*** 文件上傳接口原始** @param file 上傳的文件* @return 訪問地址* @throws Exception*/String uploadFile(MultipartFile file) throws Exception;/*** 文件上傳接口(自定義)** @param file 上傳的文件* @param secondPath 文件二級路徑* @return 訪問地址* @throws Exception*/SysFileInfo upload(MultipartFile file, String secondPath) throws Exception;/*** 文件上傳接口(自定義)** @param file 上傳的文件* @return 訪問地址* @throws Exception*/SysFileInfo upload(MultipartFile file) throws Exception;/*** 根據文件id查詢文件* @param params* @return*/List<SysFileInfo> getSysFileInfoList(SysFileInfo params);
}

對應的實現類

package com.ruoyi.file.service;import com.ruoyi.system.api.DubboFileService;
import com.ruoyi.system.api.domain.SysFileInfo;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.util.List;/*** dubbo文件服務** @author:gan* @date: 2024-02-21 17:53*/
@DubboService(version = "1.0.0")
public class DubboFileServiceImpl implements DubboFileService {@Resourceprivate IMinioSysFileService minioSysFileService;@Overridepublic String uploadFile(MultipartFile file) throws Exception {return minioSysFileService.uploadFile(file);}@Overridepublic SysFileInfo upload(MultipartFile file, String secondPath) throws Exception {return minioSysFileService.upload(file, secondPath);}@Overridepublic SysFileInfo upload(MultipartFile file) throws Exception {return minioSysFileService.upload(file);}@Overridepublic List<SysFileInfo> getSysFileInfoList(SysFileInfo params) {return minioSysFileService.getSysFileInfoList(params);}
}

其實要用的方法都在 IMinioSysFileService 的實現類中寫好了,這里只是為了使用 @DubboService 注解。

然后啟動文件服務

在這里插入圖片描述

再查看nacos中的服務列表

在這里插入圖片描述

可以看到生產者已經啟動成功了。

3、消費者

在 ruoyi-modules 模塊下新建了一個 名為 common-test 的模塊作為消費者,依賴如下:

<?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>ruoyi-modules</artifactId><groupId>com.ruoyi</groupId><version>3.6.3</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common-test</artifactId><dependencies><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Swagger UI --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.fox.version}</version></dependency><!-- Mysql Connector --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- RuoYi Api System --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-api-system</artifactId></dependency><!-- RuoYi Common DataSource --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datasource</artifactId></dependency><!-- RuoYi Common DataScope --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datascope</artifactId></dependency><!-- RuoYi Common Swagger --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-swagger</artifactId></dependency><!-- Dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!--這個依賴是整合dubbo時要用到的--><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency></dependencies></project>

添加項目中的 bootstrap.yml 配置文件,具體內容如下:

# Tomcat
server:port: 9302# Spring
spring:application:# 應用名稱name: common-testmain:allow-circular-references: true  # 中斷循環引用profiles:# 環境配置active: devcloud:nacos:discovery:# 服務注冊地址server-addr: 127.0.0.1:8848config:# 配置中心地址server-addr: 127.0.0.1:8848# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

在nacos中添加名為 common-test-dev.yml 的配置,具體內容如下:

# spring配置
spring:servlet:multipart:maxFileSize: 30MBmaxRequestSize: 30MBdatasource:druid:stat-view-servlet:enabled: trueloginUsername: adminloginPassword: 123456dynamic:druid:initial-size: 5min-idle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,slf4jconnectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000connectTimeout: 1800000socketTimeout: 1800000datasource:# 主庫數據源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/hr-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: 123456druid: # 配置數據庫連接參數connectTimeout: 1800000socketTimeout: 1800000# mybatis配置
mybatis:# 搜索指定包別名typeAliasesPackage: com.common.test# 配置mapper的掃描,找到所有的mapper.xml映射文件mapperLocations: classpath:mapper/**/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# dubbo相關配置
dubbo:protocol:name: dubbo  # dubbo協議port: -1     # -1表示端口從20880開始遞增,不會造成端口沖突registry:address: nacos://127.0.0.1:8848consumer:check: false  # dubbo默認有啟動檢查retries: 0  # dubbo內置的重試機制

接著在服務啟動類中加上 @EnableDubbo 注解

在這里插入圖片描述

消費者的測試接口

在這里插入圖片描述

package com.common.test.service;/*** 測試接口** @author:gan* @date: 2024-02-04 16:45*/
public interface CommonService {/*** 測試dubbo調用* @return*/Object testDubbo();
}

接口實現類

在這里插入圖片描述

package com.common.test.service.impl;import com.common.test.service.CommonService;
import com.ruoyi.system.api.DubboFileService;
import com.ruoyi.system.api.domain.SysFileInfo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;import java.util.List;/*** 測試接口實現類** @author:gan* @date: 2024-02-04 16:47*/
@Service
public class CommonServiceImpl implements CommonService {@DubboReference(version = "1.0.0")private DubboFileService dubboFileService;@Overridepublic Object testDubbo() {SysFileInfo selectSysFileInfoParams = new SysFileInfo();selectSysFileInfoParams.setFileId("1752583940597551104");List<SysFileInfo> sysFileInfoList = dubboFileService.getSysFileInfoList(selectSysFileInfoParams);System.out.println(sysFileInfoList.get(0));return sysFileInfoList.get(0);}
}

測試前端控制器

在這里插入圖片描述

package com.common.test.controller;import com.common.test.service.CommonService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** 測試controller** @author:gan* @date: 2024-02-04 16:48*/
@RestController
@RequestMapping("/test")
public class CommonController {@Resourceprivate CommonService commonService;@GetMapping("/testDubbo")public AjaxResult test() {AjaxResult result = null;try {result = AjaxResult.success(commonService.testDubbo());} catch (Exception e) {e.printStackTrace();result = AjaxResult.error(e.getMessage());} finally {return result;}}
}

然后啟動測試服務

在這里插入圖片描述

再查看服務列表

在這里插入圖片描述

可以看到消費者也啟動成功了。

這里只是測試,就不需要用token了,在 ruoyi-gateway 的配置文件中加上如下配置:

在這里插入圖片描述

在這里插入圖片描述

重啟 ruoyi-gateway 服務,再進行接口測試

在這里插入圖片描述

三、修改若依的服務調用方式為dubbo

在開始之前,先給小伙伴們打個預防針,改造的過程會比較麻煩,這里以依賴沖突為最,若是對dubbo、若依不夠熟悉或者怕麻煩的就跳過這一塊。這里放個局部修改圖:

在這里插入圖片描述

看到這里如果沒有跳過,那就開始吧。

1、改造系統模塊

先引入依賴,父依賴和前面的父依賴一樣,這里是處理系統模塊的依賴,添加如下依賴:

<!-- Dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency><!--這個依賴是整合dubbo時要用到的-->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId>
</dependency>

然后排除掉 openfeign 的依賴,去掉若依自帶的日志模塊:

在這里插入圖片描述

如果沒有排掉,啟動服務時會報 openfeign 和 dubbo 的依賴沖突的錯。去掉日志模塊是因為日志中也使用了 openfeign 。

完整依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>com.ruoyi</groupId><artifactId>ruoyi-modules</artifactId><version>3.6.3</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ruoyi-modules-system</artifactId><description>ruoyi-modules-system系統模塊</description><dependencies><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Swagger UI --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.fox.version}</version></dependency><!-- Mysql Connector --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- RuoYi Common DataSource --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datasource</artifactId></dependency><!-- RuoYi Common DataScope --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-datascope</artifactId><exclusions><exclusion><groupId>io.github.openfeign</groupId><artifactId>feign-core</artifactId></exclusion><exclusion><groupId>io.github.openfeign</groupId><artifactId>feign-slf4j</artifactId></exclusion></exclusions></dependency><!--        &lt;!&ndash; RuoYi Common Log &ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>com.ruoyi</groupId>-->
<!--            <artifactId>ruoyi-common-log</artifactId>-->
<!--        </dependency>--><!-- RuoYi Common Swagger --><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-swagger</artifactId></dependency><!-- hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><!-- Dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!--這個依賴是整合dubbo時要用到的--><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

然后在啟動類中去掉 openfeign 的注解,再加上 dubbo 的注解

在這里插入圖片描述

然后在 nacos 中系統模塊的配置文件中加上 dubbo 的相關配置

在這里插入圖片描述

# dubbo相關配置
dubbo:protocol:name: dubbo  # dubbo協議port: -1  # -1表示端口從20880開始遞增,不會造成端口沖突registry:address: nacos://127.0.0.1:8848# check: false  # dubbo默認有啟動檢查scan:base-packages: com.ruoyi.system.service

去掉日志模塊再起編譯時系統模塊的前端控制器應該都會報錯,需要把報錯的地方注釋掉或者去掉,我這里以參數管理的前端控制器為例:

在這里插入圖片描述

完成了這些系統模塊應該能正常啟動了。

在這里插入圖片描述

2、改造認證授權中心

但還沒結束,啟動系統模塊后使用默認的 admin 登錄,我們會發現報錯 admin 不存在。

查找原因:

一開始以為是 admin 賬號誤刪了,看了一下數據庫發現賬號還在,看了一下控制臺,發現是認證授權中心的 SysLoginService
類中報錯了,原來是 SysLoginService 這個類使用了系統接口模塊的 RemoteUserService 中的
getUserInfo 方法,也就是使用了 openfeign ,用來調用系統模塊的根據用戶名查詢用戶接口,雖然認證授權中心中還存在 openfeign 依賴,但是系統模塊的已被排除了,自然就報錯了。

解決辦法:

注釋或者去掉認證授權中心 openfeign 相關的使用,以 dubbo 代之。

同樣,先處理依賴的問題,經過觀察,發現認證授權中心的 openfeign 相關的依賴在如下依賴中,做出排除

在這里插入圖片描述

然后加上 dubbo 相關的依賴:

<!-- Dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency><!--這個依賴是整合dubbo時要用到的-->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId>
</dependency>

完整依賴如下:

<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><groupId>com.ruoyi</groupId><artifactId>ruoyi</artifactId><version>3.6.3</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ruoyi-auth</artifactId><description>ruoyi-auth認證授權中心</description><dependencies><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- RuoYi Common Security--><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common-security</artifactId><exclusions><exclusion><groupId>io.github.openfeign</groupId><artifactId>feign-core</artifactId></exclusion><exclusion><groupId>io.github.openfeign</groupId><artifactId>feign-slf4j</artifactId></exclusion></exclusions></dependency><!-- Dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!--這個依賴是整合dubbo時要用到的--><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

然后在 nacos 中認證授權中心的配置文件中加上如下配置:

在這里插入圖片描述

# dubbo相關配置
dubbo:protocol:name: dubbo  # dubbo協議port: -1     # -1表示端口從20880開始遞增,不會造成端口沖突registry:address: nacos://127.0.0.1:8848consumer:check: false  # dubbo默認有啟動檢查retries: 0  # dubbo內置的重試機制

接著在啟動類中去掉 openfeign 的注解,再加上 dubbo 的注解

在這里插入圖片描述

然后用 dubbo 的方式寫一個接口,以用戶服務 RemoteUserService 為例,寫一個對應的 DubboUserService 用來替換用戶服務 RemoteUserService

在這里插入圖片描述

完整代碼如下:

package com.ruoyi.system.api;import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;/*** dubbo用戶服務** @author:gan* @date: 2024-02-28 10:36*/
public interface DubboUserService {/*** 通過用戶名查詢用戶信息* @param username  用戶名* @return*/public LoginUser getUserInfo(String username);/*** 注冊用戶信息** @param sysUser 用戶信息* @return 結果*/public Boolean registerUserInfo(SysUser sysUser);
}

其實現類就放在系統模塊的包下,完整代碼如下:

package com.ruoyi.system.service.impl;import com.ruoyi.common.core.utils.VerifyUtil;
import com.ruoyi.system.api.DubboUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysPermissionService;
import org.apache.dubbo.config.annotation.DubboService;import javax.annotation.Resource;/*** dubbo用戶服務 業務處理層** @author:gan* @date: 2024-02-28 10:41*/
@DubboService(version = "1.0.0")
public class DubboUserServiceImpl implements DubboUserService {@Resourceprivate SysUserMapper sysUserMapper;@Resourceprivate ISysPermissionService permissionService;@Resourceprivate ISysConfigService configService;@Overridepublic LoginUser getUserInfo(String username) {SysUser sysUser = sysUserMapper.selectUserByUserName(username);VerifyUtil.checkParam(sysUser, "用戶名或密碼錯誤!");LoginUser sysUserVo = new LoginUser();sysUserVo.setSysUser(sysUser);sysUserVo.setRoles(permissionService.getRolePermission(sysUser));  // 角色集合sysUserVo.setPermissions(permissionService.getMenuPermission(sysUser));  // 權限集合return sysUserVo;}@Overridepublic Boolean registerUserInfo(SysUser sysUser) {configService.selectConfigByKey("sys.account.registerUser");if (!Boolean.TRUE.equals(configService.selectConfigByKey("sys.account.registerUser"))) {throw new RuntimeException("當前系統沒有開啟注冊功能!");}String username = sysUser.getUserName();VerifyUtil.checkParam(sysUserMapper.checkUserNameUnique(username), "保存用戶'" + username + "'失敗,注冊賬號已存在!");return sysUserMapper.insertUser(sysUser) > 0;}
}

其中 VerifyUtil 是自己寫的判空工具類,可以用自己的方式判空。

接著在 SysLoginService 類中注釋掉用戶服務 RemoteUserService 相關的邏輯,再以dubbo用戶服務 DubboUserService 代之:

在這里插入圖片描述

日志服務 RemoteLogService 也是同理。改造完成,再成功啟動后就可以登錄了。

這里貼一下我的日志服務代碼

在這里插入圖片描述

完整代碼如下:

package com.ruoyi.system.api;import com.ruoyi.system.api.domain.SysLogininfor;
import com.ruoyi.system.api.domain.SysOperLog;/*** dubbo日志服務** @author:gan* @date: 2024-02-28 11:21*/
public interface DubboLogService {/*** 保存系統日志** @param sysOperLog 日志實體* @return 結果*/public Boolean saveLog(SysOperLog sysOperLog);/*** 保存訪問記錄** @param sysLogininfor 訪問實體* @return 結果*/public Boolean saveLogininfor(SysLogininfor sysLogininfor);
}

對應實現類也在系統模塊

package com.ruoyi.system.service.impl;import com.ruoyi.system.api.DubboLogService;
import com.ruoyi.system.api.domain.SysLogininfor;
import com.ruoyi.system.api.domain.SysOperLog;
import com.ruoyi.system.mapper.SysLogininforMapper;
import com.ruoyi.system.mapper.SysOperLogMapper;
import org.apache.dubbo.config.annotation.DubboService;import javax.annotation.Resource;/*** dubbo日志服務  服務層處理** @author:gan* @date: 2024-02-28 11:24*/
@DubboService(version = "1.0.0")
public class DubboLogServiceImpl implements DubboLogService {@Resourceprivate SysOperLogMapper operLogMapper;@Resourceprivate SysLogininforMapper logininforMapper;@Overridepublic Boolean saveLog(SysOperLog sysOperLog) {return operLogMapper.insertOperlog(sysOperLog) > 0;}@Overridepublic Boolean saveLogininfor(SysLogininfor sysLogininfor) {return logininforMapper.insertLogininfor(sysLogininfor) > 0;}
}

以dubbo日志服務替換掉 SysRecordLogService 類中的日志服務

在這里插入圖片描述

四、整合過程遇到的問題

1、出現循環引用

我想著文件模塊整合dubbo,引入依賴、加上注解之后報錯如下:

在這里插入圖片描述

***************************
APPLICATION FAILED TO START
***************************Description:The dependencies of some of the beans in the application context form a cycle:targeterBeanPostProcessor defined in class path resource [com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.class]com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository (field private com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository.dubboMetadataConfigServiceProxy)com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy
┌─────┐
|  com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration (field private com.alibaba.cloud.dubbo.metadata.resolver.MetadataResolver com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration.metadataResolver)
└─────┘Action:Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

雖然他已經提示要加上配置:

# Spring
spring:main:allow-circular-references: true  # 中斷循環引用

但是我nacos的配置中加上之后沒有效果

在這里插入圖片描述

重啟還是報那個錯。

應該在對應模塊的 bookstrap.yml 文件中加配置

在這里插入圖片描述
再次重啟

在這里插入圖片描述

看來配置生效了,再看看nacos中有沒有dubbo中的服務

在這里插入圖片描述

2、出現依賴沖突

我想要在系統模塊中使用 dubbo ,但引入 dubbo 相關依賴:

<!-- Dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

報錯如下:

在這里插入圖片描述

***************************
APPLICATION FAILED TO START
***************************Description:An attempt was made to call a method that does not exist. The attempt was made from the following location:com.alibaba.cloud.dubbo.metadata.RestMethodMetadata.<init>(RestMethodMetadata.java:80)The following method did not exist:feign.MethodMetadata.queryMapEncoded()ZThe calling method's class, com.alibaba.cloud.dubbo.metadata.RestMethodMetadata, was loaded from the following location:jar:file:/D:/environment/Maven/apache-maven-3.6.0/repository/com/alibaba/cloud/spring-cloud-starter-dubbo/2021.0.1.0/spring-cloud-starter-dubbo-2021.0.1.0.jar!/com/alibaba/cloud/dubbo/metadata/RestMethodMetadata.classThe called method's class, feign.MethodMetadata, is available from the following locations:jar:file:/D:/environment/Maven/apache-maven-3.6.0/repository/io/github/openfeign/feign-core/11.10/feign-core-11.10.jar!/feign/MethodMetadata.classThe called method's class hierarchy was loaded from the following locations:feign.MethodMetadata: file:/D:/environment/Maven/apache-maven-3.6.0/repository/io/github/openfeign/feign-core/11.10/feign-core-11.10.jarAction:Correct the classpath of your application so that it contains compatible versions of the classes com.alibaba.cloud.dubbo.metadata.RestMethodMetadata and feign.MethodMetadata

原來系統模塊使用了 openfeign 進行服務調用,引入 dubbo 相關的依賴后就依賴沖突了,可以排除系統模塊中的 openfeign 依賴或者移除 dubbo 依賴,我這里選擇了前者

在這里插入圖片描述

3、啟動出現端口號被占用

生產者已經啟動,消費者啟動時報錯:

在這里插入圖片描述

java.lang.IllegalStateException: Failed to execute CommandLineRunnerat org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771)at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752)at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)at com.common.test.CommonTestApplication.main(CommonTestApplication.java:19)
Caused by: org.apache.dubbo.rpc.RpcException: Fail to start server(url: dubbo://192.168.1.12:20880/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=common-test&bind.ip=192.168.1.12&bind.port=20880&channel.readonly.sent=true&codec=dubbo&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=common-test&heartbeat=60000&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&metadata-type=remote&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs&pid=27496&qos.enable=false&release=2.7.15&revision=2021.0.1.0&service.name=ServiceBean:common-test/com.alibaba.cloud.dubbo.service.DubboMetadataService:1.0.0&side=provider&timestamp=1708501506423&version=1.0.0) Failed to bind NettyServer on /192.168.1.12:20880, cause: Address already in use: bindat org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.createServer(DubboProtocol.java:350)at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.openServer(DubboProtocol.java:322)at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.export(DubboProtocol.java:305)at org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:64)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:75)at org.apache.dubbo.qos.protocol.QosProtocolWrapper.export(QosProtocolWrapper.java:66)at org.apache.dubbo.rpc.Protocol$Adaptive.export(Protocol$Adaptive.java)at org.apache.dubbo.registry.integration.RegistryProtocol.lambda$doLocalExport$2(RegistryProtocol.java:262)at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)at org.apache.dubbo.registry.integration.RegistryProtocol.doLocalExport(RegistryProtocol.java:260)at org.apache.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:212)at org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:62)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:73)at org.apache.dubbo.qos.protocol.QosProtocolWrapper.export(QosProtocolWrapper.java:64)at org.apache.dubbo.rpc.Protocol$Adaptive.export(Protocol$Adaptive.java)at org.apache.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:518)at org.apache.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:339)at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:314)at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:238)at com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter.export(DubboMetadataServiceExporter.java:82)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository.getDubboMetadataServiceMetadata(DubboServiceMetadataRepository.java:288)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository$$FastClassBySpringCGLIB$$1.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository$$EnhancerBySpringCGLIB$$1.getDubboMetadataServiceMetadata(<generated>)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.attachDubboMetadataServiceMetadata(DubboServiceRegistrationAutoConfiguration.java:172)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.attachDubboMetadataServiceMetadata(DubboServiceRegistrationAutoConfiguration.java:166)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.lambda$null$0(DubboServiceRegistrationAutoConfiguration.java:131)at java.lang.Iterable.forEach(Iterable.java:75)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.lambda$onDubboBootstrapStarted$1(DubboServiceRegistrationAutoConfiguration.java:130)at java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1597)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.onDubboBootstrapStarted(DubboServiceRegistrationAutoConfiguration.java:129)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344)at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229)at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:166)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)at com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapStartCommandLineRunner.run(DubboBootstrapStartCommandLineRunner.java:46)at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768)... 5 common frames omitted
Caused by: org.apache.dubbo.remoting.RemotingException: Failed to bind NettyServer on /192.168.1.12:20880, cause: Address already in use: bindat org.apache.dubbo.remoting.transport.AbstractServer.<init>(AbstractServer.java:73)at org.apache.dubbo.remoting.transport.netty4.NettyServer.<init>(NettyServer.java:79)at org.apache.dubbo.remoting.transport.netty4.NettyTransporter.bind(NettyTransporter.java:35)at org.apache.dubbo.remoting.Transporter$Adaptive.bind(Transporter$Adaptive.java)at org.apache.dubbo.remoting.Transporters.bind(Transporters.java:56)at org.apache.dubbo.remoting.exchange.support.header.HeaderExchanger.bind(HeaderExchanger.java:44)at org.apache.dubbo.remoting.exchange.Exchangers.bind(Exchangers.java:70)at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.createServer(DubboProtocol.java:348)... 56 common frames omitted
Caused by: java.net.BindException: Address already in use: bindat sun.nio.ch.Net.bind0(Native Method)at sun.nio.ch.Net.bind(Net.java:433)at sun.nio.ch.Net.bind(Net.java:425)at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600)at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174)at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java)at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167)at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.lang.Thread.run(Thread.java:748)

原因:

這是因為生產者啟動時,20880這個端口被占用,消費者嘗試使用20880端口啟動就報錯了

報錯日志中也提到了

在這里插入圖片描述

可以在配置文件中加入指定端口號或者使用端口號遞增,這里選擇后者。

在這里插入圖片描述

# dubbo相關配置
dubbo:protocol:name: dubbo  # dubbo協議port: -1     # -1表示端口從20880開始遞增,不會造成端口沖突registry:address: nacos://127.0.0.1:8848consumer:check: false  # dubbo默認有啟動檢查retries: 0  # dubbo內置的重試機制

4、出現某個類找不到

就是模塊啟動時報錯:Caused by: java.lang.ClassNotFoundException

在這里插入圖片描述

java.lang.IllegalStateException: Failed to execute CommandLineRunnerat org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771)at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752)at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)at com.common.test.CommonTestApplication.main(CommonTestApplication.java:19)
Caused by: java.lang.reflect.UndeclaredThrowableException: Failed to invoke event listener method
HandlerMethod details: 
Bean [com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration]
Method [public void com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.onDubboBootstrapStarted(com.alibaba.cloud.dubbo.bootstrap.event.DubboBootstrapStartedEvent)]
Resolved arguments: 
[0] [type=com.alibaba.cloud.dubbo.bootstrap.event.DubboBootstrapStartedEvent] [value=com.alibaba.cloud.dubbo.bootstrap.event.DubboBootstrapStartedEvent[source=com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapWrapper@30afac00]]at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:361)at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229)at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:166)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)at com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapStartCommandLineRunner.run(DubboBootstrapStartCommandLineRunner.java:46)at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768)... 5 common frames omitted
Caused by: java.lang.NoClassDefFoundError: com/google/common/collect/Mapsat org.apache.dubbo.registry.nacos.util.NacosInstanceManageUtil.<clinit>(NacosInstanceManageUtil.java:39)at org.apache.dubbo.registry.nacos.NacosRegistry.doSubscribe(NacosRegistry.java:187)at org.apache.dubbo.registry.support.FailbackRegistry.subscribe(FailbackRegistry.java:299)at org.apache.dubbo.registry.ListenerRegistryWrapper.subscribe(ListenerRegistryWrapper.java:105)at org.apache.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:232)at org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:62)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:73)at org.apache.dubbo.qos.protocol.QosProtocolWrapper.export(QosProtocolWrapper.java:64)at org.apache.dubbo.rpc.Protocol$Adaptive.export(Protocol$Adaptive.java)at org.apache.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:518)at org.apache.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:339)at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:314)at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:238)at com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter.export(DubboMetadataServiceExporter.java:82)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository.getDubboMetadataServiceMetadata(DubboServiceMetadataRepository.java:288)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository$$FastClassBySpringCGLIB$$1.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)at com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository$$EnhancerBySpringCGLIB$$1.getDubboMetadataServiceMetadata(<generated>)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.attachDubboMetadataServiceMetadata(DubboServiceRegistrationAutoConfiguration.java:172)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.attachDubboMetadataServiceMetadata(DubboServiceRegistrationAutoConfiguration.java:166)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.lambda$null$0(DubboServiceRegistrationAutoConfiguration.java:131)at java.lang.Iterable.forEach(Iterable.java:75)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.lambda$onDubboBootstrapStarted$1(DubboServiceRegistrationAutoConfiguration.java:130)at java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1597)at com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.onDubboBootstrapStarted(DubboServiceRegistrationAutoConfiguration.java:129)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344)... 14 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Mapsat java.net.URLClassLoader.findClass(URLClassLoader.java:382)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 51 common frames omitted

一開始想著是不是dubbo的版本的問題,但生產者都已經啟動成功了,而且用的還是同一個依賴,就想著加一下這個類的依賴看看能不能解決,依賴如下:

在這里插入圖片描述

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.0.0-jre</version>
</dependency>

果然啟動成功了。

但也納悶,為什么同樣的dubbo依賴,生產者那邊就可以,到了消費者這邊就不行了?

既然dubbo依賴是相同的,那肯定就是其他依賴的問題,于是對比了其他依賴,最終發現minio的依賴下包含 com.google.guava 依賴

在這里插入圖片描述

那就注釋掉 com.google.guava 依賴,加入 minio 依賴試試,結果發現也能啟動成功…

太難了,就這個問題折騰了好久(大哭)

5、找不到生產者

生產者和消費者都啟動了,但是消費者調用生產者服務時報如下錯:

在這里插入圖片描述

org.apache.dubbo.rpc.RpcException: No provider available from registry 127.0.0.1:8848 for service com.ruoyi.system.api.DubboFileService:1.0.0 on consumer 192.168.1.12 use dubbo version 2.7.15, please check status of providers(disabled, not registered or in blacklist).at org.apache.dubbo.registry.integration.DynamicDirectory.doList(DynamicDirectory.java:168)at org.apache.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:99)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:297)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:262)at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47)at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92)at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:98)at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:170)at org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareClusterInvoker.doInvoke(ZoneAwareClusterInvoker.java:112)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265)at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47)at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92)at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:96)at org.apache.dubbo.common.bytecode.proxy0.getSysFileInfoList(proxy0.java)at com.common.test.service.impl.CommonServiceImpl.testDubbo(CommonServiceImpl.java:27)at com.common.test.controller.CommonController.test(CommonController.java:28)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:90)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

分析原因:

我的生產者是若依的文件服務,若依的文件服務原來是用 Feign 進行遠程調用的,我只是想把 Feign 改為 dubbo ,就定義了一個和原文件接口相同抽象方法的接口,其實就是接口名不一樣,再用文件實現類去實現,這樣我就不用重新寫方法了,具體如下:

在這里插入圖片描述

因為啟動沒報錯,nacos中也有看到對應的服務,就沒有多想,就是會一直報這個錯,后面就想著單獨見一個類加上 @DubboService(version = “1.0.0”) 試試

在這里插入圖片描述

結果就調用成功了…

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

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

相關文章

UVa11726 Crime Scene

題目鏈接 UVa11726 - Crime Scene 題意 給定n&#xff08;n≤100&#xff09;個物體&#xff0c;每個物體都是一個圓或者k&#xff08;k≤10&#xff09;邊形&#xff0c;用長度盡量小的繩子把它們包圍起來。 分析 孟加拉國Manzurur Rahman Khan (Sidky)大神出的難題&#xff…

MySQL 核心模塊揭秘 | 07 期 | 二階段提交 (1) prepare 階段

二階段提交的 prepare 階段&#xff0c;binlog 和 InnoDB 各自會有哪些動作&#xff1f; 本文基于 MySQL 8.0.32 源碼&#xff0c;存儲引擎為 InnoDB。 1. 二階段提交 二階段提交&#xff0c;顧名思義&#xff0c;包含兩個階段&#xff0c;它們是&#xff1a; prepare 階段。…

springboot-基礎-eclipse配置+helloword示例

備份筆記。所有代碼都是2019年測試通過的&#xff0c;如有問題請自行搜索解決&#xff01; 下一篇&#xff1a;springboot-基礎-添加model和controller的簡單例子常用注解含義 目錄 配置helloword示例新建項目創建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是…

BUUCTF AWD-Test1

打開靶場是這個有些簡陋的界面。 隨便點點&#xff0c;找到這個東西。 看到ThinkPHP&#xff0c;思路瞬間清晰&#xff0c;老熟人了。這個就是ThinkPHP漏洞。根據版本我們去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

SHELL 腳本: 導出NEO4j DUMP并上傳SFTP

前提 開通sftp賬號 安裝expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安裝目錄 DUMP_PATH/data/dump # DUMP本地保存目錄 DUMP_FILEneo4j_$(date %F).dump #導出文件名稱 UPLOAD_DIR/path/to/stfp/dump/ #上傳目錄 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…

Vue-5

Vue 3 的優勢 更容易維護&#xff08;組合式API&#xff09;更快的速度更小的體積更優的數據響應 創建 Vue 3 項目 前提環境條件&#xff1a;已安裝 16.0 或更高版本的 Node.js node -v創建一個 Vue 應用&#xff08;下面的指令將會安裝并執行 create-vue &#xff09; np…

服務端向客戶端推送數據的實現方案

在日常的開發中&#xff0c;我們經常能碰見服務端需要主動推送給客戶端數據的業務場景&#xff0c;比如數據大屏的實時數據&#xff0c;比如消息中心的未讀消息&#xff0c;比如聊天功能等等。 本文主要介紹SSE的使用場景和如何使用SSE。 服務端向客戶端推送數據的實現方案有哪…

MySQL 自增列解析(Auto_increment)

MySQL數據庫為列提供了一種自增屬性&#xff0c;當列被定義為自增時。Insert語句對該列即使不提供值&#xff0c;MySQL也會自動為該列生成遞增的唯一標識&#xff0c;因此這個特性廣泛用于主鍵的自動生成。 一、自增列的用法 自增列具有自動生成序列值&#xff0c;整型&#…

職責鏈模式(Chain of Responsibility Pattern)

定義 職責鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為設計模式&#xff0c;它允許對象接收請求并將其沿著處理者鏈傳遞&#xff0c;直到有一個處理者處理它為止。職責鏈模式通過將請求的處理邏輯分布 在職責鏈模式中&#xff0c;通常包含以下幾…

MYSQL04高級_邏輯架構剖析、查詢緩存、解析器、優化器、執行器、存儲引擎

文章目錄 ①. 邏輯架構剖析②. 服務層 - 查詢緩存③. 服務層 - 解析器④. 服務層 - 優化器⑤. 服務層 - 執行器⑥. MySQL8執行原理 ①. 邏輯架構剖析 ①. 服務器處理客戶端請求 ②. 連接層 系統(客戶端)訪問MySQL服務器前,做的第一件事就是建立TCP連接經過三次握手建立連接成…

Linux使用C語言實現通過互斥鎖限制對共享資源的訪問

互斥鎖限制共享資源的訪問 主線程中有兩個線程&#xff0c;分別輸出信息。 #include <stdio.h> #include <pthread.h> #include <unistd.h>int g_data0;void* fun1(void *arg) {printf("t1&#xff1a;%ld thread is create\n", (unsigned long)…

大宋咨詢數據研究在汽車新品上市中的核心作用

隨著汽車行業的快速變革&#xff0c;數據研究已經成為新品上市流程中的不可或缺的一環。從市場定位、產品規劃到營銷策略&#xff0c;數據研究不僅為汽車企業提供了獨特的洞察&#xff0c;還為其提供了決策依據&#xff0c;確保新品在競爭激烈的市場中取得優勢。在這一領域&…

Kubernetes IoTDB系列 | IoTDB搭建 | v1.3.0

目錄 一、IoTDB 介紹二、k8s 部署 IoTDB一、IoTDB 介紹 IoTDB 是一種面向物聯網(IoT)場景的開源時序數據庫。它專門設計用于高效地存儲和查詢大規模物聯網設備產生的時序數據。IoTDB 提供了高吞吐量、低延遲、靈活的數據模型以及多種數據查詢和存儲引擎等特性,使其成為處理…

稀疏圖帶負邊的全源最短路Johnson算法

BellmanFord算法 Johnson算法解決的問題 帶負權的稀疏圖的全源最短路 算法流程 重新設置的每條邊的權重都大于或等于0&#xff0c;跑完Djikstra后得到的全源最短路&#xff0c;記得要還原&#xff0c;即&#xff1a;f(u,v) d(u,v) - h[u] h[v] 例題

45、WEB攻防——通用漏洞PHP反序列化POP鏈構造魔術方法原生類

文章目錄 序列化&#xff1a;將java、php等代碼中的對象轉化為數組或字符串等格式。代表函數serialize()&#xff0c;將一個對象轉換成一個字符&#xff1b;反序列化&#xff1a;將數組或字符串等格式還成對象。代表函數unserialize()&#xff0c;將字符串還原成一個對象。 P…

MWC 2024丨Smart Health搭載高通Aware平臺—美格發布智能健康看護解決方案,開啟健康管理新體驗

2月29日&#xff0c;在MWC 2024世界移動通信大會上&#xff0c;全球領先的無線通信模組及解決方案提供商——美格智能正式發布了新一代Cat.1模組SLM336Q&#xff0c;是中低速物聯網應用場景的高性價比之選。本次還發布了首款搭載高通Aware?平臺的智能看護解決方案MC303&#x…

[萬字長文] 從 Vue 3 的項目模板學習 tsconfig 配置

文章目錄 一、tsconfig.json 的作用二、基本介紹三、Vue 3 的 tsconfig.json 的結構分析1. 總配置 tsconfig.json2. Web 側 tsconfig.app.jsona. 繼承基礎配置b. 包含和排除的文件c. 編譯器選項 3. 測試 tsconfig.vitest.jsona. 繼承的基礎配置b. 包含和排除的文件c. 編譯器選項…

OD(13)之Mermaid餅圖和象限圖

OD(13)之Mermaid餅圖和象限圖使用詳解 Author: Once Day Date: 2024年2月29日 漫漫長路才剛剛開始… 全系列文章可參考專欄: Mermaid使用指南_Once_day的博客-CSDN博客 參考文章: 關于 Mermaid | Mermaid 中文網 (nodejs.cn)Mermaid | Diagramming and charting tool???…

FPGA-學會使用vivado中的存儲器資源RAM(IP核)

問題 信號源(例如ADC)以1us一個的速率產生12位的數據現要求獲得連續1ms內的數據,通過串口以115200的波特率發到電腦。 分析 數據量是1000個 數據速率不匹配 數據內容未知 數據總數據量有限 數據的使用速度低于數據的產生速度 數據生產和消耗的位寬 數據量相對較…

ywtool check命令及ywtool clean命令

一.ywtool check命令 1.1 ywtool check -I 1.2 ywtool check all 1.3 ywtool check io 1.4 ywtool check elk 1.5 ywtool check php 1.6 ywtool check mysql 1.7 ywtool check nginx 1.8 ywtool check system 1.9 ywtool check docker_nbip [容器名稱] 1.10 ywtool check 1.10…