

阿里和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包,删掉,
再次启动还有一个警告:
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
本文介绍了在使用Apache Dubbo和Zookeeper构建分布式服务时,如何解决Spring Boot应用中SLF4J的多个绑定冲突问题。通过删除冲突的jar包、初始化log4j配置,成功配置了服务提供者(Provider)、服务消费者(Consumer)。并提供了参考文档链接和源码地址。




被折叠的 条评论
为什么被折叠?



