解决记录之十二——分布式Dubbo与Zookeeper以及SLF4J: Class path contains multiple SLF4J bindings等错误

本文介绍了在使用Apache Dubbo和Zookeeper构建分布式服务时,如何解决Spring Boot应用中SLF4J的多个绑定冲突问题。通过删除冲突的jar包、初始化log4j配置,成功配置了服务提供者(Provider)、服务消费者(Consumer)。并提供了参考文档链接和源码地址。

Dubbo结构路线图
Dubbo体系结构

阿里和apache的github下都提供了dubbo-spring-boot-starter。

  • 从使用的情况来看,阿里的已经归档,已经一年多没有维护,apache的一直在维护,相对更新一些。
  • 分别按照两家的文档配置,阿里的没有配置成功,apache的也是解决了日志问题配置成功。

整合步骤

一般来说一个使用dubbo的微服务,至少会包含三个部分:服务提供者provider,服务消费者consumer以及双方共用的API(包括接口、POJO),放到web项目中就是service、web(controller)、service-api
在此基础上,我们需要一个第三方管理provider、consumer之间的交互,主流的第三方是zookeeper。

Provider

<!-- pom.xml -->
<properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.1.4.RELEASE</spring-boot.version>
        <dubbo.version>2.7.1</dubbo.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Apache Dubbo  -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>
//resource/application.properties
spring.application.name=ticket-provider

dubbo.scan.base-packages=com.jn.service

dubbo.registry.address=zookeeper://127.0.0.1:2181
//resource/log4j.properties
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
//service/TicketServiceImpl
import org.apache.dubbo.config.annotation.Service;
import sun.misc.Version;

@Service
public class TicketServiceImpl  implements TicketService  {

    @Override
    public String getTicket() {
        return "水电费附件";
    }
}
public interface TicketService {

    public String getTicket();
}

Consumer

pom.xml和log4j.properties与Provider配置相同

//resource/application.properties

spring.application.name=ticket-consumer

dubbo.registry.address=zookeeper://127.0.0.1:2181

需要将TickerService接口类拷贝到service同目录下

//service/UserService.java
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;


@Service
public class UserService {

    @Reference
    private TicketService ticketService;

    public void userGetTicket() {
        System.out.println("恭喜成功地购买了"+ticketService.getTicket());
    }

}
//测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class TicketConsumerApplicationTests {

    @Autowired
    UserService userService;

    @Test
    public void contextLoads() {

        userService.userGetTicket();
    }

}

遇到的错误

SLF4J: Class path contains multiple SLF4J bindings.

截图如下:

日志错误

意思是说logback-classic-1.2.3.jar和slf4j-log4j12-1.7.25.jar包冲突了,所以要删掉一个。点击file-》project structure-》libraries,找到slf4j-log4j12-1.7.25.jar包,删掉,

删除日志库JAR文件

再次启动还有一个警告:

log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

截图如下:

缺少日志配置

意思是说要初始化一个log4j的系统配置,所以要在customer和provider项目的resource下添加一个log4j.properties配置文件,内容如下:

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

再次启动就没有刚刚的警告了。

参考文档:https://github.com/apache/incubator-dubbo-spring-boot-project
解决错误参考文档:https://www.bbsmax.com/A/1O5Ev6ZGd7/
源码:https://github.com/Lswx2017/dubbodemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值