一、创建项目
构建一个Empty Project(构建任何maven项目都可以,没有过多的限制,这里是为了更加方便易懂),将名字设置为springboot-dubbo。
进入项目后,将springboot-dubbo模块删除,方便后面的观看。最终项目为如图所示:
二、创建provider-servier项目
创建一个新的Module,Module创建为springboot项目,名字为provider-servier,包名随意。
勾选Spring Web 相关依赖。
注:有时会出现如下项目没有被识别的错误,只需右键pom.xml文件,点击Add as Maven Project,项目即可恢复正常。
导入Dubbo与zookeeper的相关依赖。
zkclient、curator都为zookeeper的客户端框架,能够使我们的开发更加便捷。
<!--导入依赖: Dubbo + zookeeper-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!--zkclient-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
注意:在引入zookeeper相关依赖时,应先排除slf4j-log4j12日志,否则会出现日志冲突,导致项目无法正常启动。目前slf4j-log4j12日志已经被slf4j-reload4j替代,所以排除slf4j-reload4j即可。
引入的zookeeper依赖必须与自己下载的zookeeper版本一致,否则会启动失败。
<!--日志会冲突~-->
<!--引入zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.9.1</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
</exclusions>
</dependency>
创建TicketService接口,并创建getTicket方法。
package com.kuang.service;
public interface TicketService {
public String getTicket();
}
创建实体类TicketServiceImpl,并实现TicketService接口。
package com.learn.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service
@Component
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "《流浪地球》";
}
}
注意:在此处应使用@Component注解来实现springboot的自动装配,因为使用@Service容易与Dubbo中的@Service注解混淆。
使用Dubbo包下的@Service后,此实体类便可以被扫描到,在项目一启动就自动注册到注册中心
配置application.properties。
使用8001接口,目的是为了能够明显区分开两个项目。
server.port=8001
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.kuang.service
三、创建consumer-server项目
构建一个Springboot项目,名为consumer-server,具体步骤与provider-servier项目一致。
此处注意:包名应与provider-server项目中的包名一致,方便后续的测试。
将provider-server项目中的依赖全部导入到此项目中。
创建service包,并创建UserService实体类
package com.kuang.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service //放到容器中~
public class UserService {
@Reference //引用, Pom坐标,可以定义相同的接口名
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到=>"+ticket);
}
}
使用springboot中的@Service注解来实现注入。
想拿到provider-server提供的票,要去注册中心拿到服务
@Reference接口的意思 为可以远程引用其他项目的业务,可以通过Pom坐标来引用,也可以通过定义相同的接口名,前提是两个项目的包名应一致,这里可以把provider-servier项目中的接口直接复制来。
通过buyTicket方法来得到票并输出结果。
配置application.properties
server.port=8002
# 消费者去哪里拿服务需要暴露自己的名字
dubbo.application.name=consumer-server
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
在test中编写测试。
package com.learn;
import com.learn.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 userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
四、启动项目
先启动zookeeper与dubbo-admin,dubbo-admin不启动也不会有影响,这里是为了方便查看。
启动provider-server项目
在dubbo-admin中可以查看到此项目。
可以点击查看详情。
接下来运行consumer-server中编写的测试类。
注意,不要把provider-server项目关掉。
可以看到,在我们没有编写接口实现类的前提下,拿到了其他项目所编写的业务,说明通过远程调用已经成功!