2流高手速成記(之七):基於Dubbo&Nacos的微服務簡要實現

来源:https://www.cnblogs.com/itfantasy/archive/2022/11/03/16855963.html
-Advertisement-
Play Games

本節內容會用到之前給大家講過的這兩篇: 2流高手速成記(之六):從SpringBoot到SpringCloudAlibaba 2流高手速成記(之三):SpringBoot整合mybatis/mybatis-plus實現數據持久化 鏈接掛出來,方便咱們中途對比著看 老規矩,先放出本節的項目結構: 我們 ...


本節內容會用到之前給大家講過的這兩篇:

2流高手速成記(之六):從SpringBoot到SpringCloudAlibaba

2流高手速成記(之三):SpringBoot整合mybatis/mybatis-plus實現數據持久化

鏈接掛出來,方便咱們中途對比著看

老規矩,先放出本節的項目結構:

 

 

我們參考上一節中講到的創建SpringCloudAlibaba工程模板的步驟,在工程下在創建三個子模塊,創建過程中勾選相同的依賴項

 

 

這三個子模塊也是三個獨立的可執行的工程,他們的用途分別為:

dubbo-nacos-provider:服務(Service)提供方

dubbo-nacos-consumer:消費方,服務的調用者

dubbo-nacos-api:介面及模型類定義,同時作為前邊二者的依賴方

接下來,我們共同見證神奇的一幕:

大家都知道,我們在第三節中實現的工程是一個結構相對完備(包含Service、Controller,View由Postman替代)且可以直接執行的獨立進程

本節我們依靠上一節講到的微服務技術,以幾乎不改變原有代碼為前提,將其一分為三:

provider和consumer分別獨立執行

consumer藉助微服務技術完成對provider的調用

api模塊是二者的依賴項,並非可執行的進程

1. Service介面、Model聲明遷移到dubbo-nacos-api

 

 

package com.example.dubbonacosapi.model;

import java.io.Serializable;

public class Person implements Serializable {
    private Integer id = 0;

    private String name = "";

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.example.dubbonacosapi.service;

import com.example.dubbonacosapi.model.Person;

import java.util.List;

public interface PersonService {
    Integer insert(Person person);

    Integer update(Person person);

    Integer delete(int id);

    List<Person> select();
}

因為api的作用僅是構成provider、consumer的二者依賴,所以其僅是持有相關聲明即可

Person類及PersonService在原有代碼基礎上保持不變!

2. Service介面實現類、Mapper聲明(mybatis-plus)遷移到dubbo-nacos-provider

 

 

既然provider保有mybatis-plus訪問mysql的能力,所以相關的依賴必定不可或缺

        <!-- 引入mybatis、mybatis-plus、mysql等依賴 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>dubbo-nacos-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

引入的方式和第三節講到的方式一樣

此外還包含了對於剛纔我們創建的dubbo-nacos-api的依賴,引入非常的方便

package com.example.dubbonacosprovider.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.dubbonacosapi.model.Person;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface PersonMapper extends BaseMapper<Person> {
}
package com.example.dubbonacosprovider.service.impl;

import com.example.dubbonacosapi.model.Person;
import com.example.dubbonacosapi.service.PersonService;
import com.example.dubbonacosprovider.mapper.PersonMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@DubboService
public class PersonServiceImpl implements PersonService {

    @Autowired
    PersonMapper mapper;

    public Integer insert(Person person) {
        return mapper.insert(person);
    }

    public Integer update(Person person) {
        return mapper.updateById(person);
    }

    public Integer delete(int id) {
        return mapper.deleteById(id);
    }

    public List<Person> select() {
        return mapper.selectList(null);
    }
}

Mapper的聲明沒有任何變化,而PersonServiceImpl依然保有對介面PersonService的實現,區別在於後者來自api模塊

唯一的區別在於PesonServiceImpl類的註解,由原有的@Service變更為@DubboService —— 這是唯一的區別!

3. Controller遷移到dubbo-nacos-consumer

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>dubbo-nacos-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

consumer作為外部可訪問的web服務,自然需要持有web相關依賴項

同時,與provicer相同,其與api模塊保持依賴關係

 

 

package com.example.dubbonacosconsumer.controller;

import com.example.dubbonacosapi.model.Person;
import com.example.dubbonacosapi.service.PersonService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/person")
public class PersonController {
    @DubboReference
    PersonService service;

    @PostMapping("/insert")
    public Integer insert(Person person) {
        return service.insert(person);
    }

    @PostMapping("/update")
    public Integer update(Person person) {
        return service.update(person);
    }

    @PostMapping("/delete")
    public Integer delete(int id) {
        return service.delete(id);
    }

    @GetMapping("/select")
    public List<Person> select() {
        return service.select();
    }
}

留意PersonService的引入方式:不再是@Autowired,而是變更為@DubboReference —— 這是唯一的區別!

4. Consumer和Provider的配置項

這裡我們依然沿用上一節講到的知識——以nacos作為配置中心

二者同時僅在本地保留一個bootstrap.properties配置文件,application.properties托管給nacos

 

 

# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要註意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
# spring.cloud.nacos.config.namespace=

# 應用名稱
spring.application.name=dubbo-nacos-consumer
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要註意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
# spring.cloud.nacos.config.namespace=

# 應用名稱
spring.application.name=dubbo-nacos-provider

內容均為nacos相關配置,以及各自聲明瞭自己的應用名稱(spring.application.name)

然後是他們在nacos上托管的配置數據:

 

 

 註意,新創建配置的Data Id需要與他們的應用名稱同名

 

 

 provider需要持有mysql相關配置

 

consumer作為controller的持有者,需要聲明外部的可訪問埠

全部的移植工作到這裡就完畢了!

我們分別執行provider、consumer兩個獨立進程

此時我們打開nacos服務列表,會看到dubbo-nacos-consumer、dubbo-nacos-provider兩個執行中的服務

 

 執行結果如下:

 

怎麼樣?是不是非常神奇?我們只改動了兩個註解,原本還是一個整體的工程就被一分為二了,並且是兩個可以彼此獨立運轉在兩台獨立機器上的服務

—— 這就是微服務的神奇之處!

藉助於強大的SpringCloudAlibaba,我們不僅可以對所有的業務實現統合拆分,充分調動團隊人員配置各司其職各自編寫自己的服務模塊,

更大的意義在於我們可以充分調動多台獨立設備的技能,使之串聯為一個龐大服務集群,較之於單台機器實現整個架構性能成千上萬倍的飛躍!

但是,微服務帶來研發、管理、性能便捷的同時,整個集群也在運維層面面對了前所未有的挑戰,最明顯的:

consumer在業務上依賴於後端的provider,如果provider運轉不正常,前方的consumer又該如何自處?!

圍繞這個問題,又有新的概念誕生了——【限流、熔斷、容錯、服務降級】

Sentinel要來咯~ 敬請期待! properties
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 邏輯導航 1.當點擊頁面主頁的登錄/註冊按鈕時,彈出登錄/註冊模態框 2.登錄/註冊模態框也是一個小組件,在組件文件夾內創建對應組件 3.然後需要將該組件傳到header(頭部)組件內(進行相關的導入和註冊) 4. 補充子傳父組件語法 在子組件內 當點擊子組件里的東西時,傳遞給父組件一個事件,父組件 ...
  • 本文主要記錄 Vue.js 中的 Vuex,Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 ...
  • 當我們使用vuex的時候,時不時能看到“更改Vuex中的store中的狀態唯一辦法就是提交mutations”,但是有沒有試想過,我們不提交mutations其實也能修改state的值?答案是可以的 我們可以直接使用如下方式; this.$store.state.num=666; 其中,這樣修改的話 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 for in 和 for of 相對於大家肯定都不陌生,都是用來遍歷屬性的沒錯。那麼先看下麵的一個例子: 例1 const obj = { a: 1, b: 2, c: 3 } for (let i in obj) { console.l ...
  • 一、Yarn 產生的背景 Hadoop2 之前是由 HDFS 和 MR 組成的,HDFS 負責存儲,MR 負責計算。 一)MRv1 的問題 耦合度高:MR 中的 jobTracker 同時負責資源管理和作業控制兩個功能,互相制約。 可靠性差:管理節點是單機的,有單點故障的問題。 資源利用率低:基於 ...
  • 面向對象 一、三大特征之繼承 python三大特征: 封裝、繼承、多態 三者中繼承最為核心,實際應用多,感受較為直觀 封裝和多態略微抽象 1、繼承的概念 繼承的含義: ​ 在現實生活中,繼承表示人與人之間資源的從屬關係 ​ 例如:兒子繼承父親 ​ 在編程的世界中,繼承表示類與類之間的資源從屬關係 ​ ...
  • 熱度已經過了,但還是覺得有必要從架構設計的角度來討論一下此事。並用以往我的經驗來設計一套負載能力更好一些的系統。 先說一下基本的架構思路: 最大限度的避免計算,靜態化 不用資料庫,更新類操作使用APPEND模式的文本文件 流程最短,最好是客戶端訪問的第一臺伺服器就能完成全部工作 善用CDN 客戶端負 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 從之前的Lambda表達式的演變過程可以知道,Lambda表達式其實是一個對匿名內部類的簡化過程:去掉了多餘的語法修飾,只保留最最核心的部分。在Java中類似這種使用匿名內部類寫代碼的場景非常多,比如Runnable介面,就是典型的最好使用La ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...