承接上文,介绍了Dubbo与Zookeeper之后,这一篇博客就来记录一下怎么在SpringBoot项目中整合它们。
首先因为Dubbo的架构设计,有服务提供者(provider) 和 服务消费者(consumer),那我们可以创建一个空项目,并往里面加入两个子模块,一个叫provider_ticket
,另外一个是consumer_user
。由前者提供服务,并注册到Zookeeper中,后者订阅Zookeeper,收到通知后远程调用前者完成业务。大致业务逻辑就是这样。
现在开始行动吧,项目创建好之后:
Dubbo内部还是有挺多组件的,如果在以往的SSM项目中,我们会在配置文件中,配置很多<bean>
组件,但好在SpringBoot的优势,它会为我们自动导入各种组件,我们只需要在两个模块中都引入Dubbo的starter
即可:
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
当然这还不够,因为还需要注册中心Zookeeper,这里引入它的客户端zkclient
即可:
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
接下来就可以编写代码了,我们先来编写服务提供者的代码.
provider_ticket:
编写一个TicketService
接口,其中有一个getTicket()
方法,并编写一个类去实现它:
TicketServiceImpl
中实现该方法:
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《霸王别姬》";
}
}
接下来,需要把该服务注册到Zookeeper中去,在TicketServiceImpl
类上添加两个注解:
@Service
@Component
特别注意,@Service
是alibaba那个包的注解,不要导成Spring的了,@Component
就不用说了,添加类到容器中。
之后注册服务,还差最后一步,我们还需要在全局配置文件中 (application.yaml) 配置一些属性,服务提供者的名称,注册中心的ip地址和服务所在包下:
dubbo:
application:
name: provider_ticket
registry:
address: zookeeper://localhost:2181 //注意是zookeeper协议,后面加上你安装zookeeper的主机ip地址,端口号为2181
scan:
base-packages: com.leslie.provider_ticket.service.impl
注册服务到注册中心完成啦,接下来启动程序,并保持该模块不中断。项目启动后可以在控制台上看到比较帅气的界面:
接下来就是服务消费者的代码编写了。
consumer_user:
项目基本结构还是和provider_ticket
相同:
接口内有一个方法buyTicket()
,实现类中实现它,这里代码稍后再放。
在该模块中,我们需要远程调用provider_ticket
模块的方法,我们需要在此模块(consumer_user
)创建一个和上一个模块(provider_ticket
)一模一样的项目结构(有点绕),直接看看创建完成之后的结构:
说白了就是创建一个TicketService
接口的全限定类名的包结构。(别问,我也不知道为什么…)
之后就可以远程调用了,我们需要在UserServiceImpl
类中编写代码:
@Service
public class UserServiceImpl implements UserService {
@Reference
private TicketService ticketService;
@Override
public void buyTicket() {
System.out.println("买到票了:"+ticketService.getTicket());
}
}
注意,这里@Service
是Spring包下的注解,@Reference
是alibaba包下的注解,之后编写测试代码运行,再次注意,provider_ticket
模块的服务器程序不能关闭!!!
在此之前,别忘了consumer_user
模块的全局配置文件也是需要配置的:
dubbo:
application:
name: consumer_user
registry:
address: zookeeper://localhost:2181
还有一点,需要在两个启动类上加入@EnableDubbo
注解。
测试代码:
@SpringBootTest
class ConsumerUserApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
运行结果:
成功运行~