在分布式架構(gòu)中,我們會將不同功能模塊化邻辉,部署到不同的服務(wù)器上,這時(shí)不同模塊之間的通訊就由RPC框架完成腮鞍,上次介紹了Dubbo的基本使用值骇,知道了它基于Spring容器,因此在SpringBoot項(xiàng)目中可以很方便的使用
一移国、項(xiàng)目配置
還是利用經(jīng)典的oracle部門員工表吱瘩,MyBatis--初入MyBatis中可以找到創(chuàng)建表和數(shù)據(jù)的sql,實(shí)現(xiàn)mapper層和service層的分布式架構(gòu)
項(xiàng)目依賴關(guān)系如下:
consumer最終通過Dubbo進(jìn)行RPC通訊迹缀,調(diào)用provider提供的方法
創(chuàng)建Maven聚合項(xiàng)目使碾,設(shè)置父Maven模塊的pom文件為:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
1. bean模塊
公共的模塊蜜徽,被所有模塊引用
導(dǎo)入lombok依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
創(chuàng)建包:
2. mapper模塊
用于編寫mapper層相關(guān)的代碼
2.1 依賴
pom文件中導(dǎo)入bean模塊和Mybatis相關(guān)依賴:
<!--mybatis啟動器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mysql jdbc-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.9</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!--bean模塊-->
<dependency>
<groupId>com.aruba</groupId>
<artifactId>bean</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.2 springboot配置文件
resources目錄下創(chuàng)建application-mybatis.yml:
# 使用mybatis-plus配置類別名
mybatis-plus:
type-aliases-package: com.aruba.bean
configuration:
map-underscore-to-camel-case: true
spring:
datasource:
# 使用阿里的Druid連接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填寫你數(shù)據(jù)庫的url、登錄名票摇、密碼和數(shù)據(jù)庫名
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
druid:
# 連接池的配置信息
# 初始化大小拘鞋,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置獲取連接等待超時(shí)的時(shí)間
maxWait: 60000
# 配置間隔多久才進(jìn)行一次檢測矢门,檢測需要關(guān)閉的空閑連接掐禁,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打開PSCache颅和,并且指定每個(gè)連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters傅事,去掉后監(jiān)控界面sql無法統(tǒng)計(jì),'wall'用于防火墻
filters: stat,wall,slf4j
# 通過connectProperties屬性來打開mergeSql功能峡扩;慢SQL記錄
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名單(沒有配置或者為空蹭越,則允許所有訪問)
allow: 127.0.0.1,192.168.8.109
# IP黑名單 (存在共同時(shí),deny優(yōu)先于allow)
deny: 192.168.1.188
# 禁用HTML頁面上的“Reset All”功能
reset-enable: false
# 登錄名
login-username: admin
# 登錄密碼
login-password: 123456
2.3 日志配置
resources目錄下創(chuàng)建logback.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="${catalina.base}/logs/"/>
<!-- 控制臺輸出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志輸出格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化輸出:%d表示日期教届,%thread表示線程名响鹃,%-5level:級別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化輸出:%d表示日期案训,%thread表示線程名买置,%-5level:級別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志輸出級別 -->
<root level="info">
<appender-ref ref="Stdout"/>
<!--暫時(shí)不需要輸出到文件-->
<!--<appender-ref ref="RollingFile"/>-->
</root>
<logger name="com.aruba.mapper" level="DEBUG"></logger>
<!--日志異步到數(shù)據(jù)庫 -->
<!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
日志異步到數(shù)據(jù)庫
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
連接池
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>
創(chuàng)建包:
3. api模塊
用于定義Provider的對外接口
導(dǎo)入bean模塊依賴:
<dependency>
<groupId>com.aruba</groupId>
<artifactId>bean</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4. provider模塊
遠(yuǎn)程對象提供者
4.1 依賴
導(dǎo)入mapper模塊强霎、api模塊忿项、dubbo相關(guān)依賴:
<!--springboot啟動器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<!--mapper模塊-->
<dependency>
<groupId>com.aruba</groupId>
<artifactId>mapper</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--api模塊-->
<dependency>
<groupId>com.aruba</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.2 springboot配置文件
配置dubbo相關(guān),以及引入mapper模塊中的配置:
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://192.168.42.4:2181
# 加載其他配置文件,加載其他application-*.yml文件城舞,多個(gè)名稱之間使用逗號分隔
spring:
profiles:
active: mybatis
4.3 SpringBoot啟動類
創(chuàng)建包:
創(chuàng)建啟動類轩触,開啟Dubbo、Mapper掃描:
@SpringBootApplication
@EnableDubbo
@MapperScan("com/aruba/mapper")
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
5. 項(xiàng)目結(jié)構(gòu)
完成上面步驟后家夺,項(xiàng)目結(jié)構(gòu)如下:
二脱柱、實(shí)現(xiàn)分布式項(xiàng)目RPC通訊
實(shí)現(xiàn)查詢部門信息,并展示到網(wǎng)頁上
1. bean模塊下創(chuàng)建部門類
內(nèi)容為:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept implements Serializable {
/**
* 部門編號
*/
private Integer deptno;
/**
* 部門名稱
*/
private String dname;
/**
* 地址
*/
private String loc;
}
2. api模塊中新增查詢接口
內(nèi)容為:
public interface DubboDeptService {
public List<Dept> findAllDept();
}
3. mapper模塊中新增DeptMapper
內(nèi)容為:
public interface DeptMapper extends BaseMapper<Dept> {
}
4. provider模塊中實(shí)現(xiàn)對外接口
內(nèi)容為:
@DubboService
public class DubboDeptServiceImpl implements DubboDeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> findAllDept() {
Wrapper<Dept> queryWrapper = new QueryWrapper<>();
return deptMapper.selectList(queryWrapper);
}
}
注意需要@DubboService注解拉馋,表示注冊到Dubbo中
5. 新建dept模塊
業(yè)務(wù)模塊代碼編寫
5.1 依賴
導(dǎo)入springweb依賴榨为、dubbo、api模塊等:
<!--web啟動器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--api模塊-->
<dependency>
<groupId>com.aruba</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
5.2 springboot配置文件
配置dubbo:
dubbo:
application:
name: dubbo-dept-consumer
registry:
address: zookeeper://192.168.42.4:2181
5.3 springboot啟動類
開啟dubbo:
@SpringBootApplication
@EnableDubbo
public class DeptApplication {
public static void main(String[] args) {
SpringApplication.run(DeptApplication.class, args);
}
}
5.4 service層代碼
定義接口:
public interface DeptService {
public List<Dept> findAllDept();
}
實(shí)現(xiàn)接口煌茴,使用provider對外對象進(jìn)行調(diào)用獲取部門信息:
@Service
public class DeptServiceImp implements DeptService {
@DubboReference
private DubboDeptService dubboDeptService;
@Override
public List<Dept> findAllDept() {
return dubboDeptService.findAllDept();
}
}
5.5 controller層代碼
@Controller
public class DeptController {
@Autowired
private DeptService deptService;
@RequestMapping("dept")
public String dept(Model model) {
model.addAttribute("deptList", deptService.findAllDept());
return "dept";
}
}
5.6 html展示
resources目錄下新建templates文件夾随闺,并創(chuàng)建一個(gè)html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
#tb {
border: burlywood 1px solid;
width: 50%;
margin: 0 auto;
}
#tb th, td {
border: 1px solid bisque;
text-align: center;
}
</style>
<body>
<table id="tb" cellpadding="0px" cellspacing="0px">
<tr>
<th>編號</th>
<th>部門名稱</th>
<th>地址</th>
</tr>
<tr th:each="dept : ${deptList}">
<td th:text="${dept.deptno}"></td>
<td th:text="${dept.dname}"></td>
<td th:text="${dept.loc}"></td>
</tr>
</table>
</body>
</html>
啟動provider和dept的springboot,并進(jìn)行瀏覽器訪問:
數(shù)據(jù)庫日志打印是provider輸出的: