四、soul源碼學(xué)習(xí)-dubbo項(xiàng)目本地運(yùn)行

一、搭建dubbo示例代碼

  • 搭建自己的dubbo項(xiàng)目:示例代碼:https://github.com/wyc192273/soul-learn-project/tree/main/dubbo-demo

  • 接下來,我們dubbo的provider項(xiàng)目引入如下依賴:

    <!-- 引入 Soul 針對 Dubbo 的集成的依賴 -->
     <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-client-apache-dubbo</artifactId>
            <version>${last.version}</version>
    </dependency>
    
  • 如果用的Alibaba Dubbo 2.6.X 的話,用如下依賴:

<!-- 引入 Soul 針對 Dubbo 的集成的依賴 -->
 <dependency>
        <groupId>org.dromara</groupId>
        <artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
        <version>${last.version}</version>
</dependency>
  • 在我們自己的provider項(xiàng)目中,修改application.yaml文件添加如下配置:
soul:
  # Soul 針對 Dubbo 的配置項(xiàng),對應(yīng) DubboConfig 配置類
  dubbo:
    admin-url: http://127.0.0.1:9095 # Soul Admin 地址
    context-path: /user-api # 設(shè)置在 Soul 網(wǎng)關(guān)的路由前綴,例如說 /order、/product 等等。
                            # 后續(xù),網(wǎng)關(guān)會(huì)根據(jù)該 context-path 來進(jìn)行路由
    app-name: user-service # 應(yīng)用名。未配置情況下,默認(rèn)使用 Dubbo 的應(yīng)用名
  • 在Dubbo Service的實(shí)現(xiàn)類的方法上,添加@SoulDubboClient注解,用于設(shè)置每個(gè)Dubbo方法的soul網(wǎng)關(guān)對應(yīng)的請求路徑
@DubboService(group = "user", version = "1.0.0")
public class UserServiceImpl implements UserService {

    @Override
    @SoulDubboClient(path = "/getUser")
    public String getUser(Integer id) {
        return "user_" + id;
    }
}
  • 設(shè)置dubbo插件

    需要設(shè)置soul的dubbo插件為開啟狀態(tài),訪問http://localhost:9095/#/system/plugin

    image.png

    dubbo插件,配置注冊中心的地址,可以是zookeeper或nacos, 默認(rèn)是zookeeper配置

    {"register":"zookeeper://localhost:2181"}
    {"register":"nacos://localhost:8848"}
    
  • 啟動(dòng)dubbo項(xiàng)目,這個(gè)時(shí)候去http://localhost:9095/#/plug/dubbo,發(fā)現(xiàn)選擇器和規(guī)則注冊成功

image.png

二、網(wǎng)關(guān)接入dubbo

  • apache-dubbo用戶引入如下依賴: nacos和zookeeper可以根據(jù)自己選擇配置相關(guān)依賴

    <!--soul apache dubbo plugin start-->
            <dependency>
                <groupId>org.dromara</groupId>
                <artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
                <version>${soul.last.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.7.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.5</version>
            </dependency>
           <!-- Dubbo Nacos registry dependency start -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-registry-nacos</artifactId>
                 <version>2.7.5</version>
             </dependency>
             <dependency>
                 <groupId>com.alibaba.nacos</groupId>
                 <artifactId>nacos-client</artifactId>
                 <version>1.1.4</version>
             </dependency>
             <!-- Dubbo Nacos registry dependency  end-->
    
            <!-- Dubbo zookeeper registry dependency start-->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-client</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>4.0.1</version>
            </dependency>
            <!-- Dubbo zookeeper registry dependency end -->
    
  • alibaba-dubbo用戶dubbo插件依賴換成下面的即可:

    <!--soul alibaba dubbo plugin start-->
    <dependency>
      <groupId>org.dromara</groupId>
      <artifactId>soul-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
      <version>${last.version}</version>
    </dependency>
    <!-- soul  alibaba dubbo plugin end-->
    
  • 重啟網(wǎng)關(guān)服務(wù)即可

三、調(diào)用網(wǎng)關(guān)的dubbo接口

調(diào)用網(wǎng)關(guān)的dubbo接口,必須使用post方式調(diào)用網(wǎng)關(guān),并且content-type是application/json,用body傳參數(shù)的json字符串的形式

  • 單個(gè)java bean參數(shù)類型,默認(rèn)支持,代碼如下
@SoulDubboClient(path = "/getUser")
public String getUser(Integer id) {
  return "user_" + id;
}

getUser方法調(diào)用,使用postman調(diào)用,如圖所示

image.png

單個(gè)參數(shù),參數(shù)是對象形式傳參:

@Override
@SoulDubboClient(path = "/saveUser")
public Object saveUser(User user) {
    return user;
}
image.png
  • 多個(gè)參數(shù)支持
@Override
@SoulDubboClient(path = "/replaceUser")
public Object replaceUser(int id, String name, User user) {
  System.out.println(user);
  user.setId(id);
  user.setName(name);
  return user;
}
image.png

這里要注意,參數(shù)的順序要和dubbo的順序一致,否則會(huì)有問題

四、總結(jié)

soul的dubbo實(shí)現(xiàn),實(shí)際上就是 http請求 --> 網(wǎng)關(guān) --> dubbo provider 這樣一個(gè)流程。

網(wǎng)關(guān)將http協(xié)議請求,通過使用dubbo泛化調(diào)用 的方式 調(diào)用到我們的dubbo服務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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