之前的几篇文章把 dubbo 服务层都介绍完毕, 本篇文章咱们主要写 web 层如何调用服务层的方法. 文章底部附带源码.
启动服务
服务启动时, 会向 zk 注册自己提供的服务, zk 则会记录服务提供者的 IP 地址以及暴露的接口名称, 通过 zkCli.cmd 查看树形结构, 具体命令如下:
1,ls /
展示两个目录: dubbo,zookeeper, 下面主要看一下 dubbo 目录
2,ls /dubbo
可以看到注册到 dubbo 目录下的接口了
3,ls /dubbo/com.example.dubbo.demo.API.DemoApi
服务提供者的具体信息就在 providers 目录里了
服务消费者 - Web 层
该层依赖 API,model 层, 调用服务提供者对外提供的服务, 因此需要配置服务消费者的 dubbo 信息, 主要使用到的 dubbo 标签如下:
dubbo:application,dubbo:registry,dubbo:reference, 具体配置信息如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
- xsi:schemaLocation="
- http://code.alibabatech.com/schema/dubbo
- http://code.alibabatech.com/schema/dubbo/dubbo.xsd
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <!-- 定义了提供方应用信息, 用于计算依赖关系; 在 dubbo-admin 或 dubbo-monitor 会显示这个名字 -->
- <dubbo:application name="${my.dubbo.application.name}" owner="ll" organization="ll" />
- <!-- 使用 zookeeper 注册中心暴露服务, 注意要先开启 zookeeper-->
- <dubbo:registry id="zookeeper-registry" protocol="${my.dubbo.registry.protocol}" address="${my.dubbo.registry.address}" />
- <dubbo:monitor protocol="registry"/>
- <!-- 生成远程服务代理, 可以和本地 bean 一样使用 demoService -->
- <dubbo:reference id="demoApi" interface="com.example.dubbo.demo.api.DemoApi" check="false" />
- </beans>
dubbo:registry 的配置需要跟服务提供者的配置是一致的.
dubbo:reference 配置引用服务的接口名称, 详细的属性参考 dubbo 官方文档.
maven 依赖
- <dependency>
- <groupId>com.example.dubbo</groupId>
- <artifactId>dubbo-demo-API</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>com.example.dubbo</groupId>
- <artifactId>dubbo-demo-model</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
服务调用
新建一个 DemoService 来调用服务提供者对外暴露的方法
- package com.example.dubbo.demo.Web.service;
- import com.example.dubbo.demo.API.DemoApi;
- import dubbo.demo.model.entity.Student;
- import java.util.List;
- import org.apache.dubbo.config.annotation.Reference;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- /**
- * 消费者服务层
- *
- * @author chenlong
- * @date 2019-03-24 00:49
- * @since 1.0.0
- */
- @Service
- public class DemoService {
- private static final Logger LOGGER = LoggerFactory.getLogger(DemoService.class);
- @Autowired
- private DemoApi demoApi;
- public String sayHello(String name) {
- return demoApi.sayHello(name);
- }
- public List<Student> getAll(){
- return demoApi.getAll();
- }
- public void add(Student student){
- demoApi.add(student);
- }
- }
新建一个 DemoController 来进行测试
- package com.example.dubbo.demo.Web.controller;
- import com.example.dubbo.demo.Web.service.DemoService;
- import dubbo.demo.model.entity.Student;
- import java.util.List;
- import java.util.Random;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.Web.bind.annotation.*;
- /**
- * demo 控制器
- *
- * @author chenlong
- * @date 2019-03-24 00:51
- * @since 1.0.0
- */
- @RestController
- @RequestMapping("/demo")
- public class DemoController {
- private static Logger logger = LoggerFactory.getLogger(DemoController.class);
- @Autowired
- private DemoService demoService;
- /**
- * 测试方法, 浏览器访问 /demo/index 可以看到响应结果了
- *
- * @return
- */
- @RequestMapping(value = "/index", method = RequestMethod.GET)
- @ResponseBody
- public String index() {
- return demoService.sayHello("dubbo");
- }
- @GetMapping("all")
- @ResponseBody
- public List<Student> getAll(){
- return demoService.getAll();
- }
- @GetMapping("add")
- @ResponseBody
- public Student add(){
- Student student = new Student();
- student.setNum("2019"+ new Random().nextInt());
- student.setName("乔治"+new Random().nextInt(100));
- student.setAge(new Random().nextInt(10));
- student.setSex("m");
- demoService.add(student);
- return student;
- }
- }
启动 Web 层, Web 层会以长连接的方式监听 zk, 同时会把 zk 上的服务提供者的信息拿到本地, 这样当 zk 挂掉后不影响消费者的调用, 当新的服务注册到 zk 上时, 消费者会同时拿到新的服务信息.
我们在浏览器中输入地址, 发现调用成功
代码地址: https://github.com/lcchenlong/springbootdubbo
作者: Eric.Chen
来源: https://www.cnblogs.com/lc-chenlong/p/10696896.html