项目结构:
- api 模块——接口、实体等定义
- provider 模块——提供者
- consumer 模块——消费者
项目地址:
Github 地址:github.com/Silentims/s…
一、父工程项目 Dubbo:
1. 在 IDEA 中新建一个 SpringBoot 初始化项目
2. 给项目起名,使用 jdk1.8版本
3. 选择 springboot 的版本:
4. 删除多余不用文件目录
5. 编辑 pom.xml 文件,添加打包方式为 pom,增加子模块 module 引用(后面步骤一一创建),完整 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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-boot</name>
<description>Spring Boot整合Dubbo(注解方式)</description>
<!--打包方式:pom-->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<!--子模块引用-->
<modules>
<module>dubbo-api</module>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
</modules>
<dependencies>
<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>
<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>
<?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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-api</name>
<description>Demo project for Spring Boot</description>
<!--打包方式:jar-->
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<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>
二、api 模块
1. 创建子模块(与第一步一样创建流程)
2. 删除多余的文件目录,也删除主启动类,该模块主要定义接口,实体,公共资源,这里演示整合 dubbo 的demo 接口,代码目录结构如下
3. 修改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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-api</name>
<description>Demo project for Spring Boot</description>
<!--打包方式:jar-->
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<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>
4. 接口代码如下:
package com.example.dubbo.api.manager;
/**
* 接口定义
* @auth Jessy Heung
* @date 2020-09-25
*/
public interface DemoApi {
/**
* demo 方法
* @param name
* @return
*/
String sayHello(String name);
}
5. 完整的 api 模块,代码结构如下:
三、provider 模块
1. 创建子模块 dubbo-provider,与前面流程一样,创建后删除多余文件,文件目录如下:
2. 修改 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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<!--打包方式:jar-->
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- dubbo provider 启动不成功的主要问题在这里,没有添加 spring-boot-starter-web 依赖,所以启动日志里一直没有显示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)” 这行日志输出 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 这个是定义的接口包,在 provider 和 consumer 都需要引用的 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--新增 dubbo 依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</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>
3. 修改 application 配置文件(这里我改成了 yml 文件格式)
server:
port: 8087
dubbo:
application:
# 这个 name 作为提供者展示(在 dubbo-admin 可视化界面看到的提供者名称就是这个) name: dubbo-springboot-provider
# 应用所属者 owner: Jessy Heung
# 应用所属组织 organization: Jessy Heung
registry:
id: zookeeper-registry
# 注册中心协议 protocol: zookeeper
# 注册中心地址 此处采用本地 zk 注册,服务器的话写对应 ip 地址 address: zookeeper://127.0.0.1:2181
# dubbo协议在20880端口暴露服务
# 协议名称
protocol:
name: dubbo
# 协议端口
port: 20880
# 协议访问log
accesslog: dubbo-access.log
# 重试次数
provider:
retries: 0
# 超时时间
timeout: 3000
# 注册监控中心
monitor:
protocol: registry
4. 写服务实现代码,创建一个服务实现类,具体代码如下:
- 注意@service 注解为 dubbo 下的
package com.example.dubbo.provider.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.example.dubbo.api.manager.DemoApi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
public class DemoApiImpl implements DemoApi {
public static final Logger logger = LoggerFactory.getLogger(DemoApiImpl.class);
@Override
public String sayHello(String name) {
logger.info("【提供者】【服务实现】---请求参数 name :{}",name);
return "hello"+ name +"(Springboot 整合 Dubbo --采用注解方式)";
}}
5. 主启动类中,启动用 dubbo
package com.example.dubbo.provider;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo //启用 dubbo
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
6. 完整的文件目录结构:
四、consumer 模块
1. 创建子模块 dubbo-consumer(流程与 provider 一样,只是模块名称不一样)
2. 修改 pom.xml(与 provider 一样)
<?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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<!--打包方式:jar-->
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo consumer 启动不成功的主要问题在这里,没有添加 spring-boot-starter-web 依赖,所以启动日志里一直没有显示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8088 (http)” 这行日志输出 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 这个是定义的接口包,在 provider 和 consumer 都需要引用的 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--新增 dubbo 依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. 修改 application 配置文件(改为 yml 格式),主要是修改端口号,application 名称
server:
port: 8088
dubbo:
application:
# dubbo admin中消费者名称 name: dubbo-springboot-consumer
# 应用所属者 owner: Jessy Heung
# 应用所属组织 organization: Jessy Heung
registry:
id: zookeeper-registry
# 注册中心协议 protocol: zookeeper
# 注册中心地址 此处为本地 zk 注册 address: zookeeper://127.0.0.1:2181
# dubbo协议在20880端口暴露服务
# 协议名称
protocol:
name: dubbo
# 协议端口
port: 20880
# 协议访问log
accesslog: dubbo-access.log
# 重试次数
provider:
retries: 0
# 超时时间
timeout: 3000
# 注册监控中心
monitor:
protocol: registry
4. 服务层代码实现
package com.example.dubbo.consumer.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.example.dubbo.api.manager.DemoApi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* 消费者-服务层
* @auth Jessy Heung
* @date 2020-09-25
*/
@Service //此处为 spring 的注解
public class DemoService {
private static final Logger logger = LoggerFactory.getLogger(DemoService.class);
@Reference //dubbo 注解
private DemoApi demoApi;
public String sayHello(String name){
logger.info("【消费者】【服务层】---请求参数 name :{}",name);
return demoApi.sayHello(name);
}
}
5. 控制层代码实现
package com.example.dubbo.consumer.controller;
import com.example.dubbo.consumer.service.DemoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 消费者--控制层
* @auth Jessy Heung
* @date 2020-09-25
*/
@RestController
@RequestMapping("/demo")
public class DemoController {
private static Logger logger = LoggerFactory.getLogger(DemoController.class);
@Autowired
private DemoService demoService;
/**
* 打开浏览器,输入/demo/sayHello
* @return
*/
@RequestMapping(value = "/sayHello", method = RequestMethod.GET)
@ResponseBody
public String sayHello(){
logger.info("【消费者】【控制层】---请求入口");
return demoService.sayHello("Jessy");
}}
6. 主启动类中,启动用 dubbo
package com.example.dubbo.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}}
7. 完整文件目录结构
五、编译和部署 dubbo admin
1. 下载官方项目Git 克隆到本地,官方项目地址https://github.com/apache/dubbo-admin
git clone https://github.com/apache/dubbo-admin.git
2. 打开项目中的 README_ZH.md 文件,按照教程部署即可
3. 浏览器输入:localhost://8080访问,如下页面表示部署成功
六、启动项目,测试
1. 先启动 provider,后启动 consumer:
2. 访问地址 localhost:8088/demo/sayHello
七、查看 dubbo admin 中的服务调用情况
1. 查看服务信息
2. 查看服务调用关系
至此,springboot 整合 dubbo 采用注解的简单 demo 完成。