Springboot 2.x 整合Dubbo 2.6.x和Dubbo 2.7.x

一 、Dubbo 是什么?

Dubbo(讀音[?d?b??])是阿里巴巴公司開源的一個高性能優(yōu)秀的服務框架,使得應用可通過高性能的 RPC 實現(xiàn)服務的輸出和輸入功能,可以和 [1] Spring框架無縫集成。
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:

  • 面向接口的遠程方法調用
  • 智能容錯和負載均衡
  • 服務自動注冊和發(fā)現(xiàn)。

二、為什么我要區(qū)分 2.6.x 和 2.7.x ?

Dubbo有很長一段時間的發(fā)展史,2018年的時候不知道為什么阿里暫更了一年,之后又重新開始更新。之前一直是阿里在維護,后面阿里把它捐給了Apache基金會,由Apache來維護,2.6.x之前,maven中的包名都是alibaba,2.7.0之后包名改成了apache,其中整合入系統(tǒng)中有一些差異;發(fā)展史:

  • 2008年,阿里巴巴開始內部使用 Dubbo;
  • 2009年初,發(fā)布1.0版本;
  • 2011年10月,阿里巴巴宣布開源,版本為2.0.7;
  • 2014年,當當網(wǎng) fork 了 Dubbo 版本,命名為dubbox-2.8.0,并支持 HTTP REST 協(xié)議;
  • 2014年10月,發(fā)布2.3.11版本;
  • 2017年9月,阿里巴巴重啟維護,重點升級所依賴的 JDK 及組件版本,發(fā)布2.5.4/5版本;
  • 2018年2月,阿里巴巴宣布將 Dubbo 捐獻給 Apache,進入 Apache 孵化器;
  • 2018年6月,Apache Dubbo 發(fā)布首個加入 Apache 孵化器的版本2.6.2,發(fā)展首位committer,來自有贊的@yiji同學;
  • 2018年7月,Dubbo 官方域名更新到 dubbo.apache.org,頁面煥然一新,并啟 用新 logo,品牌全面升級;
  • 2018年11月,加入孵化器以來,發(fā)展來自有贊的 @yiji同學成為首位 PPMC member;
  • 2018年12月,第八屆云計算標準和應用大會 ,Dubbo 獲得中國優(yōu)秀開源項目一等獎,同時獲得開源中國舉辦的2018中國優(yōu)秀開源項目獎,位列排行榜第3;
  • 2019年1月,發(fā)布了2.7.0,支持 Java 1.8,包名更改為org.apache,支持 Restful 服務;
  • 2019年1月,Dubbo 社區(qū)正式發(fā)布 Dubbo Ecosystem, 升級為完整的微服務解決方案;
  • 2019年5月21日,Dubbo 從 Apache 正式畢業(yè)。

三、包依賴區(qū)別

  • 2.6.x alibaba


    alibaba dubbo-spring-boot-starter的包依賴
  • 2.7.x apache


    apach dubbo-spring-boot-starter的包依賴

從圖中可以看出, alibaba包中的starter已經(jīng)依賴了dubbo、zookeeper、curator、spring-boot-start、dubbo-spring-boot-autoconfigure,而apache的包中只有dubbo-spring-boot-autoconfigure,所以如果使用apache的包的話,需要自行引入dubbo和注冊中心的相關包,如果使用的是alibaba的包的話就不需要了。

四、Dubbo項目的基本結構

Dubbo的原理什么的以及它的組成這里就不扯了,直接說說dubbo的項目結構吧。
基本的Dubbo項目組成分為三個部分:

  • 接口層
  • 服務提供層
  • 服務器消費層

五、實現(xiàn)整合

5.1 接口層

接口層這里自定義了接口,實現(xiàn)部分由服務提供層來實現(xiàn)。建議將model也放在接口層中,接口層中對dubbo沒有相關依賴,在這里pom就不提供了。

  • 實例
// vo層
@Data
public class UserVO implements Serializable {
    private Integer id;
    private String  userName;
    private Integer age;
}
// service 接口層
public interface IUserAdminService {
    /**
     * 通過用戶id獲取用戶
     * @param userId
     * @return
     */
    UserVO getUserById(String userId);
}

完成之后可以mvn install打包到本地倉庫或者打包成jar包供提供者或者消費者使用

5.2 服務提供層 2.6.x

  • pom
      ...
    2.6.x
      <!-- 導入接口依賴 -->
      <dependency>
            <groupId>com.martain.dubbo</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
      </dependency>
      <!-- duboo -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    2.7.x 
       <!-- dubbo -->
        <!-- 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.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.4.1</version>
        </dependency>
        <!--zookeeper 注冊中心客戶端引入 使用的是curator客戶端 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.4.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 服務實現(xiàn)接口
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import service.IUserAdminService;

@Service  // 注意,這個是dubbo包里面的service,不是spring包里面的
@Component
public class UserAdminService implements IUserAdminService {
    @Override
    public UserVO getUserById(String userId) {
        UserVO userVo = ...
        ...
        return userVo;
    }
}
  • 啟動類 Application上添加注解
@SpringBootApplication
@EnableDubbo
@MapperScan(basePackages = "com.jhunicom.community.model.mapper")
public class ServerApplication {

    public static void main(String[] args) {
        //如果不需要是web項目
        new SpringApplicationBuilder(ServerApplication.class)
                //非web應用
                .web(WebApplicationType.NONE)
                .run(args);
//       如果是web應用
//        SpringApplication.run(ServerApplication.class,args);
    }
}
  • 配置文件中配置
dubbo:
  application:
    name: dubbo-producer  #dubbo的注冊的服務名, 唯一性
    version: 1.0.0  # 服務提供的版本
  registry:
    address: zookeeper://127.0.0.1:2181  # 注冊中心的地址
  protocol:
    #協(xié)議名稱
    name: dubbo
    #服務暴露端口
    port: 20880
  scan:  
    base-packages: com.martain.dubbo.server.service # 接口實現(xiàn)類的包名

5.3 消費者層

  • pom
        2.6.x
      <!-- 導入接口依賴 -->
      <dependency>
            <groupId>com.martain.dubbo</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
      </dependency>
      <!-- duboo -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        2.7.x 
       <!-- dubbo -->
        <!-- 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.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.4.1</version>
        </dependency>
        <!--zookeeper 注冊中心客戶端引入 使用的是curator客戶端 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.4.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 遠程調用服務
import com.alibaba.dubbo.config.annotation.Reference;
import service.IUserAdminService;
@RestController
public class TestController {
    @Reference  // 使用該注解,dubbo會自動到注冊中心尋找服務提供者
    IUserAdminService userAdminService;
    @GetMapping("/user/{userId}")
    public Result getUserById(@PathVariable String userId){
        UserVO userVo = userAdminService.getUserById(userId);
        ...
  • 啟動類中添加 @EnableDubbo 注解
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  • 配置文件
dubbo:
  application:
    name: dubbo-consumer  #dubbo的注冊的服務名, 唯一性
    version: 1.0.0       # 版本號
  registry:
    address: zookeeper://127.0.0.1:2181 # 配置注冊中心

示例源碼(待補充)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容