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

本文的思維導圖

本文原創首發于公眾號:

1、概述

本文將Nacos作為配置中心,實現配置外部化,動態更新。這樣做的優點:不需要重啟應用,便可以動態更新應用里的配置信息。在如今流行的微服務應用下,將應用的配置統一管理,顯得尤為重要。

上一篇寫了《Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)》,在文章中,nacos的角色是注冊中心。

本文也是在上一篇的基礎上,繼續學習和研究以Dubbo為微服務框架,nacos作為配置中心,應該如何進行實踐。以及在此過程中,遇到了什么樣的問題,如何解決。


2、nacos的必知必會

在進行編碼之前,先看看當nacos作為配置中心時,操作界面是啥,有哪些新的知識點,需要我們先去了解和掌握呢?以免,在后面搭建環境時,全程懵逼。
nacos配置管理
新建配置

重要參數說明

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 不是命名空間名稱

3、基礎框架搭建

我的建議,盡可能自己花點時間,在不熟悉的情況下,盡量按照自己的想法思路,從零開始搭建一下,加深印象。在搭建過程中,可能會遇到問題,此時不要慌(嘴上不說,心里卻慌得狠)。但幸運的是,你遇到了我,可以聯系,留言或關注我,一起交流。

為了不造成知識點的混淆,我將spring-boot-dubbo-nacos-demo的maven工程,源代碼已同步于github,重新拷貝一份,項目重新命名為spring-boot-dubbo-nacos-configcenter-demo

直接拷貝過來,項目名變更,對應的pom.xml還需要修改一下

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

按照上一篇文章的6、測試,看一下項目是否能正常啟動,如果正常,我們在開始整合nacos的配置中心。確保前面的功能都是正常的。


4、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>

5、配置文件說明

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、編寫業務代碼

6.1、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.2、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.3、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);
    }

}

7、測試

項目啟動順序,這里再貼一下上一篇的圖:
image

nacos還沒配置信息時,輸入http://localhost:8081/getConfig,顯示的是默認值
顯示默認值

去nacos控制臺新增如下配置:
新增配置

新增成功!

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


8、問題記錄及解決

8.1、對于dataID的配置不清楚,當時我使用rayson.service,導致客戶端解析錯誤。

解決:查看源碼得知,在NacosUtils.java中,對dataId有解析,.后面的值相當于文件后綴名。故,如果需要配置,則配置成支持的文件后綴名。


9、后記

由于能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

源代碼放置Github:?

歡迎大家star, 批評

我平常學習,編碼也都會放置github上,歡迎持續關注交流。
我的github:?

Java技術干貨


文章推薦

posted @ 2019-10-14 16:05 Java技術干貨 閱讀(...) 評論(...) 編輯 收藏