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


    本文的思维导图

    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

  • 相关阅读:
    汇编讲解(上)--逆向开发
    两数之和 II
    解析器模式--设计模式
    访问者模式--设计模式
    命令模式--设计模式
    ccf-201512-2 消除类游戏
    ccf-201503-2 数字排序
    移动端兼容和适配问题
    ccf-201409-2 画图
    ccf-201409-3 字符串匹配
  • 原文地址:https://www.cnblogs.com/werewolfBoy/p/11646252.html
Copyright © 2020-2023  润新知