分布式--使用Dubbo搭建分布式項(xiàng)目

在分布式架構(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輸出的:

項(xiàng)目地址:

https://gitee.com/aruba/dubbo.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末景馁,一起剝皮案震驚了整個(gè)濱河市板壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌合住,老刑警劉巖绰精,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒璧,死亡現(xiàn)場離奇詭異,居然都是意外死亡笨使,警方通過查閱死者的電腦和手機(jī)卿樱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硫椰,“玉大人繁调,你說我怎么就攤上這事“胁荩” “怎么了蹄胰?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕翔。 經(jīng)常有香客問我裕寨,道長,這世上最難降的妖魔是什么派继? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任宾袜,我火速辦了婚禮,結(jié)果婚禮上驾窟,老公的妹妹穿的比我還像新娘庆猫。我一直安慰自己,他們只是感情好绅络,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布月培。 她就那樣靜靜地躺著,像睡著了一般昨稼。 火紅的嫁衣襯著肌膚如雪节视。 梳的紋絲不亂的頭發(fā)上拳锚,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天假栓,我揣著相機(jī)與錄音,去河邊找鬼霍掺。 笑死匾荆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杆烁。 我是一名探鬼主播牙丽,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兔魂!你這毒婦竟也來了烤芦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤析校,失蹤者是張志新(化名)和其女友劉穎构罗,沒想到半個(gè)月后铜涉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遂唧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年芙代,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖彭。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纹烹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出召边,到底是詐尸還是另有隱情铺呵,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布隧熙,位于F島的核電站陪蜻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贱鼻。R本人自食惡果不足惜宴卖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邻悬。 院中可真熱鬧症昏,春花似錦、人聲如沸父丰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾扇。三九已至攘烛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镀首,已是汗流浹背坟漱。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留更哄,地道東北人芋齿。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像成翩,于是被迫代替她去往敵國和親觅捆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容