Nacos 配置中心的使用(一些比较坑的点也会说明)
nacos-dubbo-consume
工程的gradle部分(想看类似的工程结构)这里的目的是告诉大家引用的是什么版本的nacos
plugins {
id 'org.springframework.boot' version '2.2.11.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
ext {
set('springCloudAlibabaVersion', "2.2.1.RELEASE")
}
dependencies {
implementation 'com.alibaba.cloud:spring-cloud-starter-dubbo'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
implementation project(':alibb-dubbo-mineserviceapi')//依赖同一个父模块的子模块
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
}
}
代码
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@SpringBootApplication
@DubboComponentScan
public class NacosDubboConsumeApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboConsumeApplication.class, args);
}
}
import com.alibaba.cloud.nacos.refresh.NacosContextRefresher;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.study.alibbdubbomineserviceapi.demo.NacosDemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Properties;
/**
* @Auther: jmx
* @Date: 2020/11/17
* @Description: NacosDubboApi
* @Version 1.0.0
*/
@RestController
@RequestMapping("/nacosdubbo")
//@NacosConfigurationProperties(dataId="nacos-dubbo-consume",autoRefreshed = true)这个没有效果
// 因为使用的是implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
// 要这个注解生效的话使用nacos-config-spring-boot-starter
@RefreshScope//开启nacos的动态刷新
public class NacosDubboApi {
@Reference(mock = "com.study.nacosdubboconsume.nacosdubbo.mock.NacosDubboMockProvider")
private NacosDemoService nacosDemoService;
//@NacosValue 没有效果
@Value(value = "${nacos.config.demo:defaultConfig}")
private String nacosConfig;
@Value(value = "${nacos.other.flag:true}")
private boolean flag;
@RequestMapping("/sayhello")
public String sayhello(){
return nacosDemoService.sayHello();
}
@RequestMapping("/nacosConfig")
public String nacosConfig(){
System.out.println(nacosConfig);
return nacosConfig;
}
@RequestMapping("/flag")
public boolean flag(){
System.out.println(flag);
return flag ;
}
}
import com.study.alibbdubbomineserviceapi.demo.NacosDemoService;
/**
* @Auther: jmx
* @Date: 2020/11/17
* @Description: NacosDubboMockProvider NacosDemoService服务方挂掉之后用得降级服务
* @Version 1.0.0
*/
public class NacosDubboMockProvider implements NacosDemoService {
public NacosDubboMockProvider() {
System.out.println("NacosDubboMockProvider 创建了");
}
@Override
public String sayHello() {
return "NacosDubboMockProvider say hello";
}
}
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Properties;
import java.util.concurrent.Executor;
//Nacos 的配置监听器
@Component
public class NacosListener {
// @NacosConfigListener(dataId = "nacos-other.yaml",type = ConfigType.YAML) 无效,nacos-config-spring-boot-starter中才有效
public void change(Properties value){
System.out.println("NacosListener.change:"+value);
}
@Autowired
private NacosConfigManager nacosConfigManager;
@Autowired
private NacosConfigProperties configProperties;
@PostConstruct
public void init(){
//可以改造成根据具体配置进行监听,这里就不搞了
try {
nacosConfigManager.getConfigService().addListener("nacos-other.yaml", configProperties.getGroup(),
new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("NacosListener:"+configInfo);
}
});
} catch (NacosException e) {
e.printStackTrace();
}
}
}
配置
bootstrap.properties
#bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,加载顺序
#因为需要启动的时候初始化(配置中心)配置,所以关于配置nacos的配置放在这,这样才能去nacos配置中心拿到相关的数据
#server.port=8085
# DataID属性的值为配置文件名格式为:${prefix}-${spring.profile.active}.${file-extension}
#nacos 配置中心配置的 dataId的命名得加上后缀
#在${prefix} 通过 spring.cloud.nacos.config.prefix 定义,没有定义的时候默认是spring.application.name
#spring.profile.active 当前的环境的配置,没有定义,则对应的连接符- 也不会存在->${prefix}.${file-extension}
#file-extension 配置文件的后缀,也代表了这个配置的配置内容的格式
# nacos 数据模型
#namespace命名空间->Group->services/dataId ,主要的目的都是为了数据隔离(配置的隔离)
#namespace:命名空间,对不同的环境(一定要求)进行隔离
#group:分组,将若干服务或配置集(配置文件)归为一组,通常这些服务或者配置有一定的共同点(按区分的要求)
#service:服务,一个提供服务的应用实例(比如java实例),不同namespace的不能相互调用
#dataId:配置或者一组配置的集合(配置文件)
spring.application.name=nacos-dubbo-consume
dubbo.application.name=nacos-dubbo-consume
dubbo.application.id=nacos-dubbo-consume
dubbo.protocol.name=dubbo
#spring.cloud.nacos.config.prefix=nacos-dubbo-consume
#spring.cloud.nacos.config.namespace=public
#spring.cloud.nacos.config.group=DEFULT_GROUP
spring.cloud.nacos.config.file-extension=yaml
dubbo.registry.address=spring-cloud://ip
spring.cloud.nacos.discovery.server-addr=ip:8848
spring.cloud.nacos.config.server-addr=ip:8848
dubbo.cloud.subscribed-services=nacos-dubbo-provider
#多个dataId
spring.cloud.nacos.config.extension-configs[0].data-id=nacos-other.yaml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
#NacosContextRefresher 刷新的监听器
application.properties
#这里的值会覆盖前面的boostrap.application的值
server.port=8088
nacos-dubbo-provider
gradle
plugins {
id 'org.springframework.boot' version '2.2.11.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
ext {
set('springCloudAlibabaVersion', "2.2.1.RELEASE")
}
dependencies {
implementation 'com.alibaba.cloud:spring-cloud-starter-dubbo'
// implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
implementation project(':alibb-dubbo-mineserviceapi')//依赖同一个父模块的子模块
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
}
}
jar {
baseName("nacos-dubbo-provider")
version("0.0.1")
manifest {
attributes "Manifest-Version": 1.0,
'Main-Class': 'com.study.nacosdubboprovider.NacosDubboProviderApplication'
}
}
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@DubboComponentScan
@EnableDiscoveryClient
public class NacosDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboProviderApplication.class, args);
}
}
```java
import com.study.alibbdubbomineserviceapi.demo.NacosDemoService;
import org.apache.dubbo.config.annotation.Service;
/**
* @Auther: jmx
* @Date: 2020/11/17 01:50
* @Description: NacosDubboProvider
* @Version 1.0.0
*/
@Service(cluster = "failfast",loadbalance="random",weight = 2)
public class NacosDubboProvider implements NacosDemoService {
@Override
public String sayHello() {
return "NacosDubboProvider say hello";
}
}
dubbo.application.name=nacos-dubbo-provider
dubbo.application.id=nacos-dubbo-provider
spring.application.name=nacos-dubbo-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=9100
dubbo.registry.address=spring-cloud://ip
spring.cloud.nacos.discovery.server-addr=ip:8848
dubbo.cloud.subscribed-services=