源码

GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-dubbo01

准备

1、在服务器或者本地搭建好zookeeper,具体可参考文章:https://blog.csdn.net/qq_35620501/article/details/87519306
2、在服务器或者本地搭建好dubbo-admin,具体可参考文章:https://blog.csdn.net/qq_35620501/article/details/89037354

代码

  • 新建空的maven工程,命名为springboot-dubbo01

项目目录结构如下图:
在这里插入图片描述
pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

<modules>
    <module>springboot-dubbo01-api-web</module>
    <module>springboot-dubbo01-service-impl</module>
    <module>springboot-dubbo01-service</module>
</modules>
  • 新建模块,命名为springboot-dubbo01–service

service主要是用来存放在实体类、Enum、工具类、service等

项目结构如下图:
在这里插入图片描述
DemoService:

public interface DemoService {
    public List<Message> findMessage();
}

Message:

public class Message implements Serializable {
    private int id;
    private String city;
    private String time;
    private String weather;

    public Message() {}
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getCity() {return city;}
    public void setCity(String city) {this.city = city;}
    public String getTime() {return time;}
    public void setTime(String time) {this.time = time;}
    public String getWeather() {return weather;}
    public void setWeather(String weather) {this.weather = weather;}
}

ApiResponse:

public class ApiResponse implements Serializable {
    private int code;
    private String msg;
    private Object data;

    public ApiResponse() {}
    public ApiResponse(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public ApiResponse(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public int getCode() {return code;}
    public void setCode(int code) {this.code = code;}
    public String getMsg() {return msg;}
    public void setMsg(String msg) {this.msg = msg;}
    public Object getData() {return data;}
    public void setData(Object data) {this.data = data;}
}
  • 新建模块,命名为springboot-dubbo01-service-impl

service-impl主要是存放service接口实现类、持久层的实现

项目结构如下图:
在这里插入图片描述
pom.xml:

<parent>
    <groupId>com.wyj</groupId>
    <artifactId>springboot-dubbo01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.1</version>
    </dependency>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- springboot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>io.dubbo.springboot</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
        <version>1.0.0</version>
    </dependency>
    <!-- 项目依赖 -->
    <dependency>
        <groupId>com.wyj</groupId>
        <artifactId>springboot-dubbo01-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
    </dependency>
</dependencies>

<build>
    <finalName>springboot-dubbo01-service-impl</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

DemoServiceImpl:

@Service(timeout = 6000)//这个service是dubbo的service
public class DemoServiceImpl implements DemoService {

    @Autowired
    private DemoMapper demoMapper;

    @Override
    public List<Message> findMessage() {
        return demoMapper.findMessage();
    }
}

DemoMapper:

public interface DemoMapper {
    public List<Message> findMessage();
}

DemoMappe.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.wyj.mapper.DemoMapper">
    <select id="findMessage" resultType="com.wyj.entity.po.Message">
        select * from message
    </select>
</mapper>

application.properties:

# tomcat
server.port=8081
# dubbo
spring.dubbo.application.name=demo-provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.wyj.service.impl
# dataBase
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot-dubbo01?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
  • 新建模块,命名为springboot-dubbo01-api-web

api主要是用来存放controller、handler、interceptor

项目结构如下图:
在这里插入图片描述
pom.xml:

<parent>
    <groupId>com.wyj</groupId>
    <artifactId>springboot-dubbo01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
    <!-- thymeleaf -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!--  springboor-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>io.dubbo.springboot</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
        <version>1.0.0</version>
    </dependency>
    <!-- 项目依赖,去除springboot整合mybatis的jar包原因是该jar包中会自动注入sqlsession,需要在api层配置DataSource相关参数 -->
    <dependency>
        <groupId>com.wyj</groupId>
        <artifactId>springboot-dubbo01-service-impl</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </exclusion>
            <exclusion>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <finalName>springboot-dubbo01-api-web</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

DemoController:

注意:

这里不能使用@Autowired注入bean,要使用dubbo中的注解@Reference注入bean和dubbo接口

@RestController
public class DemoController {
    @Reference
    private DemoService demoService;

    @RequestMapping(value = "/query")
    public ApiResponse demo() {
        try {
            List<Message> messageList = demoService.findMessage();
            return new ApiResponse(200, "操作成功", messageList);
        } catch (Exception e) {
            e.printStackTrace();
            return new ApiResponse(500, "系统异常");
        }
    }
}

application.properties:

# tomcat
server.port=8080
# dubbo
spring.dubbo.application.name=demo-consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.wyj.controller

测试

  • 先运行service-impl的服务,再启动api的服务,原则上是先启动service-impl的

  • 访问

浏览器访问:http://127.0.0.1:8080/query
在这里插入图片描述

查看监控中心

  • 访问dubbo-admin

在这里插入图片描述
点击服务治理中的服务
在这里插入图片描述
从监控中心可以看到com.wyj.service.DemoService这个接口能够正常注册到zookeeper中,并被api给消费

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐