当前位置: 首页 > news >正文

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 {@Autowiredprivate 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
即可进⾏服务注册与发现。

相关文章:

Nacos

Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称&#xff0c;⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中&#xff0c;可以看出Nacos⾄少有三个核⼼功能&#xff1a; 1. 动态服务发现 2. 配…...

【Linux】网络层协议:IP

我们必须接受批评&#xff0c;因为它可以帮助我们走出自恋的幻象&#xff0c;不至于长久在道德和智识上自我陶醉&#xff0c;在自恋中走向毁灭&#xff0c;事实上我们远比自己想象的更伪善和幽暗。 文章目录 一、IP和TCP之间的关系&#xff08;提供策略 和 提供能力&#xff09…...

神经网络为什么可以学习

本资料转载于B站up主&#xff1a;大模型成长之路,仅用于学习和讨论&#xff0c;如有侵权请联系 动画解析神经网络为什么可以学习_哔哩哔哩_bilibilis 1、一个神经网络是由很多神经元形成的 1.1 也可以是一层&#xff0c;也可以是多层 2 层和层之间的连接就跟一张网一样 2.1 每…...

Docker基础入门:镜像、容器导入导出与私有仓库搭建

Docker基础入门&#xff1a;镜像导入导出与私有仓库搭建 一、 Docker镜像、容器的导入和导出1.1、Docker镜像的导出1.2、Docker镜像的载入1.3、Docker容器的导出1.4、Docker容器的导入 二、 镜像和容器导出和导入的区别:三、commit操作_本地镜像发布到阿里云3.1、commit操作有关…...

Go语言入门指南:基础语法和常用特性解析(上)

一、Go语言前言 Go是一种静态类型的编译语言&#xff0c;常常被称作是21世纪的C语言。Go语言是一个开源项目&#xff0c;可以免费获取编译器、库、配套工具的源代码&#xff0c;也是高性能服务器和应用程序的热门选择。 Go语言可以运行在类UNIX系统——比如Linux、OpenBSD、M…...

排序算法合集

F B I W a r n i n g : \color{red}FBI \qquad Warning: FBIWarning: 本人没有完整的计算机科班的教育经历&#xff0c;但是一直在兢兢业业&#xff0c;努力学习。 这些排序函数都是自己零零散散写的&#xff0c;也没有经过深思熟虑和优化&#xff0c;纯粹是为了自娱自乐。 …...

Vue2-全局事件总线、消息的订阅与发布、TodoList的编辑功能、$nextTick、动画与过渡

&#x1f954;&#xff1a;高度自律即自由 更多Vue知识请点击——Vue.js VUE2-Day9 全局事件总线1、安装全局事件总线2、使用事件总线&#xff08;1&#xff09;接收数据&#xff08;2&#xff09;提供数据&#xff08;3&#xff09;组件销毁前最好解绑 3、TodoList中的孙传父&…...

DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构

鲲鹏处理器片上系统架构 一、鲲鹏处理器片上系统与Taishan处理器内核架构1. 鲲鹏处理器片上系统概况a. 鲲鹏处理器片上系统与鲲鹏芯片家族b. 鲲鹏920处理器片上系统的组成部件c. 鲲鹏920处理器片上系统的特征d. 鲲鹏920处理器片上系统的逻辑结构 2. Taishan V110 处理器内核微架…...

如何使用 HOOPS Exchange SDK 和 Polygonica Bridge

这里将讨论使用 HOOPS Exchange 和 Polygonica 以及它们之间的桥梁进行 CAD 访问和网格处理。--提供Crack HOOPS 全系列SDK HOOPS Exchange 基础知识 首先&#xff0c;让我们简单回顾一下 HOOPS Exchange。HOOPS Exchange 是一款具有 C 接口的数据访问 SDK&#xff0c;支持导入…...

spring异步框架使用教程

背景 在需求开发过程中&#xff0c;为了提升效率&#xff0c;很容易就会遇到需要使用多线程的场景。这个时候一般都会选择建一个线程池去专门用来进行某一类动作&#xff0c;这种任务到来的时候往往伴随着大量的线程被创建调用。而还有另外一种场景是整个任务的执行耗时比较长…...

【数学建模】清风数模正课3 插值算法

插值算法 在数模比赛中&#xff0c;很多类型的题目都需要根据已知的函数点进行数据分析和模型处理&#xff1b; 当此时题目所给的数据较少时&#xff0c;我们就无法进行准确科学的分析&#xff0c;所以需要更多的数据&#xff0c;也就是函数点&#xff1b; 这就需要使用数学…...

什么是eval()?eval是用来干什么的?

一、什么是eval()? eval() 是 JavaScript 中的一个全局函数&#xff0c;用于解析并执行传递给它的字符串作为 JavaScript 代码。 二、eval()是用来干什么的&#xff1f; 当调用 eval() 时&#xff0c;它会将传入的字符串参数视为 JavaScript 代码&#xff0c;并在调用位置执…...

JavaScript-console:JavaScript控制台(Console)常用方法

一、理解 console JavaScript 控制台&#xff08;console&#xff09;是一个开发人员在编写 JavaScript 代码时常用的工具。它是浏览器提供的一种界面&#xff0c;让开发人员能够追踪代码执行的状态和结果。JavaScript 控制台可以记录代码输出的信息、警告和错误&#xff0c;并…...

Nginx配置前后端分离

后端地址 1.本地环境 curl --request GET \--url http://localhost:8080/by-admin/captchaImage \--header Authorization: Bearer d7a035d9-b30c-4ca5-8951-8cec90607943确认后端 ip 端口 上下文 2.测试环境 部署到测试环境可能是 换成内网ip和内网服务端口(ip、端口 可能会…...

rabbitmq的发布确认

生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c; 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID (从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的唯一 ID)&…...

RISC-V公测平台发布· CoreMark测试报告

一. CoreMark简介 CoreMark是一款用于评估CPU性能的基准测试程序&#xff0c;它包含了多种不同的计算任务&#xff0c;包括浮点数、整数、缓存、内存等方面的测试。CoreMark的测试结果通常被用来作为CPU性能的参考&#xff0c;它可以帮助开发人员和系统管理员评估不同处理器和…...

模型微调(fine-tune)

一、关于模型微调的一些基础知识 1、模型微调&#xff08;fine-tune&#xff09; 微调(fine-tune)通过使用在大数据上得到的预训练好的模型来初始化自己的模型权重&#xff0c;从而提升精度。这就要求预训练模型质量要有保证。微调通常速度更快、精度更高。当然&#xff0c;自己…...

云农场种植:互联网+智慧牧场,为农业注入新的活力和创新

随着科技的不断发展&#xff0c;数字化农业正逐渐成为现代农业的趋势。传统农业面临着土地资源有限、劳动力不足等问题&#xff0c;而云农场种植模式通过数字化技术的运用&#xff0c;互联网养殖着重于“绿色、特色产品和智慧生态”&#xff0c;通过建立“线上养殖线下托养线上…...

Hadoop学习一(初识大数据)

目录 一 什么是大数据&#xff1f; 二 大数据特征 三 分布式计算 四 Hadoop是什么? 五 Hadoop发展及版本 六 为什么要使用Hadoop 七 Hadoop vs. RDBMS 八 Hadoop生态圈 九 Hadoop架构 一 什么是大数据&#xff1f; 大数据是指无法在一定时间内用常规软件工具对其内…...

linux定时备份MySQL数据库循环删除前30天的备份文件

linux定时备份MySQL数据库循环删除前30天的备份文件 一、 检查有没安装crond,如果没有&#xff0c;先安装 1、先检查一下有没有cron rpm -qa|grep cron如果输入上面命令有如下显示&#xff0c;则不需要安装 2、没有安装的话&#xff0c;就使用一下命令安装 yum -y install …...

不加电透明屏:在场景化应用中,有哪些特点和优点?

不加电透明屏是一种新型的显示技术&#xff0c;它可以在不需要电源的情况下显示图像和文字。 这种屏幕的原理是利用光的折射和反射来实现显示效果&#xff0c;而不需要通过电流来激发像素点。 不加电透明屏的最大优点是节能环保。传统的显示屏需要消耗大量的电能来显示图像&a…...

全球公链进展| Shibarium已上线;opBNB测试网PreContract硬分叉;Sui 主网 V1.7.1 版本

01 ETH 以太坊最新一次核心开发者执行会议&#xff1a;讨论 Devnet 8 更新、ElP-4788、Holesky 测试网等 以太坊核心开发者 Tim Beiko 总结最新一次以太坊核心开发者执行会议&#xff08;ACDE&#xff09;&#xff0c;讨论内容包括 Devnet 8 更新、ElP-4788、Holesky 测试网、…...

CSS中的display属性有哪些值?它们的作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS display 属性的不同取值和作用1. block2. inline3. inline-block4. none5. flex6. grid7. table、table-row、table-cell8. list-item9. inline-table、table-caption、table-column 等 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#x…...

ELKstack-日志收集案例

由于实验环境限制&#xff0c;将 filebeat 和 logstash 部署在 tomcat-server-nodeX&#xff0c;将 redis 和 写 ES 集群的 logstash 部署在 redis-server&#xff0c;将 HAproxy 和 Keepalived 部署在 tomcat-server-nodeX。将 Kibana 部署在 ES 集群主机。 环境&#xff1a;…...

基于GPT-4和LangChain构建云端定制化PDF知识库AI聊天机器人

参考&#xff1a; GitHub - mayooear/gpt4-pdf-chatbot-langchain: GPT4 & LangChain Chatbot for large PDF docs 1.摘要&#xff1a; 使用新的GPT-4 api为多个大型PDF文件构建chatGPT聊天机器人。 使用的技术栈包括LangChain, Pinecone, Typescript, Openai和Next.js…...

Python可视化工具分享

今天和大家分享几个实用的纯python构建可视化界面服务&#xff0c;比如日常写了脚本但是不希望给别人代码&#xff0c;可以利用这些包快速构建好看的界面作为服务提供他人使用。有关于库的最新更新时间和当前star数量。 streamlit (23.3k Updated 2 hours ago) Streamlit 可让…...

ethers.js:构建ERC-20代币交易的不同方法

在这篇文章中,我们将探讨如何使用ethers.js将ERC-20令牌从一个地址转移到另一个地址 Ethers是一个非常酷的JavaScript库,它能够发送EIP-1559事务,而无需手动指定气体属性。它将确定gasLimit,并默认使用1.5 Gwei的maxPriorityFeePerGas,从v5.6.0开始。 此外,如果您使用签名…...

[实践篇]13.23 QNX环境变量profile

一,profile简介 /etc/profile或/system/etc/profile是qnx侧的设置环境变量的文件,该文件适用于所有用户,它可以用作以下情形: 设置HOMENAME和SYSNAME环境变量设置PATH环境变量设置TMPDIR环境变量(/tmp)设置PCI以及IFS_BASE等环境变量等文件内容示例如下: /etc/profile…...

HDLBits-Verilog学习记录 | Getting Started

Getting Started problem: Build a circuit with no inputs and one output. That output should always drive 1 (or logic high). 答案不唯一&#xff0c;仅共参考&#xff1a; module top_module( output one );// Insert your code hereassign one 1;endmodule相关解释…...

flask模型部署教程

搭建python flask服务的步骤 1、安装相关的包 具体参考https://blog.csdn.net/weixin_42126327/article/details/127642279 1、安装conda环境和相关包 # 一、安装conda # 1、首先&#xff0c;前往Anaconda官网&#xff08;https://www.anaconda.com/products/individual&am…...

一文详解4种聚类算法及可视化(Python)

在这篇文章中&#xff0c;基于20家公司的股票价格时间序列数据。根据股票价格之间的相关性&#xff0c;看一下对这些公司进行聚类的四种不同方式。 苹果&#xff08;AAPL&#xff09;&#xff0c;亚马逊&#xff08;AMZN&#xff09;&#xff0c;Facebook&#xff08;META&…...

SpringBoot---内置Tomcat 配置和切换

&#x1f600;前言 本篇博文是关于内置Tomcat 配置和切换&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x…...

Qt 显示git版本信息

项目场景&#xff1a; 项目需要在APP中显示当前的版本号&#xff0c;考虑到git共同开发&#xff0c;显示git版本&#xff0c;查找bug或恢复设置更为便捷。 使用需求&#xff1a; 显示的内容包括哪个分支编译的&#xff0c;版本号多少&#xff0c;编译时间&#xff0c;以及是否…...

Mysql的视图和管理

MySQL 视图(view) 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含列&#xff0c;其数据来自对应的真实表(基表) create view 视图名 as select语句alter view 视图名 as select语句 --更新成新的视图SHOW CREATE VIEW 视图名d…...

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>...

最新ai系统ChatGPT程序源码+详细搭建教程+mj以图生图+Dall-E2绘画+支持GPT4+AI绘画+H5端+Prompt知识库

目录 一、前言 二、系统演示 三、功能模块 3.1 GPT模型提问 3.2 应用工作台 3.3 Midjourney专业绘画 3.4 mind思维导图 四、源码系统 4.1 前台演示站点 4.2 SparkAi源码下载 4.3 SparkAi系统文档 五、详细搭建教程 5.1 基础env环境配置 5.2 env.env文件配置 六、环境…...

FairyGUI-Unity 自定义UIShader

FairyGUI中给组件更换Shader&#xff0c;最简单的方式就是找到组件中的Shader字段进行赋值。需要注意的是&#xff0c;对于自定的shader效果需要将目标图片进行单独发布&#xff0c;也就是一个目标图片占用一张图集。&#xff08;应该会有更好的解决办法&#xff0c;但目前还是…...

Excel/PowerPoint柱状图条形图负值设置补色

原始数据&#xff1a; 列1系列 1类别 14.3类别 2-2.5类别 33.5类别 44.5 默认作图 解决方案 1、选中柱子&#xff0c;双击&#xff0c;按如下顺序操作 2、这时候颜色会由一个变成两个 3、对第二个颜色进行设置&#xff0c;即为负值的颜色 条形图的设置方法相同...

el-date-picker 时间区域选择,type=daterange,form表单校验+数据回显问题

情景问题&#xff1a;新增表单有时间区域选择&#xff0c;选择了时间&#xff0c;还是提示必填的校验提示语&#xff0c;且修改时&#xff0c;通过 号赋值法&#xff0c;重新选择此时间范围无效。 解决方法&#xff1a;&#xff08;重点&#xff09; widthHoldTime:[]&#xf…...

LeetCode 面试题 01.02. 判定是否互为字符重排

文章目录 一、题目二、C# 题解 ​ 一、题目 给定两个由小写字母组成的字符串 s1 和 s2&#xff0c;请编写一个程序&#xff0c;确定其中一个字符串的字符重新排列后&#xff0c;能否变成另一个字符串&#xff0c;点击此处跳转。 示例 1&#xff1a; 输入: s1 “abc”, s2 “…...

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…...

手机直播源码开发,协议讨论篇(三):RTMP实时消息传输协议

实时消息传输协议RTMP简介 RTMP又称实时消息传输协议&#xff0c;是一种实时通信协议。在当今数字化时代&#xff0c;手机直播源码平台为全球用户进行服务&#xff0c;如何才能增加用户&#xff0c;提升用户黏性&#xff1f;就需要让一对一直播平台能够为用户提供优质的体验。…...

【JavaEE基础学习打卡05】JDBC之基本入门就可以了

目录 前言一、JDBC学习前说明1.Java SE中JDBC2.JDBC版本 二、JDBC基本概念1.JDBC原理2.JDBC组件 三、JDBC基本编程步骤1.JDBC操作的数据库准备2.JDBC操作数据库表步骤 四、代码优化1.简单优化2.with-resources探讨 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好…...

2023/8/16 华为云OCR识别驾驶证、行驶证

目录 一、 注册华为云账号开通识别驾驶证、行驶证服务 二、编写配置文件 2.1、配置秘钥 2.2、 编写配置工具类 三、接口测试 3.1、测试接口 3.2、结果 四、实际工作中遇到的问题 4.1、前端传值问题 4.2、后端获取数据问题 4.3、使用openfeign调用接口报错 4.3、前端显示问题…...

【Java开发】 Mybatis-Plus 07:创建时间、更新时间自动添加

Mybatis-Plus 可以通过配置实体类的注解来自动添加创建时间和更新时间&#xff0c;这可以减轻一定的开发量。 1 在实体类中添加注解 public class User {TableId(type IdType.AUTO)private Long id;private String username;private String password;TableField(fill FieldF…...

解决vue2项目在IE11浏览器中无画面的兼容问题

解决vue2项目在IE11浏览器中无画面的兼容问题 背景介绍当前网上能找打的教程 背景介绍 当前项目面临其他浏览器都可以运行&#xff0c;但是在IE11浏览器中出现白屏的现象&#xff0c;F12后台也没有报错&#xff0c;项目月底也要交付了。当前项目的vue版本为2.6.11&#xff0c;…...

信号

信号也是IPC中的一种&#xff0c;是和管道&#xff0c;消息队列&#xff0c;共享内存并列的概念。 本文参考&#xff1a; Linux中的信号_linux中信号_wolf鬼刀的博客-CSDN博客 Linux系统编程&#xff08;信号处理 sigacation函数和sigqueue函数 )_花落已飘的博客-CSDN博客 Linu…...

产品经理的真实薪资有多少?今天带你看看

作为产品经理&#xff0c;除了需要拥有扎实的技术背景和出色的产品设计能力&#xff0c;还需具备出色的领导力和商业敏感度。因此&#xff0c;产品经理的薪资也越来越成为人们关注的话题。那么&#xff0c;一般来说&#xff0c;产品经理的薪资水平如何呢&#xff1f; 薪资多少…...

《一个操作系统的实现》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;主要是为了复制网址方便…...

线程Thread

文章目录 一、概念1、进程2、线程3、CPU与线程的关系4、并行、并发5、线程的生命周期 二、创建1、继承Thread2、实现Runnable接口3、实现Callable接口 三、API1、获取运行使用的线程2、唯一标识3、线程名4、优先级5、是否处于活动状态6、守护线程7、join1、API2、有无join对比 …...