Nacos

Nacos介绍

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称,⼀个更易于构
建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。
在这个介绍中,可以看出Nacos⾄少有三个核⼼功能:
1. 动态服务发现
2. 配置管理
3. 服务管理
后续会分别来介绍这三个功能是怎么回事。

下载和解压

教程制作时,Nacos的最新发⾏版为 2 . 1 . 1 (Aug 8 th, 2022 ) (本教程就是基于这个版本),官⽅ 当前推荐的稳定版本为2 . 0 . 3
查看最新Nacos发⾏版: https://github.com/alibaba/nacos/releases
并且可以在此⽹⻚上下载安装包:

下载完了之后进⾏解压,解压之后的⽬录为:  

 

1. bin⽬录下是启动和停⽌的脚本
2. conf⽬录下是Nacos的配置⽂件
3. target⽬录下是Nacos的jar包(启动脚本中其实就是运⾏的这个jar包,停⽌脚步中是直接kill到进
程)

启动

解压完之后就可以启动Nacos了,Nacos⽀持单机和集群,默认是以集群模式启动,通过添加 -m
standalone就会以单机模式启动。

Linux/Unix/Mac

启动命令(standalone代表着单机模式运⾏,⾮集群模式):
sh startup.sh -m standalone

如果您使⽤的是ubuntu系统,或者运⾏脚本报错提示[[符号找不到,可尝试如下运⾏:

bash startup.sh -m standalone

 

Windows

启动命令(standalone代表着单机模式运⾏,⾮集群模式):
startup.cmd -m standalone

 启动⽇志

可以发现,默认情况下Nacos占⽤了 8848 端⼝。
我们可以访问 http://localhost: 8848 /nacos ,来访问Nacos:

 默认的⽤户名和密码为:nacos/nacos

登录进来后:

 

这个⽹⻚相当于nacos的管理台,有:
1. 配置管理
2. 服务管理
3. 权限控制
4. 命名空间
5. 集群管理

配置管理

配置,其实就是⼀个key:value,⽐如
spring . datasource . username = zhouyu
spring . datasource . password = 123456
并且我们通常会把这些配置写在application.properties或application.yml⽂件中,当时通过这种⽅式⼀定配置发⽣了改变就需要重启应⽤,并且通过这种⽅式配置的配置项仅限于当前应⽤,⽽不能做到多个应⽤共享。
那么nacos的配置管理功能就是来解决这些问题的,我们可以直接通过nacos管理台来新增配置,并且这些配置能够被多个应⽤给使⽤到。

新建配置

新建配置时可以指定:
1. Data ID:相当于⼀个配置⽂件,⽐如相当于application.properties,或者application
dev.properties,不过要注意的是,我们在某个项⽬中使⽤application.properties⽂件中,那个
application表示的就是当前应⽤,那我们在nacos进⾏配置时,就要尽可能的取⼀些有含义的Data
ID,⽐如user.properties(表示⽤户应⽤的配置),order.properties(表示订单应⽤的配置),
common.properties(表示多个应⽤共享的配置)。
2. Group:在nacos中,⼀个Data ID,也就是⼀个或多个配置⽂件可以归类到同⼀个Group中,Group的作⽤就是⽤来区分Data ID相同的情况,不同的应⽤或中间件使⽤了相同的Data ID时就可以通过Group来进⾏区分,默认为DEFAULT_GROUP
3. 配置内容:写具体的配置项,可以⽤properties的格式,也可以⽤yaml的格式
⽐如:

 

拉取配置

在nacos中新建完配置后,那作为⼀个SpringBoot应⽤我们如何来获取配置呢?

Java SDK

⾸先,我们可以直接使⽤Nacos提供的Java SDK来获取配置。
⾸先在项⽬中,添加如下依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>

然后可以使⽤如下代码来获取nacos中的配置:

try {
String serverAddr = "localhost:8848";
String dataId = "user.properties";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(propert
ies);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
1. serverAddr:nacos的地址
2. dataId:想要获取的配置⽂件的名字
3. group:分组
在Java SDK中,除开有获取配置的API,同时也提供了新增、删除、监听配置的API。
我们可以通过如下代码来监听配置的变化:
try {
String serverAddr = "localhost:8848";
String dataId = "user.properties";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(propert
ies);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {
public void receiveConfigInfo(String configInfo) {
System.out.println("recieve1:" + configInfo);
}
public Executor getExecutor() {
return null;
}
});
// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。 正式代
//码中⽆需下⾯代码
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
剩余API,⼤家可以直接参考官⽹: https://nacos.io/zh-cn/docs/sdk.html

Spring

在真正开发时,我们不太会通过Java SDK的⽅式来拉取nacos中的配置,那Nacos有没有针对Spring提供⼀些⽐较好⽤的注解或API呢?
当然是有的。
增加⼀下依赖(不再需要nacos-client依赖了)
<dependency>
 <groupId>com.alibaba.nacos</groupId>
 <artifactId>nacos-spring-context</artifactId>
 <version>1.1.1</version>
</dependency>
我们可以按以下⽅式来配置Spring容器:
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.
0.1:8848"))
@NacosPropertySource(dataId = "user.properties", autoRefreshed = true)
@ComponentScan("com.zhouyu")
public class AppConfig {
}
很明显,通过@EnableNacosConfig注解定义了nacos的地址,通过@NacosPropertySource表示想要拉取的dataId,并且设置⾃动刷新(也就是配置发⽣了改变则会⾃动⽣效)。
那如何使⽤某⼀个具体的配置项呢:
@Component
public class UserService {
 @NacosValue("${spring.datasource.username}")
 private String username;
 public void test(){
 System.out.println(username);
 }
}
可以通过@NacosValue来使⽤某⼀具体的配置项,那@Value⾏不⾏呢?也是可以的。
之所以可以,原因是@EnableNacosConfig注解会负责把指定的dataId的配置项拉取到应⽤,并封装为PropertySource对象添加到Environment对象中,所以@Value也能读取到相应的配置项。

SpringBoot

如果我们使⽤SpringBoot,那则可以⽐Spring更加简单。
⾸先引⼊依赖:
<dependency>
 <groupId>com.alibaba.boot</groupId>
 <artifactId>nacos-config-spring-boot-starter</artifactId>
 <version>0.2.12</version>
</dependency>
然后在application.properties中配置nacos的地址:
nacos.config.server-addr=127.0.0.1:8848
然后:
@SpringBootApplication
@NacosPropertySource(dataId = "user.properties", autoRefreshed = true)
public class UserApplication {
 public static void main(String[] args) {
 ConfigurableApplicationContext applicationContext = SpringApplicat
ion.run(UserApplication.class, args);
 UserService userService = applicationContext.getBean(UserService.c
lass);
 userService.test();
 }
}
依旧使⽤@NacosPropertySource来指定要拉取的配置dataId即可,就可以使⽤@Value或@NacosValue来获取某个具体的配置项了。
那有同学可能会想到,我们可不可以直接在application.properties⽂件中来配置dataid呢?确实可以:
nacos.config.server-addr =127.0.0.1:8848
nacos.config.data-id =user.properties
nacos.config.bootstrap.enable =true

 不过要注意,⼀定得把nacos.config.bootstrap.enable设置为true,不然是不⾏的。

SpringCloud

如果我们是⽤SpringCloud,那将⽐SpringBoot更加简单。
引⼊依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
然后在boostrap.properties⽂件中配置:
spring.application.name =user
spring.cloud.nacos.server-addr =127.0.0.1:8848
就可以了,因为会⾃动去连接nacos并获取dataid为user.properties的配置了。
到这⾥,我们⼤概知道了Nacos的配置管理是怎么⽤的了,接下来我们再来介绍⼀些配置管理更⾼级的功能。

按profile拉取配置

在使⽤spring-cloud-starter-alibaba-nacos-config时,我们除开可以配置
spring.cloud.nacos.config.server-addr外,还可以配置:
1. spring.cloud.nacos.config.group:默认为"DEFAULT_GROUP"
2. spring.cloud.nacos.config.file-extension:默认为"properties"
3. spring.cloud.nacos.config.prefix:默认为${spring.application.name}
所以,默认情况下,会拉取"DEFAULT_GROUP"组下dataid为user.properties的配置,不过通过看源码:
// com.alibaba.cloud.nacos.client.NacosPropertySourceLocator#loadApplicati
onConfiguration
private void loadApplicationConfiguration(
CompositePropertySource compositePropertySource, String dataIdPrefix,
NacosConfigProperties properties, Environment environment) {
String fileExtension = properties.getFileExtension();
String nacosGroup = properties.getGroup();
// 1
// load directly once by default
loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGro
up,
 fileExtension, true);
// 2
// load with suffix, which have a higher priority than the default
loadNacosDataIfPresent(compositePropertySource,
 dataIdPrefix + DOT + fileExtension, nacosGroup,
fileExtension, true);
// 3
// Loaded with profile, which have a higher priority than the suffix
for (String profile : environment.getActiveProfiles()) {
String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtensio
n;
loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup
,
 fileExtension, true);
}
}
可以发现,在拉取配置时会分为三步:
1. 拉取dataid为user的配置
2. 拉取dataid为user.properties的配置
3. 拉取dataid为user-${ spring.profiles.active }.properties的配置
并且优先级依次增⾼。
还值得注意的是,在拉取配置时,还会加上namespace这个维度取获取配置,可以通过
spring.cloud.nacos.config.namespace进⾏配置。
我们可以在Nacos管理台:
1. 新建不同的namespace
2. 在每个namespace下可以进⾏dataid名称相同的配置
3. 每个dataid⼜可以分配到不同的group下
相当于⼀个三层结构

 

拉取多个配置

⼀个应⽤可能不⽌需要⼀个配置,有时可能需要拉取多个配置,此时可以利⽤
1. spring.cloud.nacos.config.extension-configs[ 0 ]. data-id = datasource.properties
2. spring.cloud.nacos.config.shared-configs[ 0 ]. data-id = common.properties
extension-configs表示拉取额外的配置⽂件,shared-configs也表示拉取额外的配置⽂件,只不过:
1. extension-configs表示本应⽤特有的
2. shared-configs表示多个应⽤共享的
注意优先级:
extension-configs[ 2 ] > extension-configs[ 1 ] > extension-configs[ 0
shared-configs[ 2 ] > shared-configs[ 1 ] > shared-configs[ 0 ]
主配置 > extension-configs > shared-configs

配置的⾃动刷新

默认情况下,主配置会⾃动刷新,extension-configs和shared-configs不会⾃动刷新 ,可以通过
spring.cloud.nacos.config.refresh-enabled=false来关闭主配置的⾃动刷新。
⾃动配置的意思是,⼀旦应⽤中引⼊的配置发⽣了变化,应⽤端也能及时获取到最新值。
值得注意的是,尽管默认情况下会⾃动刷新,但是对于通过@Value的使⽤⽅式,还需要在该Bean上加上 @RefreshScope注解,这样才能动态的修改@Value属性,达到动态更新的最终效果。

历史版本回滚

可以回滚某个配置到历史版本

监听查询

监听某个配置哪些应⽤在使⽤

服务管理

服务管理核⼼就是:
1. 服务注册
2. 服务发现
通过nacos的服务注册与发现,可以使得在调⽤微服务时可以更加简单。

Java SDK

服务注册

⾸先,我们可以直接使⽤Nacos提供的Java SDK来进⾏服务注册。
⾸先在项⽬中,添加如下依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>
我们可以使⽤如下代码来快速的进⾏服务注册:
NamingService naming = NamingFactory.createNamingService("localhost:8848");
naming.registerInstance("app1", "11.11.11.11", 8888);
以上代码表示注册⼀个服务:
1. 服务名字为app 1
2. 访问该服务的地址为: 11 . 11 . 11 . 11 8888
注意执⾏完上述代码后,不要上线程停掉,可以加上:
System.in.read();
运⾏为代码后,就可以到Nacos管理台看到:
可以发现,⼀个服务下:
1. ⼀个服务可以属于某⼀个组,可以在注册时指定group
2. ⼀个服务下可以有多个实例
3. ⼀个服务下多个实例可以分为多个虚拟集群
⽐如以下代码就注册了⼀个服务有三个实例,分别属于两个虚拟集群
NamingService naming = NamingFactory.createNamingService("localhost:8848")
;
naming.registerInstance("app1", "11.11.11.11", 8888, "cluster1");
NamingService naming1 = NamingFactory.createNamingService("localhost:8848"
);
naming1.registerInstance("app1", "11.11.11.12", 8888, "cluster1");
NamingService naming2 = NamingFactory.createNamingService("localhost:8848"
);
naming2.registerInstance("app1", "11.11.11.13", 8888, "cluster2");
System.in.read();
对应的管理台展示为:

 详情如下:

 我们也可以使⽤更加定制化的⽅式来注册服务:

NamingService naming = NamingFactory.createNamingService("localhost:8848")
;
Instance instance = new Instance();
instance.setIp("55.55.55.55");
instance.setPort(9999);
instance.setHealthy(false);
instance.setWeight(2.0);
Map<String, String> instanceMeta = new HashMap<String, String>();
instanceMeta.put("site", "et2");
instance.setMetadata(instanceMeta);
naming.registerInstance("app1", instance);
System.in.read();
以上代码注册了⼀个不健康的实例,并且设置了权重和元数据, 对应的管理台效果为:

 服务发现

服务注册之后,服务消费者就可以来使⽤了,我们可以使⽤如下api来获取某个服务的所有实例信息

NamingService naming = NamingFactory.createNamingService("localhost:8848");
System.out.println(naming.getAllInstances("app1"));
也可以获取所有健康的实例
naming.selectInstances("app1", true)
可以直接某⼀个健康的实例(权重随机算法)
naming.selectOneHealthyInstance("app1")
通常,作为服务消费者,还需要监听服务实例化的变化,我们可以使⽤如下api来监听变化:
NamingService naming = NamingFactory.createNamingService("localhost:8848");
naming.subscribe("app1", event -> {
if (event instanceof NamingEvent) {
System.out.println(((NamingEvent) event).getServiceName());
System.out.println(((NamingEvent) event).getInstances());
}
});
以上是Nacos提供了Java SDK的常⽤API,熟悉这些API能更好的理解或深⼊研究Nacos。

Spring/SpringBoot

直接使⽤Java SDK的⽅式来进⾏服务注册和发现⽐较麻烦,不过⽬前在Spring和SpringBoot中使⽤也不怎么⽅便,可以⾃⾏参考官⽹的教程: https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

SpringCloud

我们直接来看SpringCloud中如何使⽤Nacos来进⾏服务注册和发现
⾸先添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>

服务提供者

在服务提供者的application.properties中配置:
server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
使⽤@EnableDiscoveryClient来开启服务注册
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) throws IOException {
SpringApplication.run(UserApplication.class, args);
}
}
启动应⽤,就能完成服务注册:

服务消费者 

也是先添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
再配置应⽤的application.properties⽂件:
server.port =8080
spring.application.name =service-consumer
spring.cloud.nacos.discovery.server-addr =127.0.0.1:8848

 然后使⽤@EnableDiscoveryClient开启服务发现:

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
然后通过定义⼀个 RestTemplate来发现http请求,并使⽤@LoadBalanced
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
然后来使⽤RestTemplate调⽤服务:
@RestController
public class ConsumerController {
 @Autowired
 private RestTemplate restTemplate;
 @GetMapping(value = "/test")
 public String echo() {
 return restTemplate.getForObject("http://service-provider/test", S
tring.class);
 }
}
可以发现在SpringCloud中使⽤Nacos还是⽐较⽅便的。

⾼级功能

接下来我们再来看看Nacos服务管理中⼀些⽐较⾼级的功能

临时实例与持久实例

默认情况下,注册给nacos的实例都是临时实例,临时实例表示会通过客户端与服务端之间的⼼跳来保活,默认情况下,客户端会每隔5 s发送⼀次⼼跳。
public static final long DEFAULT_HEART_BEAT_INTERVAL = TimeUnit.SECONDS.toM
illis(5);
在服务端测,如果超过 15 s没有收到客户端的⼼跳,那么就会把实例标记为不健康状态
public static final long DEFAULT_HEART_BEAT_TIMEOUT = TimeUnit.SECONDS.toMi
llis(15);
在服务端测,如果超过 30 s没有收到客户端的⼼跳,那么就会删除实例
public static final long DEFAULT_IP_DELETE_TIMEOUT = TimeUnit.SECONDS.toMil
lis(30);
⽽对于持久实例,就算服务实例下线了,那么也不会被删除,我们可以通过:
spring.cloud.nacos.discovery.ephemeral=false 1
来配置为持久实例,表示实例信息会持久化到磁盘中去。
那什么时候⽤持久实例呢?我们可以发现持久实例与临时实例的区别在于,持久实例会永远在线,⽽临时实例不会,所以如果消费端在某种情况下想拿到已经下线的实例的实例信息,那么就可以把实例注册为持久实例。

保护阈值

在使⽤过程中,我们可以设置⼀个 0 - 1 的⼀个⽐例,表示如果服务的所有实例中,健康实例的⽐重低于这个⽐重就会触发保护,⼀旦触发保护,在服务消费端侧就会把所有实例拉取下来,不管是否健康,这样就起到了保护的作⽤,因为正常来说消费端只会拿到健康实例,但是如果健康实例占总实例⽐例⽐较⼩了,那么就会导致所有流量都会压到健康实例上,这样仅剩的⼏个健康实例也会被压垮,所以只要触发了保护,消费端就会拉取到所有实例,这样部分消费端仍然会访问到不健康的实例从⽽请求失败,但是也有⼀部分请求能访问到健康实例,达到保护的作⽤。
在SpringCloud Tencent中,这个功能叫“全死全活”。

权重

⼀个服务的多个实例,可能对应的机器配置不同,所以我们可以给不同的实例设置不同的权重,⽐如 

 

8070 这个实例设置了权重为 2 ,这样它的权重就是 8071 的两倍,那么就应该要承受 2 被的流量。
不过我们在消费⼀个服务时,通常是通过ribbon来进⾏负载均衡的,所以默认情况下nacos配置的权重是起不到作⽤的,因为ribbon使⽤的是⾃⼰的负载均衡策略,⽽如果想要⽤到nacos的权重,可以:
@Bean
public IRule ribbonRule() {
return new NacosRule();
}
这样就会利⽤到nacos中所配置的权重了。

Cluster(就近访问)

⼀个服务下会有多个实例,在nacos中,可以将这些实例指定到不同的集群中,⽐如可以通过:
spring.cloud.nacos.discovery.cluster-name=bj
这种⽅式来指定当前实例属于哪个集群,⽐如:

 hz集群只有⼀个8070的实例,bj集群有80718072两个实例。

此时在服务消费端,也可以配置:
spring.cloud.nacos.discovery.cluster-name=bj
使得服务调⽤者也在bj集群,那么此时服务消费者就只会调⽤到bj集群中的两个实例。
如果消费端没有配置cluster-name,那么则会使⽤所有集群。

集群部署

在前⾯,我们都是使⽤的单机模式部署的nacos服务端的,为了保证nacos的⾼可⽤,也就是保证配置中⼼和注册中⼼的⾼可⽤,通常我们都需要以集群的⽅式来部署nacos server。
⾸先,我们修改conf/cluster⽂件,把nacos集群中所有的节点的ip和port配置进去:
192.168.65.46:8848
192.168.65.46:8858
192.168.65.46:8868
我这⾥是在我本机搭集群,所以ip地址⼀样,端⼝得不⼀样,如果⼤家是在多个机器上搭机器,则ip地址不⼀样,端⼝可以⼀样,也可以不⼀样,通常是⼀样(8848 )。
如果多个机器来搭集群,那么这么配置⼀下就可以了,注意每个机器上得cluster⽂件都要配,表示每个nacos节点都得知道⾃⼰所在集群的节点情况。
我这⾥在本地搭,就需要多⼏个步骤。
先复制三份 

每个⽂件夹的内容都是如下

 

 分别修改三个cluster⽂件的内容都为:

192.168.65.46:8848
192.168.65.46:8858
192.168.65.46:8868
再分别修改三个application.properties中的server.port为 8848 8858 8868
然后通过cmd分别进去三个⽂件夹中的bin⽬录,运⾏:
startup.cmd -p embedded
来启动三个节点
启动成功后

 

然后我们就可以通过: http://localhost: 8848 /nacos http://localhost: 8858 /nacos
http://localhost: 8868 /nacos 这三个路径来访问nacos管理台,效果是⼀样的。
并且可以看到集群的情况:

 不过我们我们在启动的时候,使⽤了

startup.cmd -p embedded
表示使⽤内置数据源,我们可以切换成mysql,⾸先我们在⾃⼰的mysql中新建⼀个schema:
nacos_config
然后执⾏

 

然后执⾏该sql脚本,去创建相关的表,可以发现只有配置中⼼的配置信息才会存到mysql中,注册中⼼的服务信息是不会存的。
然后修改application.properties⽂件中的:
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos2?characterEncoding=utf8&connect
Timeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=
false&serverTimezone=UTC
db.user.0=root
db.password.0=Zhouyu123456***
三个节点都配好,并且必须连接同⼀个数据库,配好之后,就可以直接使⽤startup.cmd来启动了。
那nacos集群搭建完之后,对应我们的应⽤⽽⾔,连接任意⼀个节点都可以,或者可以配置配多个:
spring.cloud.nacos.discovery.server-addr=192.168.65.46:8848, 192.168.65.46:
8858, 192.168.65.46:8858
这样其中某个节点就算挂掉了,对于应⽤⽽⾔也能从其他节点获取信息。
不过,在应⽤上指定多个ip地址,有⼀个缺点就是,如果⼀旦ip地址发⽣变化,那么就得修改,所以我们可以在nacos集群之上在搭⼀个nginx。
先下载⼀个nginx,然后修改conf/nginx配置⽂件:
添加upstream
upstream nacos-cluster {
server 192.168.65.46:8848;
 server 192.168.65.46:8858;
 server 192.168.65.46:8868;
}
添加location:
location /nacos {
proxy_pass http://nacos-cluster;
}
启动nginx后,访问 http://localhost/nacos 就可以访问到nacos管理台了,并且在应⽤中只需要配置:
spring.cloud.nacos.discovery.server-addr=localhost:80/nacos
即可进⾏服务注册与发现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/84213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

R包开发一:R与Git版本控制

目录 1.安装Git 2-配置Git&#xff08;只需配置一次&#xff09; 3-用SSH连接GitHub(只需配置一次) 4-创建Github远程仓库 5-克隆仓库到本地 目标&#xff1a;创建的R包&#xff0c;包含Git版本控制&#xff0c;并且能在远程Github仓库同步&#xff0c;相当于发布在Github。…

redis Windows版本安装过程(5.0.14)

官网不提供Windows版本的redis安装包&#xff0c;但可以在GitHub网站上找到redis的安装包&#xff1a; Releases tporadowski/redis GitHub &#xff08;相比较Linux其他版本的Redis,Windows版的redis的缺点是版本比较老&#xff0c;官方不提供且不更新&#xff09; 1、zip…

cuda gdb调试

如果cudaDeviceEnablePeerAccess函数不支持或不起作用&#xff0c;您仍然可以尝试其他方法来实现GPU之间的数据交换和通信。以下是一些替代方法&#xff1a; 通过主机内存进行数据传输&#xff1a; 如果GPU之间的数据交换不是非常频繁&#xff0c;您可以将数据从一个GPU复制到…

【笔记】Spark3 AQE(Adaptive Query Execution)

提效 7 倍&#xff0c;Apache Spark 自适应查询优化在网易的深度实践及改进 Performance Tuning 配置Spark SQL开启Adaptive Execution特性 How To Use Spark Adaptive Query Execution (AQE) in Kyuubi 【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析 玩转Spark…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…

Git相关命令

SSH密钥文件 Github里面S设置SH公钥有两者选择方式 账号下的每个仓库都设置一个公钥&#xff0c;因为GitHub官方要求每个仓库的公钥都不能相同&#xff0c;所以每个账号都要搞一个密钥&#xff08;很麻烦&#xff09;给账号分配一个公钥&#xff0c;然后这个公钥就可以在这个…

Ribbon 源码分析

Ribbon 源码分析 Ribbon Debug 分析 断点 LoadBalancerInterceptor LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口&#xff0c;重写了其中的 intercept 方法&#xff0c;用来拦截请求&#xff1b; 获取原始的 uri 和 服务名&#xff0c;调用 LoadBalanc…

【记录】Python3|Selenium4 极速上手入门(Windows)

环境&#xff1a;Windows 版本&#xff1a;python3&#xff0c;selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium&#xff0c;懒得每次都重新找链接。 文章目录 1 装ChromeEdge其他浏览器 2 运行报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4…

【快速解决方案】浏览器的安全策略不允许通过 file:// 协议直接加载外部文件(最省事的方法)

目录 问题摘要 解决办法 检验结果 问题摘要 Failed to load resource: net::ERR_FILE_NOT_FOUND&#x1f308; Cute Code Editor &#x1f308;.html:162 Fetch API cannot load file:///D:/%E6%A1%8C%E9%9D%A2/%E4%B8%83%E5%A4%95%E5%BF%AB%E4%B9%90/index.txt. URL scheme …

IC封装——从基本概念到TSV

一、IC封装 在之前文章中有大致提过封装&#xff0c;这里展开讲讲 芯片生产流程_沧海一升的博客-CSDN博客每个半导体产品的制造都需要数百个工艺&#xff0c;泛林集团将整个制造过程分为八个步骤&#xff1a;晶圆加工-氧化-光刻-刻蚀-薄膜沉积-互连-测试-封装。_芯片生产流程h…

操作系统-笔记-第三章-内存管理

目录 三、第三章——内存管理 1、内存的基础知识 &#xff08;1.1&#xff09;程序装入&#xff08;三种&#xff09;——绝对装入 &#xff08;1.2&#xff09;程序装入&#xff08;三种&#xff09;——可重定位装入 &#xff08;1.3&#xff09;程序装入&#xff08;三…

WPF的CheckBox中的三个状态

WPF的CheckBox中的三个状态 CheckBox控件和RadioButton控件是继承自ToggleButton类&#xff0c;这意味着用户可切换他们的开关状态&#xff0c;其中IsChecked属性是可空的Boolean类型&#xff0c;这意味着该属性可以设置为true&#xff0c;false或null。 null值表示不确定状态…

《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

vm安装CentOS虚拟机带有桌面的版本。su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具&#xff1a;yum install -y net-tools wget。看下ip地址ifconfig&#xff0c;然后本地终端连接ssh root192.168.249.132输入密码即可&#xff0c;主要是为了复制网址方便…

CW4-6A-S、CW4-10A-S、CW4-20A-S、CW4-30A-S螺栓式滤波器

CW3L2-3A-S、CW3L2-6A-S、CW3L2-10A-S、CW3L2-20A-S CW3-3A-S、CW3-6A-S、CW3-10A-S、CW3-20A-S、CW3-30A-S CW4EL2-3A-S、CW4EL2-6A-S、CW4EL2-10A-SCW4EL2-20A-S、CW4EL2-30A-S CW4E-3A-S、CW4E-6A-S、CW4E-10A-S、CW4E-20A-S、CW4E-30A-S CW4E-40A-S(001)、CW4E-50A-S(0…

小说作者分享:如何利用爱校对使我的作品更出彩?

在创作小说的过程中&#xff0c;校对和修改是至关重要的步骤。许多作家已经开始利用“爱校对”这一工具&#xff0c;有效地提高他们作品的质量。本篇文章将通过实际案例&#xff0c;展示一些小说作者是如何成功地利用爱校对来精雕细琢他们的文字&#xff0c;并将作品提升到一个…

vue 弹出框 引入另一个vue页面

为什么要这么做,适用于在一个页面逻辑比较多的时候,可以搞多个页面,防止出错 index页面点击解约按钮,弹出框 进入jieyue.vue 核心代码 <el-buttonsize"mini"type"text"icon"el-icon-edit"v-if"scope.row.delFlag 0"click"j…

Jenkins工具系列 —— 配置邮箱 每个job下动态设置临时发送人

文章目录 安装插件添加邮箱认证邮箱申请&#xff08;以QQ邮箱网页为例&#xff09;jenkins添加邮箱认证 jenkins设置邮箱相关信息配置全局邮件单个JOB邮箱配置 安装插件 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins 添加邮箱认证 邮箱申请…

vue3 tailwindcss的使用

首先安装依赖&#xff1a; npm install -D tailwindcsslatest postcsslatest autoprefixerlatestnpm i -D unocss 然后vite.config.ts中 引入 import Unocss from unocss/viteexport default defineConfig({plugins: [Unocss(),],})终端执行&#xff1a; npx tailwindcss in…

基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…

Rides分布式缓存

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#x…