承接上文,介绍了DubboZookeeper之后,这一篇博客就来记录一下怎么在SpringBoot项目中整合它们。


首先因为Dubbo的架构设计,有服务提供者(provider)服务消费者(consumer),那我们可以创建一个空项目,并往里面加入两个子模块,一个叫provider_ticket,另外一个是consumer_user。由前者提供服务,并注册到Zookeeper中,后者订阅Zookeeper,收到通知后远程调用前者完成业务。大致业务逻辑就是这样。

现在开始行动吧,项目创建好之后:

zookeeper springboot长连接 springboot zookeeper dubbo_java

Dubbo内部还是有挺多组件的,如果在以往的SSM项目中,我们会在配置文件中,配置很多<bean>组件,但好在SpringBoot的优势,它会为我们自动导入各种组件,我们只需要在两个模块中都引入Dubbostarter即可:

<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

特别注意,@Servicealibaba那个包的注解,不要导成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

注册服务到注册中心完成啦,接下来启动程序,并保持该模块不中断。项目启动后可以在控制台上看到比较帅气的界面:

zookeeper springboot长连接 springboot zookeeper dubbo_spring_02


接下来就是服务消费者的代码编写了。

consumer_user:

项目基本结构还是和provider_ticket相同:

zookeeper springboot长连接 springboot zookeeper dubbo_zookeeper_03

接口内有一个方法buyTicket(),实现类中实现它,这里代码稍后再放。

在该模块中,我们需要远程调用provider_ticket模块的方法,我们需要在此模块(consumer_user)创建一个和上一个模块(provider_ticket)一模一样的项目结构(有点绕),直接看看创建完成之后的结构:

zookeeper springboot长连接 springboot zookeeper dubbo_zookeeper_04

说白了就是创建一个TicketService接口的全限定类名的包结构。(别问,我也不知道为什么…)

之后就可以远程调用了,我们需要在UserServiceImpl类中编写代码:

@Service
public class UserServiceImpl implements UserService {
    
    @Reference
    private TicketService ticketService;
    
    @Override
    public void buyTicket() {
        System.out.println("买到票了:"+ticketService.getTicket());
    }
}

注意,这里@Service是Spring包下的注解,@Referencealibaba包下的注解,之后编写测试代码运行,再次注意,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();
    }
}

运行结果:

zookeeper springboot长连接 springboot zookeeper dubbo_ide_05

成功运行~