Dubbo 3.0.6 + Nacos 2.0.4 配置
1. 引入配置文件
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<!-- 外部依赖版本 -->
<spring-cloud.version>2021.0.1</spring-cloud.version>
<spring-boot.version>2.6.4</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
<dubbo.version>3.0.6</dubbo.version>
<nacos-client.version>2.0.4</nacos-client.version>
<commons-io.version>2.11.0</commons-io.version>
<commons-collections4.version>4.4</commons-collections4.version>
<lombok.version>1.18.22</lombok.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
<druid.version>1.2.8</druid.version>
<mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- SpringBoot 依赖配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos-client.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2. 生产者
2.1 添加配置
server:
port: 9090
spring:
application:
name: aiops-menu
dubbo:
registry:
address: nacos://127.0.0.1:8848
logging:
level:
root: info
2.2 生产者接口与实现类
public interface MenuApi {
public BaseResponse<List<MenuResp>> queryList(MenuReq menuReq);
}
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
@Slf4j
@DubboService
public class MenuService implements MenuApi {
@Override
public BaseResponse<List<MenuResp>> queryList(MenuReq menuReq) {
List<MenuResp> menuList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
menuList.add(new MenuResp(i, menuReq.getName() + "name"+i));
}
log.info("查询菜单:{}", menuList);
return BaseResponse.success(menuList);
}
}
2.3 修改启动类
@EnableDubbo
@SpringBootApplication
public class MenuApplication {
public static void main(String[] args) {
SpringApplication.run(MenuApplication.class, args);
}
}
注意:如果不添加@EnableDubbo注解,那么dubbo不会自动注册接口!!!
3. 消费者
3.1 配置文件
server:
port: 9091
spring:
application:
name: gfkj-aiops-role
dubbo:
registry:
address: nacos://127.0.0.1:8848
protocol:
# 默认端口是 20882,本地启动多个会冲突
port: 20881
3.2 消费代码
@Slf4j
@DubboService
public class RoleService implements RoleApi {
@Resource
private MenuApi menuApi;
@Override
public BaseResponse<RoleResp> queryRole(RoleReq roleReq) {
log.info("查询角色:{}", roleReq);
RoleResp roleResp = new RoleResp(1, "role");
BaseResponse<List<MenuResp>> menuResponse = menuApi.queryList(new MenuReq("menu"));
log.info("查询菜单:{}", menuResponse);
return BaseResponse.success(roleResp);
}
}
/*
--------dubbo注入类--------
*/
@Configuration
public class DubboConfiguration {
@Bean
@DubboReference(interfaceClass = MenuApi.class)
public ReferenceBean<MenuApi> helloService() {
return new ReferenceBean<>();
}
}
启动类:
@EnableDubbo
@SpringBootApplication
public class RoleApplication {
public static void main(String[] args) {
SpringApplication.run(RoleApplication.class, args);
}
}
消费者配置:
<!-- 继承至上面 公共pom文件 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
</dependencies>
问题:
1. 启动日志报错
log4j:WARN No appenders could be found for logger (org.apache.dubbo.common.Version).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解决方法:
<!-- dubbo-registry-nacos 排除 -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
2. 重复类
2022-03-18 01:23:36.497 ERROR 39094 --- [ main] org.apache.dubbo.common.Version : [DUBBO] Duplicate class org/apache/dubbo/remoting/exchange/Exchangers.class in 2 jar [file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo-remoting-api/3.0.6/dubbo-remoting-api-3.0.6.jar!/org/apache/dubbo/remoting/exchange/Exchangers.class, file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo/3.0.6/dubbo-3.0.6.jar!/org/apache/dubbo/remoting/exchange/Exchangers.class], dubbo version: 3.0.6, current host: 192.168.3.57
2022-03-18 01:23:36.502 ERROR 39094 --- [ main] org.apache.dubbo.common.Version : [DUBBO] Duplicate class org/apache/dubbo/remoting/Transporters.class in 2 jar [file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo-remoting-api/3.0.6/dubbo-remoting-api-3.0.6.jar!/org/apache/dubbo/remoting/Transporters.class, file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo/3.0.6/dubbo-3.0.6.jar!/org/apache/dubbo/remoting/Transporters.class], dubbo version: 3.0.6, current host: 192.168.3.57
2022-03-18 01:23:36.503 ERROR 39094 --- [ main] org.apache.dubbo.common.Version : [DUBBO] Duplicate class org/apache/dubbo/remoting/RemotingException.class in 2 jar [file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo/3.0.6/dubbo-3.0.6.jar!/org/apache/dubbo/remoting/RemotingException.class, file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo-remoting-api/3.0.6/dubbo-remoting-api-3.0.6.jar!/org/apache/dubbo/remoting/RemotingException.class], dubbo version: 3.0.6, current host: 192.168.3.57
解决方法:
<!-- dubbo-registry-nacos 排除 -->
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-api</artifactId>
</exclusion>
3. 启动报错
java.lang.NoSuchMethodError: com.alibaba.nacos.api.config.ConfigService.publishConfigCas(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
***************************
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:
org.apache.dubbo.metadata.store.nacos.NacosConfigServiceWrapper.publishConfigCas(NacosConfigServiceWrapper.java:65)
The following method did not exist:
com.alibaba.nacos.api.config.ConfigService.publishConfigCas(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
The calling method's class, org.apache.dubbo.metadata.store.nacos.NacosConfigServiceWrapper, was loaded from the following location:
jar:file:/Users/liujunguang1/.m2/repository/org/apache/dubbo/dubbo/3.0.6/dubbo-3.0.6.jar!/org/apache/dubbo/metadata/store/nacos/NacosConfigServiceWrapper.class
The called method's class, com.alibaba.nacos.api.config.ConfigService, is available from the following locations:
jar:file:/Users/liujunguang1/.m2/repository/com/alibaba/nacos/nacos-api/1.4.2/nacos-api-1.4.2.jar!/com/alibaba/nacos/api/config/ConfigService.class
The called method's class hierarchy was loaded from the following locations:
com.alibaba.nacos.api.config.ConfigService: file:/Users/liujunguang1/.m2/repository/com/alibaba/nacos/nacos-api/1.4.2/nacos-api-1.4.2.jar
Action:
Correct the classpath of your application so that it contains compatible versions of the classes org.apache.dubbo.metadata.store.nacos.NacosConfigServiceWrapper and com.alibaba.nacos.api.config.ConfigService
解决方法:
升级nacos-client版本
<nacos-client.version>2.0.4</nacos-client.version>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos-client.version}</version>
</dependency>