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, 找到bin目錄
windows點擊startup.cmd, 啟動nacos
在瀏覽器中輸入: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