springboot集成dubbo简单demo

工程概览

avatar

duubo-api :工共接口工程,包含pojo

dubbo-consumer-web:服务消费者工程

dubbo-provider-service:服务提供者工程

确认以下主要环境具备

zookeeper (192.168.7.100:2181)

mysql (127.0.0.1:3306)

1.准备测试数据

在mysql数据库新建测试用的数据

执行如下sql脚本,新建employee_tbl

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for employee_tbl
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl`  (
  `id` int(11) NOT NULL,
  `name` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `date` datetime(0) NOT NULL,
  `singin` tinyint(4) NOT NULL DEFAULT 0 COMMENT '登录次数',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of employee_tbl
-- ----------------------------
INSERT INTO `employee_tbl` VALUES (1, '小明', '2016-04-22 15:25:33', 8);
INSERT INTO `employee_tbl` VALUES (2, '小王', '2016-04-20 15:25:47', 3);
INSERT INTO `employee_tbl` VALUES (3, '小丽', '2016-04-19 15:26:02', 2);
INSERT INTO `employee_tbl` VALUES (4, '小王', '2016-04-07 15:26:14', 4);
INSERT INTO `employee_tbl` VALUES (5, '小明', '2016-04-11 15:26:40', 4);
INSERT INTO `employee_tbl` VALUES (6, '小明', '2016-04-04 15:26:54', 2);

SET FOREIGN_KEY_CHECKS = 1;

示图如下:

avatar

2.新建Dubbo公共接口工程

新建普通maven工程,如下图:

avatar

pom.xml文件主要内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yyj</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>2020-05-23</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

</project>

EmployeeApi.java

public interface EmployeeApi {

    /** 获取employee_tbl表的所有数据 */
    List<Employee> getAll();
    /**
     * 根据id查询employee_tbl表中对应的数据.
     * @param id
     */
    Employee getById(int id);

}

此接口是Dubbo提供者和消费者公共的接口,提供者会暴露此接口提供服务

Employee.java

/** employee_tbl表实体对象,利用lombok生成了该对象的无/全参、get()、set()等方法 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {
  private int id;
  private String name;
  private Date date;
  private int singin;
}

注意此对象必须实现序列化接口,否则服务提供者处理的结果经过网络传输给消费者时,消费者展示时会报java.lang.IllegalStateException: Serialized class xx.xx.xx must implement java.io.Serializable异常。

3.新建Dubbo服务提供者工程

新建springboot工程,如下图结构:

avatar

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yyj</groupId>
    <artifactId>dubbo-provider-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!-- springboot 整合dubbo依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- springboot整合mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

        <!-- mysql驱动;高版本的包已经改成com.mysql.cj.jdbc,使用时请注意版本 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- dubbo消费者、提供者工共接口以及pojo依赖 -->
        <dependency>
            <groupId>com.yyj</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>2020-05-23</version>
        </dependency>

        <!-- 此依赖方便telnet测试dubbo暴露的接口用,不测试暴露的接口的话,可以不添加此依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

EmployeeMapper接口

@Mapper
public interface EmployeeMapper {

    /** 获取employee_tbl表的所有数据 */
    @Select("select * from employee_tbl")
    List<Employee> selectAll();
    /**
     * 根据id查询employee_tbl表中对应的数据.
     * @param id 主键id
     */
    @Select("select id, name, date, singin from employee_tbl where id = #{id} ")
    Employee selectById(@Param("id") int id);

}

持久层的操作,springboot整合mybatis实现;也可以利用其他ORM框架实现。

EmployeeServiceImpl.java

/** 注意@Service 导包 import org.apache.dubbo.config.annotation.Service */
@Service
public class EmployeeServiceImpl implements EmployeeApi {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public List<Employee> getAll() {
        return employeeMapper.selectAll();
    }

    @Override
    public Employee getById(int id) {
        return employeeMapper.selectById(id);
    }
}

业务逻辑层,实现了服务消费者、提供者公共的接口,注意@Service注解来自包org.apache.dubbo.config.annotation;

EmployeeServiceImpl类的@Service注解来自dubbo,不要和Spring的弄错,导包如下:

import org.apache.dubbo.config.annotation.Service;

启动类

@SpringBootApplication
@MapperScan("com.yyj.mapper")
/** 扫描Dubbo框架的@Service */
@EnableDubbo
public class DubboProviderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderServiceApplication.class, args);
    }

}

application.yml

dubbo:
  application:
    name: dubbo-provider-service
  registry:
    address: 192.168.7.100:2181
    check: false
    protocol: zookeeper
  protocol:
    name: dubbo
    port: 28888
  monitor:
    protocol: register
  consumer:
    check: false
    timeout: 2000
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 账户
    password: 密码
server:
  port: 8090

启动服务提供者工程

avatar

telnet测试调用提供者暴露的接口

CMD下执行

telnet 127.0.0.1 28888

28888端口为本地配置的dubbo协议端口,输入命令后按2下回车出现如下图:

avatar

查看服务列表:

ls -l

结果如下:

dubbo>ls -l
PROVIDER:
com.demo.api.EmployeeApi ->  published: Y

显示服务的方法详细信息列表:

ls -l 服务完整全称

如下:

dubbo>ls -l
PROVIDER:
com.demo.api.EmployeeApi ->  published: Y

dubbo>ls -l com.demo.api.EmployeeApi
com.demo.api.EmployeeApi (as provider):
        java.util.List getAll()
        com.demo.pojo.Employee getById(int)

dubbo>

调用服务查询

invoke 服务完整全称.方法
# 示例:invoke com.demo.api.EmployeeApi.getAll()

如下:

dubbo>invoke com.demo.api.EmployeeApi.getAll()
Use default service com.demo.api.EmployeeApi.
result: [{"date":1461338733000,"id":1,"name":"灏忔槑","singin":8},{"date":1461165947000,"id":2,"name":"灏忕帇","singin":3},{"date":1461079562000,"id":3,"name":"灏忎附","singin":2},{"date":1460042774000,"id":4,"name":"灏忕帇","singin":4},{"date":1460388400000,"id":5,"name":"灏忔槑","singin":4},{"date":1459783614000,"id":6,"name":"灏忔槑","singin":2}]
elapsed: 167 ms.
dubbo>invoke com.demo.api.EmployeeApi.getById(1)
Use default service com.demo.api.EmployeeApi.
result: {"date":1461338733000,"id":1,"name":"灏忔槑","singin":8}
elapsed: 3 ms.
dubbo>

说明服务提供者的服务能正常被调用

4.新建Dubbo服务消费者工程

avatar

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yyj</groupId>
    <artifactId>dubbo-condumer-web</artifactId>
    <version>2020-05-23</version>
    <name>dubbo-condumer-web</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- springboot 整合dubbo依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- dubbo消费者、提供者工共接口以及pojo依赖 -->
        <dependency>
            <groupId>com.yyj</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>2020-05-23</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

EmployeeServiceImpl.java

import com.demo.api.EmployeeApi;
import com.demo.pojo.Employee;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class EmployeeServiceImpl implements EmployeeApi {

    /** 依赖远程的employeeApi,即提供者暴露的EmployeeApi接口 */
    @Reference
    private EmployeeApi employeeApi;

    @Override
    public List<Employee> getAll() {
        return employeeApi.getAll();
    }

    @Override
    public Employee getById(int id) {
        return employeeApi.getById(id);
    }
}

EmployeeController.java

@Controller
public class EmployeeController {

    @Autowired
    private EmployeeApi employeeApi;

    /** 查询所有 */
    @GetMapping(value = "/getAll")
    @ResponseBody
    public List<Employee> getAll(){
        return employeeApi.getAll();
    }

    /** 根据id查询 */
    @GetMapping(value = "/getById/{id}")
    @ResponseBody
    public Employee getById(@PathVariable("id") int id){
        return employeeApi.getById(id);
    }
    
}

启动类

@SpringBootApplication
@EnableDubbo
public class DubboCondumerWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboCondumerWebApplication.class, args);
    }

}

application.yml

dubbo:
  application:
    name: dubbo-consumer-web
  registry:
    address: 192.168.7.100:2181
    protocol: zookeeper
    check: false
  monitor:
    protocol: register
  consumer:
    check: false
    timeout: 2000

server:
  port: 8080

5.测试

浏览器访问:http://127.0.0.1:8080/getAll 查询所有

avatar

浏览器访问:http://127.0.0.1/getById/1 查询id=1的实体

avatar

猜你喜欢

转载自www.cnblogs.com/youngyajun/p/12944180.html