nacos
服务安装
-
去github官网下载最新的zip包并解压https://github.com/alibaba/nacos/releases
-
在根目录执行如下命令:
mvn -Prelease-nacos -DskipTests clean install -U
-
nacos\distribution\target下游需要的包,解压
-
进入解压目录
cd bin
-
修改startup.cmd文件为standalone模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AEBq2GMt-1620884418572)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20210508103556235.png)]
- 双击startup.cmd启动
nacos使用
/**
* 1、如何使用nacos作为配置中心统一管理
* 1)、引入依赖
* <dependency>
* <groupId>com.alibaba.cloud</groupId>
* <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
* </dependency>
* 2)、创建一个bootstrap.properties,配置如下两项
* spring.cloud.nacos.config.server-addr=127.0.0.1:8848
* spring.application.name=mall-coupon
* 3)、需要给配置中心默认添加一个叫数据集(Data Id)mall-coupon.properties,默认规则:应用名.properties
* 4)、给应用名.properties添加任何配置
* 5)、动态获取配置
* @RefreshScope:动态获取并刷新配置
* @Value(""${配置项的名}):获取到配置
* 如果配置中心和当前项目的配置文件都配置了相同的项,优先使用中心的配置
* 2、细节
* 1)、命名空间:配置隔离
* 默认:public(保留空间),默认新增的所有配置都在public空间
* 1.1)、 开发、测试、生产利用命名空间做环境隔离
* 注意:在bootstrap.properties配置上、需要使用哪个命令名空间下的配置
* spring.cloud.nacos.config.namespace=1b0191f0-19f3-4784-a8b1-474c5d3d244a[命名空间的id]
* 1.2)、每一个微服务之间互相隔离,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
* 2)、配置集:所有配置的集合
* 3)、配置集ID:类似文件名
* DataId:类似文件名
* 4)、配置组
* 默认所有的配置集都属于:DEFAULT_GROUP
* 每个微服务创建自己的命名空间,使用配置分组区分环境配置:test、prod、test
* 5)、同时加载多个配置集
* 5.1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
* 5.2)、只需要在bootstrap.properties说明加载哪些配置文件即可
*/
版本关系
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
<!--服务注册|发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
@Configuration
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
// 该类在AutoServiceRegistrationConfiguration,AutoServiceRegistrationAutoConfiguration之后自动配置,
AutoServiceRegistrationConfiguration对应的是
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
AutoServiceRegistrationAutoConfiguration.class })
public class NacosDiscoveryAutoConfiguration {
// 1. nacos服务注册
@Bean
public NacosServiceRegistry nacosServiceRegistry(
NacosDiscoveryProperties nacosDiscoveryProperties) {
return new NacosServiceRegistry(nacosDiscoveryProperties);
}
// 2. nacos注册
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosRegistration nacosRegistration(
NacosDiscoveryProperties nacosDiscoveryProperties,
ApplicationContext context) {
return new NacosRegistration(nacosDiscoveryProperties, context);
}
// 3. nacos自动服务注册
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosAutoServiceRegistration nacosAutoServiceRegistration(
NacosServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
NacosRegistration registration) {
return new NacosAutoServiceRegistration(registry,
autoServiceRegistrationProperties, registration);
}
}
NacosDiscoveryProperties {
serverAddr = '127.0.0.1:8848',
endpoint = '',
namespace = '',
watchDelay = 30000,
logName = '',
service = 'mall-coupon',
weight = 1.0,
clusterName = 'DEFAULT',
namingLoadCacheAtStart = 'false',
metadata = {
preserved.register.source = SPRING_CLOUD
},
registerEnabled = true,
ip = '192.168.1.7',
networkInterface = '',
port = -1,
secure = false,
accessKey = '',
secretKey = ''
}
namingService {
namespace: "public",
endpoint: "",
serverList: "127.0.0.1:8848",
cacheDir; "C:\Users\admin/nacos/naming/public",
logName: "naming.log"
hostReactor:
beatReactor:
eventDispatcher;
serverProxy: {
serverPort: 8848,
namespaceId: "public",
endpoint: "",
nacosDomain: "127.0.0.1:8848",
serverList: [
"127.0.0.1:8848"
],
serversFromEndpoint: [],
lastSrvRefTime: 0,
vipSrvRefInterMillis: 30000,
properties: {
}
}
}
instance实例是怎么来的?
com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register
this.nacosDiscoveryProperties = nacosDiscoveryProperties;
this.namingService = nacosDiscoveryProperties.namingServiceInstance();
Instance instance = getNacosInstanceFromRegistration(registration);
@PostConstruct public void init() { Map<String, String> metadata = nacosDiscoveryProperties.getMetadata(); Environment env = context.getEnvironment(); String endpointBasePath = env.getProperty(MANAGEMENT_ENDPOINT_BASE_PATH); if (!StringUtils.isEmpty(endpointBasePath)) { metadata.put(MANAGEMENT_ENDPOINT_BASE_PATH, endpointBasePath); } Integer managementPort = ManagementServerPortUtils.getPort(context); if (null != managementPort) { metadata.put(MANAGEMENT_PORT, managementPort.toString()); String contextPath = env .getProperty("management.server.servlet.context-path"); String address = env.getProperty("management.server.address"); if (!StringUtils.isEmpty(contextPath)) { metadata.put(MANAGEMENT_CONTEXT_PATH, contextPath); } if (!StringUtils.isEmpty(address)) { metadata.put(MANAGEMENT_ADDRESS, address); } } if (null != nacosDiscoveryProperties.getHeartBeatInterval()) { metadata.put(PreservedMetadataKeys.HEART_BEAT_INTERVAL, nacosDiscoveryProperties.getHeartBeatInterval().toString()); } if (null != nacosDiscoveryProperties.getHeartBeatTimeout()) { metadata.put(PreservedMetadataKeys.HEART_BEAT_TIMEOUT, nacosDiscoveryProperties.getHeartBeatTimeout().toString()); } if (null != nacosDiscoveryProperties.getIpDeleteTimeout()) { metadata.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, nacosDiscoveryProperties.getIpDeleteTimeout().toString()); } }