本文将介绍如何基于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作为配置中心的实践分享。
使用idea+maven多模块进行项目搭建
spring-boot-dubbo-nacos-demo:父工程
shop-service-provider: dubbo服务提供者
shop-service-consumer: dubbo服务消费者,是一个web工程
spring-boot-dubbo-nacos-demo:父工程的pom.xml
1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>cn.raysonblog</groupId>
6 <artifactId>misco-dubbo</artifactId>
7 <version>0.0.1-SNAPSHOT</version>
8 <name>misco-dubbo</name>
9 <packaging>pom</packaging>
10 <description>Demo project for Spring Boot Dubbo Nacos</description>
11
12 <modules>
13 <module>shop-service-provider</module>
14 <module>shop-service-consumer</module>
15 </modules>
16
17 <properties>
18 <java.version>1.8</java.version>
19 <spring-boot.version>2.1.9.RELEASE</spring-boot.version>
20 <dubbo.version>2.7.3</dubbo.version>
21 </properties>
22
23 <dependencyManagement>
24 <dependencies>
25 <!-- Spring Boot -->
26 <dependency>
27 <groupId>org.springframework.boot</groupId>
28 <artifactId>spring-boot-dependencies</artifactId>
29 <version>${spring-boot.version}</version>
30 <type>pom</type>
31 <scope>import</scope>
32 </dependency>
33
34 <!-- Apache Dubbo -->
35 <dependency>
36 <groupId>org.apache.dubbo</groupId>
37 <artifactId>dubbo-dependencies-bom</artifactId>
38 <version>${dubbo.version}</version>
39 <type>pom</type>
40 <scope>import</scope>
41 </dependency>
42 <!-- Dubbo Spring Boot Starter -->
43 <dependency>
44 <groupId>org.apache.dubbo</groupId>
45 <artifactId>dubbo-spring-boot-starter</artifactId>
46 <version>${dubbo.version}</version>
47 </dependency>
48 <dependency>
49 <groupId>org.apache.dubbo</groupId>
50 <artifactId>dubbo</artifactId>
51 <version>${dubbo.version}</version>
52 <exclusions>
53 <exclusion>
54 <groupId>org.springframework</groupId>
55 <artifactId>spring</artifactId>
56 </exclusion>
57 <exclusion>
58 <groupId>javax.servlet</groupId>
59 <artifactId>servlet-api</artifactId>
60 </exclusion>
61 <exclusion>
62 <groupId>log4j</groupId>
63 <artifactId>log4j</artifactId>
64 </exclusion>
65 </exclusions>
66 </dependency>
67 </dependencies>
68 </dependencyManagement>
69
70 <repositories>
71 <repository>
72 <id>apache.snapshots.https</id>
73 <name>Apache Development Snapshot Repository</name>
74 <url>https://repository.apache.org/content/repositories/snapshots</url>
75 <releases>
76 <enabled>false</enabled>
77 </releases>
78 <snapshots>
79 <enabled>true</enabled>
80 </snapshots>
81 </repository>
82 </repositories>
83 <build>
84 <plugins>
85 <plugin>
86 <groupId>org.springframework.boot</groupId>
87 <artifactId>spring-boot-maven-plugin</artifactId>
88 </plugin>
89 </plugins>
90 </build>
91
92</project>
shop-service-provider: pom.xml引入dubbo与nacos相关的jar
1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <parent>
6 <groupId>cn.raysonblog</groupId>
7 <artifactId>misco-dubbo</artifactId>
8 <version>0.0.1-SNAPSHOT</version>
9 <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
10 </parent>
11 <groupId>cn.raysonblog</groupId>
12 <artifactId>shop-service-provider</artifactId>
13 <version>0.0.1-SNAPSHOT</version>
14 <name>shop-service-provider</name>
15 <description>服务者 Demo project for Spring Boot dubbo nacos</description>
16
17 <properties>
18 <java.version>1.8</java.version>
19 </properties>
20
21 <dependencies>
22 <dependency>
23 <groupId>org.springframework.boot</groupId>
24 <artifactId>spring-boot-starter</artifactId>
25 <exclusions>
26 <!-- 排除自带的logback依赖 -->
27 <exclusion>
28 <groupId>org.springframework.boot</groupId>
29 <artifactId>spring-boot-starter-logging</artifactId>
30 </exclusion>
31 </exclusions>
32 </dependency>
33 <dependency>
34 <groupId>org.springframework.boot</groupId>
35 <artifactId>spring-boot-starter-log4j2</artifactId>
36 </dependency>
37 <!--<dependency>
38 <groupId>mysql</groupId>
39 <artifactId>mysql-connector-java</artifactId>
40 <scope>runtime</scope>
41 </dependency>-->
42 <dependency>
43 <groupId>org.projectlombok</groupId>
44 <artifactId>lombok</artifactId>
45 <optional>true</optional>
46 </dependency>
47 <dependency>
48 <groupId>org.springframework.boot</groupId>
49 <artifactId>spring-boot-starter-test</artifactId>
50 <scope>test</scope>
51 </dependency>
52 <!-- Dubbo -->
53 <dependency>
54 <groupId>org.apache.dubbo</groupId>
55 <artifactId>dubbo-spring-boot-starter</artifactId>
56 </dependency>
57 <dependency>
58 <groupId>org.apache.dubbo</groupId>
59 <artifactId>dubbo</artifactId>
60 </dependency>
61
62 <!-- Dubbo Registry Nacos -->
63 <dependency>
64 <groupId>org.apache.dubbo</groupId>
65 <artifactId>dubbo-registry-nacos</artifactId>
66 <version>2.7.3</version>
67 </dependency>
68 <dependency>
69 <groupId>com.alibaba.nacos</groupId>
70 <artifactId>nacos-client</artifactId>
71 </dependency>
72 </dependencies>
73 <repositories>
74 <repository>
75 <id>apache.snapshots.https</id>
76 <name>Apache Development Snapshot Repository</name>
77 <url>https://repository.apache.org/content/repositories/snapshots</url>
78 <releases>
79 <enabled>false</enabled>
80 </releases>
81 <snapshots>
82 <enabled>true</enabled>
83 </snapshots>
84 </repository>
85 </repositories>
86 <build>
87 <plugins>
88 <plugin>
89 <groupId>org.springframework.boot</groupId>
90 <artifactId>spring-boot-maven-plugin</artifactId>
91 </plugin>
92 </plugins>
93 </build>
94
95</project>
shop-service-consumer: pom.xml
1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <parent>
6 <groupId>cn.raysonblog</groupId>
7 <artifactId>misco-dubbo</artifactId>
8 <version>0.0.1-SNAPSHOT</version>
9 <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
10 </parent>
11 <groupId>cn.raysonblog</groupId>
12 <artifactId>shop-service-consumer</artifactId>
13 <version>0.0.1-SNAPSHOT</version>
14 <name>shop-service-consumer</name>
15 <description>Demo project for Spring Boot dubbo nacos</description>
16
17 <properties>
18 <java.version>1.8</java.version>
19 </properties>
20
21 <dependencies>
22 <dependency>
23 <groupId>org.springframework.boot</groupId>
24 <artifactId>spring-boot-starter-web</artifactId>
25 <exclusions>
26 <!-- 排除自带的logback依赖 -->
27 <exclusion>
28 <groupId>org.springframework.boot</groupId>
29 <artifactId>spring-boot-starter-logging</artifactId>
30 </exclusion>
31 </exclusions>
32 </dependency>
33 <dependency>
34 <groupId>org.springframework.boot</groupId>
35 <artifactId>spring-boot-starter-log4j2</artifactId>
36 </dependency>
37 <dependency>
38 <groupId>org.projectlombok</groupId>
39 <artifactId>lombok</artifactId>
40 <optional>true</optional>
41 </dependency>
42 <dependency>
43 <groupId>org.springframework.boot</groupId>
44 <artifactId>spring-boot-starter-test</artifactId>
45 <scope>test</scope>
46 </dependency>
47 <dependency>
48 <groupId>org.apache.dubbo</groupId>
49 <artifactId>dubbo-spring-boot-starter</artifactId>
50 </dependency>
51 <dependency>
52 <groupId>org.apache.dubbo</groupId>
53 <artifactId>dubbo</artifactId>
54 </dependency>
55
56 <!-- Dubbo Registry Nacos -->
57 <dependency>
58 <groupId>org.apache.dubbo</groupId>
59 <artifactId>dubbo-registry-nacos</artifactId>
60 <version>2.7.3</version>
61 </dependency>
62 <dependency>
63 <groupId>com.alibaba.nacos</groupId>
64 <artifactId>nacos-spring-context</artifactId>
65 </dependency>
66 <dependency>
67 <groupId>com.alibaba.nacos</groupId>
68 <artifactId>nacos-client</artifactId>
69 </dependency>
70 <dependency>
71 <groupId>cn.raysonblog</groupId>
72 <artifactId>shop-service-provider</artifactId>
73 <version>0.0.1-SNAPSHOT</version>
74 </dependency>
75 </dependencies>
76 <repositories>
77 <repository>
78 <id>apache.snapshots.https</id>
79 <name>Apache Development Snapshot Repository</name>
80 <url>https://repository.apache.org/content/repositories/snapshots</url>
81 <releases>
82 <enabled>false</enabled>
83 </releases>
84 <snapshots>
85 <enabled>true</enabled>
86 </snapshots>
87 </repository>
88 </repositories>
89 <build>
90 <plugins>
91 <plugin>
92 <groupId>org.springframework.boot</groupId>
93 <artifactId>spring-boot-maven-plugin</artifactId>
94 </plugin>
95 </plugins>
96 </build>
97
98</project>
网上大部分资料都是基于application.properties配置,或者是基于xml配置dubbo的相关参数。而实际上,在Spring Boot工程中,
shop-service-provider:application.yml配置文件说明
1spring:
2 application:
3 name: shop-service-provider
4# log config
5logging:
6 config: classpath:log4j2.xml
7 level:
8 root: info
9 web: info
10 file: logs/shop-service-provider.log
11
12# Dubbo Application nacos
13## The default value of dubbo.application.name is ${spring.application.name}
14## dubbo.application.name=${spring.application.name}
15nacos:
16 service-address: 127.0.0.1
17 port: 8848
18dubbo:
19 registry:
20 address: nacos://${nacos.service-address}:${nacos.port}
21 protocol:
22 name: dubbo
23 port: 20881
24 scan:
25 base-packages: cn.raysonblog.*.service.impl
shop-service-consumer: application.yml说明
1server:
2 address:
3 port: 8081
4 servlet:
5 context-path: /
6 tomcat:
7 uri-encoding: UTF-8
8
9spring:
10 application:
11 name: shop-service-consumer
12
13# log config
14logging:
15 config: classpath:log4j2.xml
16 level:
17 root: info
18 web: info
19 file: logs/shop-service-provider.log
20
21# Dubbo Application nacos
22## The default value of dubbo.application.name is ${spring.application.name}
23## dubbo.application.name=${spring.application.name}
24nacos:
25 service-address: 127.0.0.1
26 port: 8848
27dubbo:
28 registry:
29 address: nacos://${nacos.service-address}:${nacos.port}
dubbo相关参数:也可以在DubboConfigurationProperties
类中查看
针对dubbo服务提供者,我没有单独把RpcShopService
接口单独放到一个子模块提供,建议在引用到实际项目中,可以单独提供接口包,在消费端直接引用接口包,这样就可以脱离服务提供者。
ShopServiceProviderApplication.java
启动主类
1package cn.raysonblog.shopserviceprovider;
2
3import org.apache.dubbo.config.spring.context.annotation.DubboConfigConfiguration;
4import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
5import org.springframework.boot.SpringApplication;
6import org.springframework.boot.autoconfigure.SpringBootApplication;
7
8import java.util.concurrent.CountDownLatch;
9
10/**
11 * dubbo 服务提供方
12 * @author raysonfang
13 * @公众号 Java技术干货(ID:raysonfang)
14 */
15@SpringBootApplication
16@EnableDubbo
17public class ShopServiceProviderApplication {
18
19 //使用jar方式打包的启动方式
20 private static CountDownLatch countDownLatch = new CountDownLatch(1);
21 public static void main(String[] args) throws InterruptedException{
22 SpringApplication.run(ShopServiceProviderApplication.class, args).registerShutdownHook();
23 countDownLatch.await();
24 }
25}
需要注意@EnableDubbo
这个注解,是开启Dubbo服务必要的。
RpcShopService.java
:暴露接口,供消费端使用
1package cn.raysonblog.shopserviceprovider.service;
2
3/**
4 * 提供暴露的Rpc接口
5 * @author raysonfang
6 */
7public interface RpcShopService {
8 String sayHello(String name);
9}
ShopServiceImpl.java
: 实现类
1package cn.raysonblog.shopserviceprovider.service.impl;
2
3import cn.raysonblog.shopserviceprovider.service.RpcShopService;
4import org.apache.dubbo.config.annotation.Service;
5
6/**
7 * 接口实现类
8 *
9 * ## @Service 这个注解是使用dubbo提供的,
10 * 这个注解中有很多属性,需要单独了解去进行配置
11 *
12 * @author raysonfang
13 */
14@Service
15public class ShopServiceImpl implements RpcShopService {
16
17 public String sayHello(String name) {
18 return name;
19 }
20}
1package cn.raysonblog.shopserviceconsumer;
2
3import cn.raysonblog.shopserviceprovider.service.RpcShopService;
4import org.apache.dubbo.config.annotation.Reference;
5import org.springframework.boot.SpringApplication;
6import org.springframework.boot.autoconfigure.SpringBootApplication;
7import org.springframework.web.bind.annotation.RequestMapping;
8import org.springframework.web.bind.annotation.RequestMethod;
9import org.springframework.web.bind.annotation.RestController;
10
11/**
12 *
13 * 把主类和controller写在一起,方便简单测试演示。
14 *
15 * @author raysonfang
16 */
17@SpringBootApplication
18@RestController
19public class ShopServiceConsumerApplication {
20 @Reference
21 RpcShopService shopService;
22
23 @RequestMapping(name = "/sayHello", method = RequestMethod.GET)
24 public String sayHello(){
25 return shopService.sayHello("Hello Dubbo Nacos!更多原创分享,技术交流,关注:Java技术干货(ID:raysonfang)");
26 }
27
28 public static void main(String[] args) {
29 SpringApplication.run(ShopServiceConsumerApplication.class, args);
30 }
31
32}
测试的时候,启动顺序
下载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。
解决:换成使用@EnableDubbo
。
解决:通过查看DubboConfigurationProperties.java
源码,去分析属性配置。
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
源代码放置Github: https://github.com/raysonfang/spring-boot-demo-all
欢迎大家star, 批评
我平常学习,编码也都会放置github上,欢迎持续关注交流。
我的github: https://github.com/raysonfang