什么是nacos:
acos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、
动态配置服务(可以做配置中心)、动态 DNS 服务。
官方介绍是这样的:
Nacos 致力于帮助您发现、配置和管理微服务。
Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施
nacos作为dubbo注册中心:
nacos的安装个使用这里忽略
案例采用Spring-boot2.2.1 和最新版dubbo2.7.7,以及nacos2.2.1
为什么使用Spring-boot-2.2.1
因为目前为止nacos的版本最高为2.2.1为了jar不冲突和统一管理,所以全部统一采用2.2.1版本为主
为什么使用dubbo-2.7.7
dubbo-2.7.7是比较了2.6.X和最新版dubbo-2.8.x之后选择的中间板,dubbo-2.5.x不能满足一些注解的要求,案例中将传统的配置文件xml全部替换成注解和nacos统一配置中心的模式。
项目结构:
depend-nacos-api-project --》api
depend-nacos-consumer-project --》消费者
depend-nacos-project --》提供者
创建depend-nacos-api-project
创建接口INacosService-test
public interface INacosService {
String test();
}
创建提供者:depend-nacos-project
提供者pom.xml文件
<!--boot版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusions>
</dependency>
<!--nacos 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--nacos 注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo-spring-boot依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo-nacos注册中心 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.7</version>
<exclusions>
<exclusion>
<artifactId>nacos-client</artifactId>
<groupId>com.alibaba.nacos</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
在Spring-boot中加载文件的优先级别大家都知晓,这里不做说明。
创建项目bootstrap.yml
server:
port: 8300
nacos:
port: 8848
service-address: 127.0.0.1
namespace: 06bba7ee-604e-4eb9-baf0-0c71ef4a08d7 # 命名空间ID 不是命名空间名称
spring:
application:
name: depend-nacos-project
cloud:
nacos:
discovery:
server-addr: ${nacos.service-address}:${nacos.port} #nacos注册地址
namespace: ${nacos.namespace}
config:
server-addr: ${nacos.service-address}:${nacos.port} # 主配置服务器地址
group: DEV_GROUP #指定GroupId 默认可以不用填写
namespace: ${nacos.namespace} # 根据自己nacos server生成的命名空间ID进行修改
file-extension: yaml # 主配置 配置文件类型
extension-configs:
- data-id: common-dubbo.yaml
group: COMMON_GROUP
refresh: true # 是否动态刷新,默认为false
###
#配置的优先级:
# Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
# A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
# B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
# C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
# 当三种方式共同使用时,他们的一个优先级关系是:A < B < C
###
#dubbo:
# service:
# version: 1.0.0 #加入隔离版本号
# application:
# name: depend-nacos-project
# registry:
# address: nacos://127.0.0.1:8848?namespace=9c14c74f-eb62-4287-9c11-763fc098394e
# protocol:
# name: dubbo
# scan:
# base-packages: com.cailu.nacos.service.impl
创建serviceimpl实现类
NacosServiceImpl
@DubboService(version = "${dubbo.service.version}")
public class NacosServiceImpl implements INacosService {
@Autowired
private NacosConfig nacosConfig;
@Override
public String test() {
String str = nacosConfig.getServerName();
return str;
}
}
注意:这里使用的是@DubboService注解,在dubbo2.6之后,注解改名为@DubboService
创建公共配置文件:NacosConfig
@Configuration
@RefreshScope //Nacos 动态刷新配置
@Getter
public class NacosConfig {
@Value("${school.location}")
private String serverName;
}
注意:这里的@Value("${school.location}")细心的朋友会发现,在bootstrap.yml文件中,
没有这个属性,这个属性会在统一配置中心nacos中配置,后面会说到
创建启动类MyNacosApplication
@EnableDiscoveryClient //启用nacosz注册客户端
@SpringBootApplication
public class MyNacosApplication implements CommandLineRunner {
/**
* 日志
*/
private Logger logger = (Logger) LoggerFactory.getLogger(this.getClass());
/**
* 功能描述 启动项
* @param args args
* @author cailu
* @date 2020/3/27 0:31
*/
public static void main(String[] args) {
SpringApplication.run(MyNacosApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
logger.info("== depend-nacos-project 服务启动成功!==");
}
下面就来说说nacos和bootstrap.yml文件中的配置信息的关联关系
spring.cloud.nacos.discovery.server-addr 是nacos注册地址
spring.cloud.nacos.discovery.namespace 是nacos配置管理中的KEY
spring.cloud.nacos.config.server-addr 是配置文件地址,和spring.cloud.nacos.discovery.server-addr一样
spring.cloud.nacos.config.group 是nacos中的组名称,可以自定义,也可以默认
spring.cloud.nacos.config.extension-configs 和spring.cloud.nacos.config.shared-configs以及本身的bootstrap.yml的关系是
###
#配置的优先级:
# Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
# A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
# B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
# C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
# 当三种方式共同使用时,他们的一个优先级关系是:A < B < C
###
接下来就在nacos中创建配置文件:
文件名字为你bootstrap.yml中:spring.application.name属性, 格式yaml
组别为你bootstrap.yml中spring.cloud.nacos.config.group的名字,一定要对应
注意这里只添加了dubbo的扫描类,其他dubbo信息在公共配置文件中,为什么要配置公共dubbo呢
为什么要配置公共dubbo呢?
因为在消费者中也需要用到dubbo的配置信息,为了方便管理和维护,配置文件统一为一个公共dubbo配置文件
文件名字为你bootstrap.yml中spring.cloud.nacos.config.extension-configs中的各个属性
我这里在bootstrap.yml保留了dubbo的配置信息,注销掉的dubbo部分就是为nacos上的配置信息
到这里 提供端的配置就完成了
接下来配置消费端
消费端的bootstrap.yml配置文件
bootstrap.yml:
server:
port: 8301
nacos:
port: 8848
service-address: 127.0.0.1
namespace: 06bba7ee-604e-4eb9-baf0-0c71ef4a08d7 # 命名空间ID 不是命名空间名称
spring:
application:
name: depend-nacos-consumer-project
cloud:
nacos:
discovery:
server-addr: ${nacos.service-address}:${nacos.port} #nacos注册地址
namespace: ${nacos.namespace}
config:
server-addr: ${nacos.service-address}:${nacos.port} # 主配置服务器地址
group: DEV_GROUP #指定GroupId 默认可以不用填写
namespace: ${nacos.namespace}
extension-configs:
- data-id: common-dubbo.yaml
group: COMMON_GROUP
refresh: true # 是否动态刷新,默认为false
注意看消费端的dubbo配置信息 在extension-configs:中 只需要直接引入nacos中的公共配置common-dubbo.yaml配置文件,就什么都不需要了,这样既方便有省事,还降低了维护成本,这就是上面所说的公共配置
消费端的代码就不写了,直接调用就OK了,但是要注意的是在消费端的service中用的注解需要注意
消费端的service:
NacosConsumerServiceImpl:
@Service
public class NacosConsumerServiceImpl implements INacosConsumerService {
@DubboReference(version = "${dubbo.service.version}", check = false)
private INacosService nacosService;
@Override
public String test() {
return nacosService.test();
}
}
消费端使用的是@DubboReference,为了启动不报错,设置 check = false
完整的dubbo用nacos做为注册中心和配置中心就建立完毕了