Dubbo+zookeeper+spring boot入门实例
1、建一个工程
2、新建两个模块
1、提供者模块
再包下新建一个service包
2、消费者模块
与提供者模块步骤一样
3、导入依赖
两个模块都导入以下依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
4、编写模块配置文件
1、提供者模块配置文件
server:
port: 8081
dubbo:
application:
#服务应用名字
name: provider
registry:
#注册中心地址
address: zookeeper://127.0.0.1:2181
scan:
#哪些服务要被注册
base-packages: com.xys.service
2、消费者模块配置文件
server:
port: 8082
dubbo:
application:
#消费者去哪里拿服务,需要暴自己的名字
name: consumer
registry:
#注册中心地址
address: zookeeper://127.0.0.1:2181
5、编写service
1、提供者模块
package com.xys.service;
public interface TicketService {
public String getTicket();
}
package com.xys.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//zookeeper:服务注册与发现
@Service
@Component
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "购买票";
}
}
2、消费者模块
package com.xys.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class UserService {
//想要拿到provider提供的票,要去注册中心去拿服务
@Reference //引用,pom坐标,可以定义路径相同的接口名
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到===》"+ticket);
}
}
3、编写消费者模块测试类
package com.xys;
import com.xys.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ConsumerApplicationTests {
@Autowired
UserService service;
@Test
void contextLoads() {
service.buyTicket();
}
}
4、错误解决方案
1、消费者模块引入提供者模块接口,可以在pom.xml引入
<dependency>
<groupId>com.xys</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
2、消费者模块测试时,把主程序的@SpringBootApplication注释掉,否则会报错如下
java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic bean: class [com.xys.ConsumerApplication]; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\Idea\SpringBootProjects\Dubbo_test\consumer\target\classes\com\xys\ConsumerApplication.class], Generic bean: class [com.xys.ProviderApplication]; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\Idea\SpringBootProjects\Dubbo_test\provider\target\classes\com\xys\ProviderApplication.class]]
6、启动项目
1、先启动提供者模块
2、再启动消费者测试类
注意:如果不按顺序消费者加载不到提供者的接口
7、启动zookeeper
8、加载Dubbo包
9、访问Dubbo查看