本文將介紹如何基於Spring Boot 2.x的版本,經過Nacos做爲配置與註冊中心,實現Dubbo服務的註冊與消費。html
整合組件的版本說明:java
Spring Boot 2.1.9
Dubbo 2.7.3
Nacos 1.1.3
本文的亮點:mysql
源代碼放置Github: https://github.com/raysonfang/spring-boot-demo-allgit
以前公司在使用Dubbo 2.6.1的時候,採用Zookeeper做爲註冊中心。當時,也只是僅僅拿來做爲註冊中心使用,一沒有專門的管理後臺進行可視化管理操做,二是功能單一,僅做爲註冊中心使用。github
通過一段時間的學習和了解之後,發現採用阿里開源的Nacos做爲註冊中心與外部配置中心。它比Zookeeper更適合作服務的註冊與配置,畢竟是大廠開源,通過大量實踐。web
若是不清楚Nacos是什麼,或具備什麼主要功能以及架構設計思想。自行花點時間查一下資料。spring
Nacos:sql
注:這次主要實踐Nacos做爲註冊中心,後面會單獨整合Nacos做爲配置中心的實踐分享。
apache
使用idea+maven多模塊進行項目搭建windows
spring-boot-dubbo-nacos-demo:父工程
shop-service-provider: dubbo服務提供者
shop-service-consumer: dubbo服務消費者,是一個web工程
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>
網上大部分資料都是基於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
類中查看
針對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; } }
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); } }
測試的時候,啓動順序
下載nacos-server:https://github.com/alibaba/nacos/releases
解壓nacos-server, 找到bin目錄
windows點擊startup.cmd, 啓動nacos
在瀏覽器中輸入:http://localhost:8848/nacos/index.html
, 即可以訪問到nacos的控制檯。用戶名和密碼默認爲nacos
在nacos控制檯能夠看到信息:
在nacos控制檯能夠看到以下信息:
在瀏覽器端輸入:http://localhost:8081/sayHello, 便會返回結果。
解決:去maven的本地依賴庫中,刪除引入不成功的依賴包,在從新reimport。
@EnableDubboConfig
。解決: 換成使用@EnableDubbo
。
解決:經過查看DubboConfigurationProperties.java
源碼,去分析屬性配置。
因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!
源代碼放置Github: https://github.com/raysonfang/spring-boot-demo-all
歡迎你們star, 批評
我日常學習,編碼也都會放置github上,歡迎持續關注交流。
個人github: https://github.com/raysonfang