Loading... # 1.Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称,⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中,可以看出Nacos⾄少有三个核⼼功能: 1. 动态服务发现 2. 配置管理 3. 服务管理 后续会分别来介绍这三个功能是怎么回事。 # 2.下载和解压 教程制作时,Nacos的最新发⾏版为v2.2.3(2023年5月25日发布)。 查看最新Nacos发⾏版:[https://github.com/alibaba/nacos/releases](https://github.com/alibaba/nacos/releases) 并且可以在此⽹⻚上下载安装包: ![](https://blog.fivk.cn/usr/uploads/2023/06/391345545.png) 下载完了之后进⾏解压,解压之后的⽬录为: ![](https://blog.fivk.cn/usr/uploads/2023/06/2931786579.png) 1. bin⽬录下是启动和停⽌的脚本 2. conf⽬录下是Nacos的配置⽂件 3. target⽬录下是Nacos的jar包(启动脚本中其实就是运⾏的这个jar包,停⽌脚步中是直接kill到进 程) # 3.启动 解压完之后就可以启动Nacos了,Nacos⽀持单机和集群,默认是以集群模式启动,通过添加-m standalone就会以单机模式启动。 ## 3.1Linux/Unix/Mac 启动命令(standalone代表着单机模式运⾏,⾮集群模式): ```bash sh startup.sh -m standalone ``` 如果您使⽤的是ubuntu系统,或者运⾏脚本报错提示[[符号找不到,可尝试如下运⾏: ```bash bash startup.sh -m standalone ``` ## 3.2Windows 启动命令(standalone代表着单机模式运⾏,⾮集群模式): ```bash startup.cmd -m standalone ``` 启动⽇志 ![](https://blog.fivk.cn/usr/uploads/2023/06/337770371.png) 可以发现,默认情况下Nacos占⽤了8848端⼝ 我们可以访问[http://localhost:8848/nacos](http://localhost:8848/nacos),来访问Nacos: ![](https://blog.fivk.cn/usr/uploads/2023/06/2809611337.png) 默认的⽤户名和密码为:`nacos/nacos` 登录进来后: ![](https://blog.fivk.cn/usr/uploads/2023/06/2118077018.png) 这个⽹⻚相当于nacos的管理台,有: 1. 配置管理 2. 服务管理 3. 权限控制 4. 命名空间 5. 集群管理 # 4.配置管理 配置,其实就是⼀个`key:value`,⽐如 ```properties spring.datasource.username=Fivk spring.datasource.password=123456 ``` 并且我们通常会把这些配置写在`application.properties`或`application.yml`⽂件中,当时通过这种⽅式⼀定配置发 ⽣了改变就需要重启应⽤,并且通过这种⽅式配置的配置项仅限于当前应⽤,⽽不能做到多个应⽤共享。 那么nacos的配置管理功能就是来解决这些问题的,我们可以直接通过nacos管理台来新增配置,并且这些配置 能够被多个应⽤给使⽤到。 ## 4.1新建配置 新建配置时可以指定: 1. Data ID:相当于⼀个配置⽂件,⽐如相当于application.properties,或者applicationdev.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的格式 ⽐如: ![](https://blog.fivk.cn/usr/uploads/2023/06/1857431362.png) ## 4.2.拉取配置 在nacos中新建完配置后,那作为⼀个SpringBoot应⽤我们如何来获取配置呢? ### 4.2.1.JavaSDK ⾸先,我们可以直接使⽤Nacos提供的Java SDK来获取配置。 ⾸先在项⽬中,添加如下依赖: ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.2.3</version> </dependency> ``` 然后可以使⽤如下代码来获取nacos中的配置: ```java // 拉取Nacos配置 try { // Nacos服务器地址 String serverAddr = "192.168.136.170:8848/"; // 配置ID String dataId = "user.propertles"; // 配置组 String group = "DEFAULT_GROUP"; // 创建Properties对象,用于传递Nacos连接参数 Properties properties = new Properties(); properties.put("serverAddr", serverAddr); // 创建ConfigService对象,并从Nacos服务器中获取指定ID和组的配置 ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); System.out.println(content); } catch (NacosException e) { // 出现异常时打印错误信息 e.printStackTrace(); } ``` 1. serverAddr:nacos的地址 2. dataId:想要获取的配置⽂件的名字 3. group:分组 在Java SDK中,除开有获取配置的API,同时也提供了新增、删除、监听配置的API。 我们可以通过如下代码来监听配置的变化: ```java // 拉取nacos配置 try { // Nacos服务器地址 String serverAddr = "192.168.136.170:8848/"; // 配置ID String dataId = "user.propertles"; // 配置组 String group = "DEFAULT_GROUP"; // 创建Properties对象,用于传递Nacos连接参数 Properties properties = new Properties(); properties.put("serverAddr", serverAddr); // 创建ConfigService对象,并从Nacos服务器中获取指定ID和组的配置 ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); System.out.println(content); // 添加监听器,以便在配置发生更改时接收通知 configService.addListener(dataId, group, new Listener() { @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } }); // 等待控制台输入,以便长时间运行 System.in.read(); } catch (NacosException e) { // 出现异常时打印错误信息 e.printStackTrace(); } catch (IOException e) { throw new RuntimeException(e); } ``` 剩余API,⼤家可以直接参考官⽹:[https://nacos.io/zh-cn/docs/sdk.html](https://nacos.io/zh-cn/docs/sdk.html) ### 4.2.2.Spring 在真正开发时,我们不太会通过Java SDK的⽅式来拉取nacos中的配置,那Nacos有没有针对Spring提 供⼀些⽐较好⽤的注解或API呢? 当然是有的。 增加⼀下依赖(不再需要nacos-client依赖了) ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency> ``` 我们可以按以下⽅式来配置Spring容器: ```java @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,并且设置⾃动刷新(也就是配置发⽣了改变则会⾃动⽣效)。 那如何使⽤某⼀个具体的配置项呢: ```java @Component public class UserService { @NacosValue("${spring.datasource.username}") private String username; public void test() { System.out.println(username); } } ``` 可以通过@NacosValue来使⽤某⼀具体的配置项,那@Value⾏不⾏呢?也是可以的。 <div class="tip inlineBlock share simple"> 之所以可以,原因是@EnableNacosConfig注解会负责把指定的dataId的配置项拉取到应⽤,并封装为 PropertySource对象添加到Environment对象中,所以@Value也能读取到相应的配置项。 </div> ### 4.2.3.SpringBoot 如果我们使⽤SpringBoot,那则可以⽐Spring更加简单。 ⾸先引⼊依赖: ```xml <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.12</version> </dependency> ``` 然后在application.properties中配置nacos的地址: ```properties nacos.config.server-addr=127.0.0.1:8848 ``` 然后: ```java @SpringBootApplication @NacosPropertySource(dataId = "user.properties", autoRefreshed = true) public class UserApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(UserApplication.class, args); UserService userService = applicationContext.getBean(UserService.class); userService.test(); } } ``` 依旧使⽤@NacosPropertySource来指定要拉取的配置dataId即可,就可以使⽤@Value或@NacosValue 来获取某个具体的配置项了。 那有同学可能会想到,我们可不可以直接在application.properties⽂件中来配置dataid呢?确实可以: ```properties 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,不然是不⾏的。 ### 4.2.4.SpringCloud 如果我们是⽤SpringCloud,那将⽐SpringBoot更加简单。 引⼊依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.8.RELEASE</version> </dependency> ``` 然后在boostrap.properties⽂件中配置: ```properties spring.application.name=user spring.cloud.nacos.server-addr=127.0.0.1:8848 ``` 就可以了,因为会⾃动去连接nacos并获取dataid为user.properties的配置了。 我们获取配置中的值时使用`@Value`,需要动态获取值需要加上`@RefreshScope`注解。 ```java @Component @RefreshScope public class UserService { @Value("${spring.datasource.username}") private String username; public void test() { System.out.println(username); } } ``` 到这⾥,我们⼤概知道了Nacos的配置管理是怎么⽤的了,接下来我们再来介绍⼀些配置管理更⾼级的 功能。 ## 4.3.按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的配置,不过通过看源码: ```java /** * 加载应用程序配置 * * @param compositePropertySource 组合属性源 * @param dataIdPrefix 数据ID前缀 * @param properties Nacos配置属性对象 * @param environment 应用程序环境 */ private void loadApplicationConfiguration( CompositePropertySource compositePropertySource, String dataIdPrefix, NacosConfigProperties properties, Environment environment) { // 获取文件扩展名和Nacos分组 String fileExtension = properties.getFileExtension(); String nacosGroup = properties.getGroup(); // 默认情况下直接加载 loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup, fileExtension, true); // 使用带有后缀的数据ID加载,具有比默认情况更高的优先级 loadNacosDataIfPresent(compositePropertySource, dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true); // 根据激活的配置文件加载,比后缀具有更高的优先级 for (String profile : environment.getActiveProfiles()) { String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension; 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下 相当于⼀个三层结构 ![](https://blog.fivk.cn/usr/uploads/2023/06/2441535345.jpg) ## 4.4.拉取多个配置 ⼀个应⽤可能不⽌需要⼀个配置,有时可能需要拉取多个配置,此时可以利⽤ 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 ## 4.5.配置的自动刷新 **默认情况下,主配置会⾃动刷新,extension-configs和shared-configs不会⾃动刷新**,可以通过 spring.cloud.nacos.config.refresh-enabled=false来关闭主配置的⾃动刷新。 ⾃动配置的意思是,⼀旦应⽤中引⼊的配置发⽣了变化,应⽤端也能及时获取到最新值。 值得注意的是,尽管默认情况下会⾃动刷新,但是对于通过`@Value`的使⽤⽅式,还需要在该`Bean`上加上 `@RefreshScope`注解,这样才能动态的修改`@Value`属性,达到动态更新的最终效果。 ## 4.6.历史版本回滚 可以回滚某个配置到历史版本 ## 4.7监听查询 监听某个配置哪些应⽤在使⽤ # 5.服务管理 服务管理核⼼就是: 1. 服务注册 2. 服务发现 通过nacos的服务注册与发现,可以使得在调⽤微服务时可以更加简单。 ## 5.1.Java SDK ### 5.1.1.服务注册 ⾸先,我们可以直接使⽤Nacos提供的Java SDK来进⾏服务注册。 ⾸先在项⽬中,添加如下依赖: ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.1</version> </dependency> ``` 我们可以使⽤如下代码来快速的进⾏服务注册: ```java NamingService naming = NamingFactory.createNamingService("localhost:8848"); naming.registerInstance("app1", "11.11.11.11", 8888); ``` 以上代码表示注册⼀个服务: 1. 服务名字为app1 2. 访问该服务的地址为:11.11.11.11:8888 注意执⾏完上述代码后,不要上线程停掉,可以加上: ```java System.in.read(); ``` 运⾏为代码后,就可以到Nacos管理台看到: ![](https://blog.fivk.cn/usr/uploads/2023/06/385597348.png) 可以发现,⼀个服务下: 1. ⼀个服务可以属于某⼀个组,可以在注册时指定group 2. ⼀个服务下可以有多个实例 3. ⼀个服务下多个实例可以分为多个虚拟集群 ⽐如以下代码就注册了⼀个服务有三个实例,分别属于两个虚拟集群 ```java 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(); ``` 对应的管理台展示为: ![](https://blog.fivk.cn/usr/uploads/2023/06/256677141.png) 详情如下: ![](https://blog.fivk.cn/usr/uploads/2023/06/1315749969.png) 我们也可以使⽤更加定制化的⽅式来注册服务: ```java 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(); ``` 以上代码注册了⼀个不健康的实例,并且设置了权重和元数据, 对应的管理台效果为: ![](https://blog.fivk.cn/usr/uploads/2023/06/2780406620.png) ### 5.1.2.服务发现 服务注册之后,服务消费者就可以来使⽤了,我们可以使⽤如下api来获取某个服务的所有实例信息 ```java NamingService naming = NamingFactory.createNamingService("localhost:8848"); System.out.println(naming.getAllInstances("app1")); ``` 也可以获取所有健康的实例 ```java naming.selectInstances("app1", true) ``` 可以直接某⼀个健康的实例(权重随机算法) ```java naming.selectOneHealthyInstance("app1") ``` 通常,作为服务消费者,还需要监听服务实例化的变化,我们可以使⽤如下api来监听变化: ```java 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。 ## 5.2.Spring/SpringBoot 直接使⽤Java SDK的⽅式来进⾏服务注册和发现⽐较麻烦,不过⽬前在Spring和SpringBoot中使⽤也不 怎么⽅便,可以⾃⾏参考官⽹的教程:[https://nacos.io/zh-cn/docs/quick-start-spring-boot.html](https://nacos.io/zh-cn/docs/quick-start-spring-boot.html) ## 5.3.SpringCloud 我们直接来看SpringCloud中如何使⽤Nacos来进⾏服务注册和发现 ⾸先添加依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.8.RELEASE</version> </dependency> ``` ### 5.3.1.服务提供者 在服务提供者的application.properties中配置: ```properties server.port=8070 spring.application.name=service-provider spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` 使⽤`@EnableDiscoveryClient`来开启服务注册 ```java @SpringBootApplication @EnableDiscoveryClient public class UserApplication { public static void main(String[] args) throws IOException { SpringApplication.run(UserApplication.class, args); } } ``` 启动应⽤,就能完成服务注册: ![](https://blog.fivk.cn/usr/uploads/2023/06/1693998575.png) ### 5.3.2.服务消费者 也是先添加依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.8.RELEASE</version> </dependency> ``` 再配置应⽤的application.properties⽂件: ```properties server.port=8080 spring.application.name=service-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` 然后使⽤`@EnableDiscoveryClient`开启服务发现: ```java @SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } ``` 然后通过定义⼀个RestTemplate来发现http请求,并使⽤`@LoadBalanced` ```java @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } ``` 然后来使⽤RestTemplate调⽤服务: ```java @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping(value = "/test") public String echo() { return restTemplate.getForObject("http://service-provider/test", String.class); } } ``` 可以发现在SpringCloud中使⽤Nacos还是⽐较⽅便的。 ## 5.4.高级功能 接下来我们再来看看Nacos服务管理中⼀些⽐较⾼级的功能 ### 5.4.1.临时实例与持久实例 默认情况下,注册给nacos的实例都是**临时实例**,临时实例表示会通过客户端与服务端之间的⼼跳来保 活,默认情况下,客户端会每**隔5s发送⼀次⼼跳**。 ```java public static final long DEFAULT_HEART_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5); ``` 在服务端测,如果**超过15s没有收到客户端的⼼跳,那么就会把实例标记为不健康状态** ```java public static final long DEFAULT_HEART_BEAT_TIMEOUT = TimeUnit.SECONDS.toMillis(15); ``` 在服务端测,如果**超过30s没有收到客户端的⼼跳,那么就会删除实例** ```java public static final long DEFAULT_IP_DELETE_TIMEOUT = TimeUnit.SECONDS.toMillis(30); ``` ⽽对于持久实例,就算服务实例下线了,那么也不会被删除,我们可以通过: ```properties spring.cloud.nacos.discovery.ephemeral=false ``` 来配置为持久实例,表示实例信息会持久化到磁盘中去。 那什么时候⽤持久实例呢?我们可以发现持久实例与临时实例的区别在于,持久实例会永远在线,⽽临 时实例不会,所以如果消费端在某种情况下想拿到已经下线的实例的实例信息,那么就可以把实例注册 为持久实例。 ### 5.4.2.保护阈值 在使⽤过程中,我们可以设置⼀个0-1的⼀个⽐例,表示如果服务的所有实例中,健康实例的⽐重低于这 个⽐重就会触发保护,⼀旦触发保护,在服务消费端侧就会把所有实例拉取下来,不管是否健康,这样 就起到了保护的作⽤,因为正常来说消费端只会拿到健康实例,但是如果健康实例占总实例⽐例⽐较⼩ 了,那么就会导致所有流量都会压到健康实例上,这样仅剩的⼏个健康实例也会被压垮,所以只要触发 了保护,消费端就会拉取到所有实例,这样部分消费端仍然会访问到不健康的实例从⽽请求失败,但是 也有⼀部分请求能访问到健康实例,达到保护的作⽤。 > 在SpringCloud Tencent中,这个功能叫“全死全活”。 ### 5.4.3.权值 ⼀个服务的多个实例,可能对应的机器配置不同,所以我们可以给不同的实例设置不同的权重,⽐如 ![](https://blog.fivk.cn/usr/uploads/2023/06/912976447.png) 给8070这个实例设置了权重为2,这样它的权重就是8071的两倍,那么就应该要承受2被的流量。 不过我们在消费⼀个服务时,通常是通过ribbon来进⾏负载均衡的,所以默认情况下nacos配置的权重是 起不到作⽤的,因为ribbon使⽤的是⾃⼰的负载均衡策略,⽽如果想要⽤到nacos的权重,可以: ```java @Bean public IRule ribbonRule() { return new NacosRule(); } ``` 这样就会利⽤到nacos中所配置的权重了。 ### 5.4.4.Cluster(就近访问) ⼀个服务下会有多个实例,在nacos中,可以将这些实例指定到不同的集群中,⽐如可以通过: ```java spring.cloud.nacos.discovery.cluster-name=bj ``` 这种⽅式来指定当前实例属于哪个集群,⽐如: ![](https://blog.fivk.cn/usr/uploads/2023/06/3530468841.png) hz集群只有⼀个8070的实例,bj集群有8071、8072两个实例。 此时在服务消费端,也可以配置: ```java spring.cloud.nacos.discovery.cluster-name=bj ``` 使得服务调⽤者也在bj集群,那么此时服务消费者就只会调⽤到bj集群中的两个实例。 如果消费端没有配置cluster-name,那么则会使⽤所有集群。 # 6.集群部署 在前⾯,我们都是使⽤的单机模式部署的nacos服务端的,为了保证nacos的⾼可⽤,也就是保证配置中 ⼼和注册中⼼的⾼可⽤,通常我们都需要以集群的⽅式来部署nacos server。 ⾸先,我们修改conf/cluster⽂件,把nacos集群中所有的节点的ip和port配置进去: ```bash 192.168.65.46:8848 192.168.65.46:8858 192.168.65.46:8868 ``` 我这⾥是在我本机搭集群,所以ip地址⼀样,端⼝得不⼀样,如果⼤家是在多个机器上搭机器,则ip地址 不⼀样,端⼝可以⼀样,也可以不⼀样,通常是⼀样(8848)。 如果多个机器来搭集群,那么这么配置⼀下就可以了,注意每个机器上得cluster⽂件都要配,表示每个 nacos节点都得知道⾃⼰所在集群的节点情况。 我这⾥在本地搭,就需要多⼏个步骤。 先复制三份 ![](https://blog.fivk.cn/usr/uploads/2023/06/444367430.png) 每个⽂件夹的内容都是如下 ![](https://blog.fivk.cn/usr/uploads/2023/06/2211686242.png) 分别修改三个cluster⽂件的内容都为: ```bash 192.168.65.46:8848 192.168.65.46:8858 192.168.65.46:8868 ``` 再分别修改三个application.properties中的server.port为8848、8858、8868 然后通过cmd分别进去三个⽂件夹中的bin⽬录,运⾏: ```java startup.cmd -p embedded ``` 来启动三个节点 启动成功后 ![](https://blog.fivk.cn/usr/uploads/2023/06/538980407.png) 然后我们就可以通过:http://localhost:8848/nacos、http://localhost:8858/nacos、 http://localhost:8868/nacos这三个路径来访问nacos管理台,效果是⼀样的。 并且可以看到集群的情况: ![](https://blog.fivk.cn/usr/uploads/2023/06/850741992.png) 不过我们我们在启动的时候,使⽤了 ```java startup.cmd -p embedded ``` 表示使⽤内置数据源,我们可以切换成mysql,⾸先我们在⾃⼰的mysql中新建⼀个schema: nacos\_config ![](https://blog.fivk.cn/usr/uploads/2023/06/2084149844.png) 然后执⾏该sql脚本,去创建相关的表,可以发现只有配置中⼼的配置信息才会存到mysql中,注册中⼼ 的服务信息是不会存的。 然后修改application.properties⽂件中的: ```java ### 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&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=Fivk123456*** ``` 三个节点都配好,并且必须连接同⼀个数据库,配好之后,就可以直接使⽤startup.cmd来启动了。 那nacos集群搭建完之后,对应我们的应⽤⽽⾔,连接任意⼀个节点都可以,或者可以配置配多个: ```java # 设置Nacos Server地址,多个地址使用逗号分隔 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 ```java upstream nacos-cluster { server 192.168.65.46:8848; server 192.168.65.46:8858; server 192.168.65.46:8868; } ``` 添加location: ```java location /nacos { proxy_pass http://nacos-cluster; } ``` 启动nginx后,访问[http://localhost/nacos](http://localhost/nacos)就可以访问到nacos管理台了,并且在应⽤中只需要配置: ```properties spring.cloud.nacos.discovery.server-addr=localhost:80/nacos ``` 即可进⾏服务注册与发现。 最后修改:2023 年 06 月 20 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏