SpringBoot+Dubbo搭建

SpringBoot+Dubbo搭建

三月 31, 2020

创建一个springboot maven工程,在工程内新创建3个spring boot model

1
2
3
api     #定义接口类
service #接口的实现类 dubbo的服务提供者
web #对外接口 dubbo的服务消费者

工程根目录下pom.xml文件修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<packaging>pom</packaging> #声明打包方式
#添加子类
<modules>
<module>api</module>
<module>service</module>
<module>web</module>
</modules>
#添加公共模块
<dependencies>
<!-- &lt;!&ndash; 引入本地定义的api &ndash;&gt;-->
<dependency>
<groupId>com.aamen</groupId>
<artifactId>api</artifactId>
<version>0.0.1</version>
</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- &lt;!&ndash; dubbo provider 启动不成功的主要问题在这里,没有添加 spring-boot-starter-web 依赖,所以启动日志里一直没有显示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)” 这行日志输出 &ndash;&gt;-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Dubbo 依赖 -->
<!--引入dubbo的依赖-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依赖 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<configuration>
<locales>en,fr</locales>
</configuration>
</plugin>
</plugins>
<!-- 这里要把 spring boot 自带的 spring-boot-maven-plugin 插件换成 maven-site-plugin,否则 mvn 打包会报错 -->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
</build>

在其它三个子模块的 pom.xml 增加

1
<packaging>jar</packaging>

api模块主要提供接口的定义;删除启动类,增加接口类。

1
2
3
public interface UserService {
public String login(String name);
}

并且打包插件修改为
1
2
3
4
5
6
7
8
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>

service模块主要为接口实现类以及提供dubbo服务,注意这里使用是service注解为dubbo包提供的注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.aamen.user.service;

import com.aamen.facade.user.UserService;
import com.alibaba.dubbo.config.annotation.Service;

/**
* @author aamen
* @Title:
* @Description:
* @Version:
* @date 2020/3/30 10:24 下午
*/
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {
@Override
public String login(String name) {
return "hello " + name;
}
}

在启动类里添加dubbo注解
1
2
@EnableDubboConfig
@DubboComponentScan("com.aamen.user.service;")

增加dubbo配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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="${dubbo.application.name}" owner="jeftom" organization="jeftom" />
<!-- 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry id="zookeeper-registry" protocol="${dubbo.registry.protocol}" address="${dubbo.registry.address}" />
<!-- dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}" accesslog="dubbo-access.log"/>
<dubbo:provider retries="0" timeout="30000"/>
<dubbo:monitor protocol="registry"/>
<!-- 使用 dubbo 协议实现定义好的 Service Api 接口-->
<dubbo:service interface="com.aamen.user.service.UserServiceImpl" ref="UserServiceImpl" retries="0" timeout="60000" />
</beans>

spring 项目的 application.properties 配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server.port=8033
spring.config.name=application
# spring 的环境配置
spring.profiles.active=dev

#dubbo config
#应用定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
dubbo.application.name=user-provider
#应用所属者
dubbo.application.owner=aamen
#应用所属组织
dubbo.application.organization=aamen

# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper
# 注册中心id
dubbo.registry.id=zookeeper-registry
# 注册中心协议
dubbo.registry.protocol=zookeeper
# 注册中心地址
dubbo.registry.address=ip:2181

# dubbo协议在20880端口暴露服务
# 协议名称
dubbo.protocol.name=dubbo
# 协议端口
dubbo.protocol.port=20880
# 协议访问log
dubbo.protocol.accesslog=dubbo-access.log
# 重试次数
dubbo.provider.retries=0
# 超时时间
dubbo.provider.timeout=3000
# 注册监控中心
dubbo.monitor.protocol=registry

web主要为提供对外接口以及对dubbo提供服务的消费。

application.properties配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#server.port=8080
spring.config.name=application
# spring 的环境配置
spring.profiles.active=dev

# Qos 运维监控
dubbo.application.qosEnable=true
dubbo.application.qosPort=33333
dubbo.application.qosAcceptForeignIp=false

# dubbo config
# 应用定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
dubbo.application.name=dubbo-demo-service
# 应用所属者
dubbo.application.owner=jeftom
# 应用所属组织
dubbo.application.organization=jeftom

# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper
# 注册中心id
dubbo.registry.id=zookeeper-registry
# 注册中心协议
dubbo.registry.protocol=zookeeper
# 注册中心地址
dubbo.registry.address=118.190.40.252:2181

# dubbo协议在20880端口暴露服务
# 协议名称
dubbo.protocol.name=dubbo
# 协议端口
dubbo.protocol.port=20881
# 协议访问log
dubbo.protocol.accesslog=dubbo-access.log
# 重试次数
dubbo.provider.retries=0
# 超时时间
dubbo.provider.timeout=3000
# 注册监控中心
dubbo.monitor.protocol=registry

ps:同一台机器上部署协议端口不能用同一个

对启动类添加注解

1
2
@EnableDubboConfig
@DubboComponentScan("com.aamen.user.service")

创建控制器以及实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#控制器 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author aamen
* @Title:
* @Description:
* @Version:
* @date 2020/3/30 10:30 下午
*/
@RestController
public interface UserController {
@RequestMapping(value="/login")
public String loginTest(HttpServletRequest request);

}

#实现类

import com.aamen.facade.user.UserService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
* @author aamen
* @Title:
* @Description:
* @Version:
* @date 2020/3/30 11:52 下午
*/
@RestController
public class UserControllerImpl implements UserController {
@Reference(version = "1.0.0")
private UserService userService;

@Override
public String loginTest(HttpServletRequest request) {
String name = request.getParameter("name");
return userService.login(name);
}


}

最后分别运行service和web两个服务就ok了