Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)

  • 2019 年 10 月 10 日
  • 筆記

本文的思維導圖

1、概述

本文將介紹如何基於Spring Boot 2.x的版本,通過Nacos作為配置與註冊中心,實現Dubbo服務的註冊與消費。

整合組件的版本說明:

  • Spring Boot 2.1.9
  • Dubbo 2.7.3
  • Nacos 1.1.3

本文的亮點:

  • 1.採用yml方式進行dubbo的配置。
  • 2.相關組件採用較新版本進行整合。
  • 3.相關源程式碼放置於Github上,可隨時查看。

源程式碼放置Github: https://github.com/raysonfang/spring-boot-demo-all


之前公司在使用Dubbo 2.6.1的時候,採用Zookeeper作為註冊中心。當時,也只是僅僅拿來作為註冊中心使用,一沒有專門的管理後台進行可視化管理操作,二是功能單一,僅作為註冊中心使用。

經過一段時間的學習和了解以後,發現採用阿里開源的Nacos作為註冊中心與外部配置中心。它比Zookeeper更適合做服務的註冊與配置,畢竟是大廠開源,經過大量實踐。

如果不清楚Nacos是什麼,或具有什麼主要功能以及架構設計思想。自行花點時間查一下資料。

Nacos:

註:此次主要實踐Nacos作為註冊中心,後面會單獨整合Nacos作為配置中心的實踐分享。


2、基礎框架搭建

使用idea+maven多模組進行項目搭建

spring-boot-dubbo-nacos-demo:父工程

shop-service-provider: dubbo服務提供者

shop-service-consumer: dubbo服務消費者,是一個web工程


3、pom.xml說明

spring-boot-dubbo-nacos-demo:父工程的pom.xml

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>      <groupId>cn.raysonblog</groupId>      <artifactId>misco-dubbo</artifactId>      <version>0.0.1-SNAPSHOT</version>      <name>misco-dubbo</name>      <packaging>pom</packaging>      <description>Demo project for Spring Boot Dubbo Nacos</description>        <modules>          <module>shop-service-provider</module>          <module>shop-service-consumer</module>      </modules>        <properties>          <java.version>1.8</java.version>          <spring-boot.version>2.1.9.RELEASE</spring-boot.version>          <dubbo.version>2.7.3</dubbo.version>      </properties>        <dependencyManagement>          <dependencies>              <!-- Spring Boot -->              <dependency>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-dependencies</artifactId>                  <version>${spring-boot.version}</version>                  <type>pom</type>                  <scope>import</scope>              </dependency>                <!-- Apache Dubbo  -->              <dependency>                  <groupId>org.apache.dubbo</groupId>                  <artifactId>dubbo-dependencies-bom</artifactId>                  <version>${dubbo.version}</version>                  <type>pom</type>                  <scope>import</scope>              </dependency>              <!-- Dubbo Spring Boot Starter -->              <dependency>                  <groupId>org.apache.dubbo</groupId>                  <artifactId>dubbo-spring-boot-starter</artifactId>                  <version>${dubbo.version}</version>              </dependency>              <dependency>                  <groupId>org.apache.dubbo</groupId>                  <artifactId>dubbo</artifactId>                  <version>${dubbo.version}</version>                  <exclusions>                      <exclusion>                          <groupId>org.springframework</groupId>                          <artifactId>spring</artifactId>                      </exclusion>                      <exclusion>                          <groupId>javax.servlet</groupId>                          <artifactId>servlet-api</artifactId>                      </exclusion>                      <exclusion>                          <groupId>log4j</groupId>                          <artifactId>log4j</artifactId>                      </exclusion>                  </exclusions>              </dependency>          </dependencies>      </dependencyManagement>        <repositories>          <repository>              <id>apache.snapshots.https</id>              <name>Apache Development Snapshot Repository</name>              <url>https://repository.apache.org/content/repositories/snapshots</url>              <releases>                  <enabled>false</enabled>              </releases>              <snapshots>                  <enabled>true</enabled>              </snapshots>          </repository>      </repositories>      <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>  

shop-service-provider: pom.xml引入dubbo與nacos相關的jar

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>      <parent>          <groupId>cn.raysonblog</groupId>          <artifactId>misco-dubbo</artifactId>          <version>0.0.1-SNAPSHOT</version>          <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->      </parent>      <groupId>cn.raysonblog</groupId>      <artifactId>shop-service-provider</artifactId>      <version>0.0.1-SNAPSHOT</version>      <name>shop-service-provider</name>      <description>服務者 Demo project for Spring Boot dubbo nacos</description>        <properties>          <java.version>1.8</java.version>      </properties>        <dependencies>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter</artifactId>              <exclusions>                  <!-- 排除自帶的logback依賴 -->                  <exclusion>                      <groupId>org.springframework.boot</groupId>                      <artifactId>spring-boot-starter-logging</artifactId>                  </exclusion>              </exclusions>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-log4j2</artifactId>          </dependency>          <!--<dependency>              <groupId>mysql</groupId>              <artifactId>mysql-connector-java</artifactId>              <scope>runtime</scope>          </dependency>-->          <dependency>              <groupId>org.projectlombok</groupId>              <artifactId>lombok</artifactId>              <optional>true</optional>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>          <!-- Dubbo -->          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo-spring-boot-starter</artifactId>          </dependency>          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo</artifactId>          </dependency>            <!-- Dubbo Registry Nacos -->          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo-registry-nacos</artifactId>              <version>2.7.3</version>          </dependency>          <dependency>              <groupId>com.alibaba.nacos</groupId>              <artifactId>nacos-client</artifactId>          </dependency>      </dependencies>      <repositories>          <repository>              <id>apache.snapshots.https</id>              <name>Apache Development Snapshot Repository</name>              <url>https://repository.apache.org/content/repositories/snapshots</url>              <releases>                  <enabled>false</enabled>              </releases>              <snapshots>                  <enabled>true</enabled>              </snapshots>          </repository>      </repositories>      <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>  

shop-service-consumer: pom.xml

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>      <parent>          <groupId>cn.raysonblog</groupId>          <artifactId>misco-dubbo</artifactId>          <version>0.0.1-SNAPSHOT</version>          <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->      </parent>      <groupId>cn.raysonblog</groupId>      <artifactId>shop-service-consumer</artifactId>      <version>0.0.1-SNAPSHOT</version>      <name>shop-service-consumer</name>      <description>Demo project for Spring Boot dubbo nacos</description>        <properties>          <java.version>1.8</java.version>      </properties>        <dependencies>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>              <exclusions>                  <!-- 排除自帶的logback依賴 -->                  <exclusion>                      <groupId>org.springframework.boot</groupId>                      <artifactId>spring-boot-starter-logging</artifactId>                  </exclusion>              </exclusions>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-log4j2</artifactId>          </dependency>          <dependency>              <groupId>org.projectlombok</groupId>              <artifactId>lombok</artifactId>              <optional>true</optional>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo-spring-boot-starter</artifactId>          </dependency>          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo</artifactId>          </dependency>            <!-- Dubbo Registry Nacos -->          <dependency>              <groupId>org.apache.dubbo</groupId>              <artifactId>dubbo-registry-nacos</artifactId>              <version>2.7.3</version>          </dependency>          <dependency>              <groupId>com.alibaba.nacos</groupId>              <artifactId>nacos-spring-context</artifactId>          </dependency>          <dependency>              <groupId>com.alibaba.nacos</groupId>              <artifactId>nacos-client</artifactId>          </dependency>          <dependency>              <groupId>cn.raysonblog</groupId>              <artifactId>shop-service-provider</artifactId>              <version>0.0.1-SNAPSHOT</version>          </dependency>      </dependencies>      <repositories>          <repository>              <id>apache.snapshots.https</id>              <name>Apache Development Snapshot Repository</name>              <url>https://repository.apache.org/content/repositories/snapshots</url>              <releases>                  <enabled>false</enabled>              </releases>              <snapshots>                  <enabled>true</enabled>              </snapshots>          </repository>      </repositories>      <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>  

4、配置文件說明

網上大部分資料都是基於application.properties配置,或者是基於xml配置dubbo的相關參數。而實際上,在Spring Boot工程中,
shop-service-provider:application.yml配置文件說明

  spring:    application:      name: shop-service-provider  # log config  logging:    config: classpath:log4j2.xml    level:      root: info      web: info    file: logs/shop-service-provider.log    # Dubbo Application  nacos  ## The default value of dubbo.application.name is ${spring.application.name}  ## dubbo.application.name=${spring.application.name}  nacos:    service-address: 127.0.0.1    port: 8848  dubbo:    registry:      address: nacos://${nacos.service-address}:${nacos.port}    protocol:      name: dubbo      port: 20881    scan:     base-packages: cn.raysonblog.*.service.impl

shop-service-consumer: application.yml說明

server:    address:    port: 8081    servlet:      context-path: /    tomcat:      uri-encoding: UTF-8    spring:    application:      name: shop-service-consumer    # log config  logging:    config: classpath:log4j2.xml    level:      root: info      web: info    file: logs/shop-service-provider.log    # Dubbo Application  nacos  ## The default value of dubbo.application.name is ${spring.application.name}  ## dubbo.application.name=${spring.application.name}  nacos:    service-address: 127.0.0.1    port: 8848  dubbo:    registry:      address: nacos://${nacos.service-address}:${nacos.port}

dubbo相關參數:也可以在DubboConfigurationProperties類中查看


5、編寫業務程式碼

shop-service-provider:程式碼實現

針對dubbo服務提供者,我沒有單獨把RpcShopService介面單獨放到一個子模組提供,建議在引用到實際項目中,可以單獨提供介麵包,在消費端直接引用介麵包,這樣就可以脫離服務提供者。

ShopServiceProviderApplication.java啟動主類

package cn.raysonblog.shopserviceprovider;    import org.apache.dubbo.config.spring.context.annotation.DubboConfigConfiguration;  import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;  import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;    import java.util.concurrent.CountDownLatch;    /**   * dubbo 服務提供方   * @author raysonfang   * @公眾號 Java技術乾貨(ID:raysonfang)   */  @SpringBootApplication  @EnableDubbo  public class ShopServiceProviderApplication {        //使用jar方式打包的啟動方式      private static CountDownLatch countDownLatch = new CountDownLatch(1);      public static void main(String[] args) throws InterruptedException{          SpringApplication.run(ShopServiceProviderApplication.class, args).registerShutdownHook();          countDownLatch.await();      }  }

需要注意@EnableDubbo這個註解,是開啟Dubbo服務必要的。


RpcShopService.java:暴露介面,供消費端使用

package cn.raysonblog.shopserviceprovider.service;    /**   * 提供暴露的Rpc介面   * @author raysonfang   */  public interface RpcShopService {      String sayHello(String name);  }  

ShopServiceImpl.java: 實現類

package cn.raysonblog.shopserviceprovider.service.impl;    import cn.raysonblog.shopserviceprovider.service.RpcShopService;  import org.apache.dubbo.config.annotation.Service;    /**   * 介面實現類   *   * ## @Service 這個註解是使用dubbo提供的,   *             這個註解中有很多屬性,需要單獨了解去進行配置   *   * @author raysonfang   */  @Service  public class ShopServiceImpl implements RpcShopService {        public String sayHello(String name) {          return name;      }  }  

shop-service-consumer: 程式碼實現
package cn.raysonblog.shopserviceconsumer;    import cn.raysonblog.shopserviceprovider.service.RpcShopService;  import org.apache.dubbo.config.annotation.Reference;  import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RequestMethod;  import org.springframework.web.bind.annotation.RestController;    /**   *   * 把主類和controller寫在一起,方便簡單測試演示。   *   * @author raysonfang   */  @SpringBootApplication  @RestController  public class ShopServiceConsumerApplication {      @Reference      RpcShopService shopService;        @RequestMapping(name = "/sayHello", method = RequestMethod.GET)      public String sayHello(){          return shopService.sayHello("Hello Dubbo Nacos!更多原創分享,技術交流,關註:Java技術乾貨(ID:raysonfang)");      }        public static void main(String[] args) {          SpringApplication.run(ShopServiceConsumerApplication.class, args);      }    }  

6、測試

測試的時候,啟動順序
啟動順序

6.1、啟動nacos-server註冊中心

下載nacos-server:https://github.com/alibaba/nacos/releases

nacos-server下載

解壓nacos-server, 找到bin目錄

windows點擊startup.cmd, 啟動nacos
nacos-server

在瀏覽器中輸入:http://localhost:8848/nacos/index.html, 便可以訪問到nacos的控制台。用戶名和密碼默認為nacos

6.2、啟動shop-service-provider服務提供者

在nacos控制台可以看到資訊:

6.3、啟動shop-service-consumer服務消費者

在nacos控制台可以看到如下資訊:

在瀏覽器端輸入:http://localhost:8081/sayHello, 便會返回結果。


7、問題記錄及解決

7.1、在整合的時候,pom引入dubbo及nacos相關依賴包,花費時間蠻多。主要是包引入不成功。

解決:去maven的本地依賴庫中,刪除引入不成功的依賴包,在重新reimport。

7.2、 在開啟dubbo的時候,註解引用不正確:錯誤注入@EnableDubboConfig

解決: 換成使用@EnableDubbo

7.3、yml配置Dubbo的相關屬性,網上資料蠻少的。

解決:通過查看DubboConfigurationProperties.java源碼,去分析屬性配置。


8、後記

由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

源程式碼放置Github: https://github.com/raysonfang/spring-boot-demo-all

歡迎大家star, 批評

我平常學習,編碼也都會放置github上,歡迎持續關注交流。
我的github: https://github.com/raysonfang