Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)

本文的思惟导图

本文原创首发于公众号:Java技术干货java

一、概述

本文将Nacos做为配置中心,实现配置外部化,动态更新。这样作的优势:不须要重启应用,即可以动态更新应用里的配置信息。在现在流行的微服务应用下,将应用的配置统一管理,显得尤其重要。git

上一篇写了《Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)》https://www.jianshu.com/p/b0dddce1d404,在文章中,nacos的角色是注册中心。github

本文也是在上一篇的基础上,继续学习和研究以Dubbo为微服务框架,nacos做为配置中心,应该如何进行实践。以及在此过程当中,遇到了什么样的问题,如何解决。web


二、nacos的必知必会

在进行编码以前,先看看当nacos做为配置中心时,操做界面是啥,有哪些新的知识点,须要咱们先去了解和掌握呢?以避免,在后面搭建环境时,全程懵逼。
nacos配置管理
新建配置spring

重要参数说明apache

Data Id
  1. Data Id的默认值为${nacos.config.prefix}-${spring.profile.active}.${nacos.config.file-extension}
  2. nacos.config.prefix的默认值为${spring.application.name}
  3. nacos.config.file-extension的默认值为properties
  4. spring.profiles.active未配置时,则匹配${spring.application.name}.properties
  5. 若设置了spring.profiles.active而Nacos中存在${spring.application.name}.properties时,若还存在${spring.application.name}-${spring.profiles.active}.properties,则默认匹配后者,若不存在,则会自动匹配前者
  6. 因为Nacos建议且默认用spring.application.name做为Data Id的前缀,若要在不一样服务中共享项目统一配置,则能够经过配置nacos.config.shared-dataidsnacos.config.refreshable-dataids来添加共享配置,前者不支持自动刷新,后者支持
Group
  1. 这是一个很灵活的配置项,并无固定的规定,能够用做多环境、多模块、多版本之间区分配置
Namespace
  1. 推荐使用命名空间来区分不一样环境的配置,由于使用profilesgroup会是不一样环境的配置展现到一个页面,而Nacos控制台对不一样的Namespace作了Tab栏分组展现,以下图:

命名空间ID

  1. 注意配置Namespace的时候不是经过名称,而是经过命名空间的ID(上图所示),可经过以下配置来设置服务使用的命名空间:
nacos:
  service-address: 127.0.0.1
  port: 8848
  config:
    server-addr: ${nacos.service-address}:${nacos.port}
    namespace: 9af36d59-2efd-4f43-8a69-82fb37fc8094  # 命名空间ID 不是命名空间名称

三、基础框架搭建

个人建议,尽量本身花点时间,在不熟悉的状况下,尽可能按照本身的想法思路,从零开始搭建一下,加深印象。在搭建过程当中,可能会遇到问题,此时不要慌(嘴上不说,内心却慌得狠)。但幸运的是,你遇到了我,能够联系,留言或关注我,一块儿交流。api

为了避免形成知识点的混淆,我将spring-boot-dubbo-nacos-demo的maven工程,源代码已同步于github,从新拷贝一份,项目从新命名为spring-boot-dubbo-nacos-configcenter-demo
app

直接拷贝过来,项目名变动,对应的pom.xml还须要修改一下

修改shop-service-provider和shop-service-consumer:的pom.xml
修改shop-service-provider的pom.xml
修改shop-service-consumer的pom.xml框架

按照上一篇文章的六、测试,看一下项目是否能正常启动,若是正常,咱们在开始整合nacos的配置中心。确保前面的功能都是正常的。maven


四、pom.xml说明

若是想nacos做为配置中心,须要在对应的maven工程中引入nacos-config-spring-boot-starter的依赖包,这里,将此依赖包在shop-service-provider和shop-service-consumer的项目中同时引入,这样能够方便服务提供者和服务消费者之间的测试。

这里就不把pom.xml的代码所有粘贴出来,你们想看的话,能够去上一篇文章中看。

pom.xml新增nacos-config-spring-boot-starter依赖

<!-- nacos config依赖 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.3</version>
        </dependency>

五、配置文件说明

shop-service-provider和shop-service-consumer的application.yml,增以下配置,启动项目,会和nacos建立链接

nacos:
  service-address: 127.0.0.1
  port: 8848
  config:
    server-addr: ${nacos.service-address}:${nacos.port}

相关配置参数,请参考com.alibaba.boot.nacos.config.properties.NacosConfigProperties.java
NacosConfigProperties


六、编写业务代码

6.一、shop-service-provider增长配置实体类NacosConfig.java

NacosConfig.java代码实现:

package cn.raysonblog.shopserviceprovider.config;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import lombok.Data;
import org.springframework.stereotype.Component;

/**
 * 从Nacos外部拉取配置, 修改配置,自动会刷新应用的配置
 *
 * @author raysonfang
 */
@NacosPropertySource(dataId = "rayson", autoRefreshed = true)
@Data
@Component
public class NacosConfig {

    @NacosValue(value = "${service.name:1}", autoRefreshed = true)
    private String serviceName;
}

注解说明:
@NacosPropertySource注解其中包含两个属性,以下:

  • dataId:这个属性是须要在Nacos中配置的Data Id。
  • autoRefreshed:为true的话开启自动更新。

在使用Nacos作配置中心后,须要使用@NacosValue注解获取配置,使用方式与@Value同样。

其中${service.name:1}的service.name是属性key, 1是默认值。

6.二、shop-service-provider将NacosConfig的信息暴露到接口中获取
package cn.raysonblog.shopserviceprovider.service.impl;

import cn.raysonblog.shopserviceprovider.config.NacosConfig;
import cn.raysonblog.shopserviceprovider.service.RpcShopService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 接口实现类
 *
 * ## @Service 这个注解是使用dubbo提供的,
 *             这个注解中有不少属性,须要单独了解去进行配置
 *
 * @author raysonfang
 */
@Service
public class ShopServiceImpl implements RpcShopService {

    @Autowired
    NacosConfig nacosConfig;

    public String sayHello(String name) {
        return name;
    }

    /**
     * 将nacos config的配置信息暴露给服务消费者
     * @param desc
     * @return
     */
    public String getConfigServiceName(String desc){
        return nacosConfig.getServiceName()+desc;
    }
}

RpcShopService.java接口新增getConfigServiceName()方法

package cn.raysonblog.shopserviceprovider.service;

/**
 * 提供暴露的Rpc接口
 * @author raysonfang
 */
public interface RpcShopService {
    String sayHello(String name);
    String getConfigServiceName(String desc);
}
6.三、shop-service-consumer新增接口方法/getConfig
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 不然会报错。
     */
  /*  @RequestMapping(name = "/sayHello", method = RequestMethod.GET)
    public String sayHello(){
        return shopService.sayHello("Hello Dubbo Nacos!更多原创分享,技术交流,关注:Java技术干货(ID:raysonfang)");
    }*/

    /**
     * Nacos config配置中心 获取配置信息 测试接口
     * @return
     */
    @RequestMapping(name = "/getConfig", method = RequestMethod.GET)
    public String getConfig(){
        return shopService.getConfigServiceName("更多原创分享,技术交流,关注:Java技术干货(ID:raysonfang)");
    }

    public static void main(String[] args) {
        SpringApplication.run(ShopServiceConsumerApplication.class, args);
    }

}

七、测试

项目启动顺序,这里再贴一下上一篇的图:
image

nacos还没配置信息时,输入http://localhost:8081/getConfig,显示的是默认值
显示默认值

去nacos控制台新增以下配置:
新增配置

新增成功!

刷新http://localhost:8081/getConfig,配置由1更新为hello nacos config-center!
hello nacos config-center


八、问题记录及解决

8.一、对于dataID的配置不清楚,当时我使用rayson.service,致使客户端解析错误。

解决:查看源码得知,在NacosUtils.java中,对dataId有解析,.后面的值至关于文件后缀名。故,若是须要配置,则配置成支持的文件后缀名。


九、后记

因为能力有限,如有错误或者不当之处,还请你们批评指正,一块儿学习交流!

源代码放置Github: https://github.com/raysonfang/spring-boot-demo-all

欢迎你们star, 批评

我日常学习,编码也都会放置github上,欢迎持续关注交流。
个人github: https://github.com/raysonfang

Java技术干货


文章推荐
1. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)

相关文章
相关标签/搜索