Nacos (Spring Alibb Cloud)的使用 整合dubbo

Nacos 配置中心的使用(一些比较坑的点也会说明)

上一篇 Docker 安装 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=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值