nacos配置与使用
nacos初步使用
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简单来说,nacos可以用来管理一个springcloud项目中各个模块与组件。安装运行nacos后可以在专门的页面上看到注册进nacos的各个模块的信息。
以上是个人理解,如有不对,可在评论区纠正。
nacos安装与配置
在此目录下进入cmd
输入命令:startup.cmd -m standalone
访问控制台中的地址,用户名密码都是nacos
创建命名空间
创建成功后系统会生成一个唯一的id,这个id写在生产者与消费者的yml文件中(下文已写出)。这样nacos会将项目中的服务注册到指定的命名空间中,避免多个项目混淆。
nacos使用与配置
创建新项目作为父项目
创建新项目后,删除src文件夹,只保留pom.xml
pom.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hzx</groupId>
<artifactId>testmaven32springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--spring cloud alibaba 2.2.6.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我的springboot版本是2.3.2,对应的springcloud-alibaba版本是2.2.6。需要注意springboot和springcloud alibaba版本要相对应。
创建nacos服务端项目
名字是:nacos-provider-project
pom.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>testmaven32springcloud</artifactId>
<groupId>com.hzx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-provider-project</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<!--discovery依赖是用来注册到nacos客户端的-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!--config依赖是用来完成配置中心功能-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
yml
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: http://192.168.220.1:8848
namespace: 8302a253-b30a-4a13-bdeb-0caf566317b9
application:
name: nacos-provider
启动类
java
@SpringBootApplication
@EnableDiscoveryClient
public class StartNacosProvider{
public static void main(String[] args) throws Exception {
SpringApplication.run(StartNacosProvider.class, args);
}
}
创建nacos客户端项目
名字是:nacos-consumer-project
pom.xml
与服务端的pom.xml依赖一致
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>testmaven32springcloud</artifactId>
<groupId>com.hzx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-consumer-project</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
yml
server:
port: 8091
spring:
cloud:
nacos:
discovery:
server-addr: http://192.168.220.1:8848
namespace: 8302a253-b30a-4a13-bdeb-0caf566317b9
application:
name: nacos-consumer
启动类
java
@SpringBootApplication
@EnableDiscoveryClient
public class StartNacosConsumer {
public static void main(String[] args) throws Exception {
SpringApplication.run(StartNacosConsumer.class, args);
}
}
启动测试
先启动服务端再启动客户端
在nacos网站可以看到服务已经注册进nacos中
nacos配置负载均衡
改造生产者nacos-provider-project
controller层
java
@RestController
public class ProviderController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "/nacos/provider/get/{id}",method = RequestMethod.GET)
public String getNacosProvider(@PathVariable Integer id){
return "使用provider中的方法,端口号:"+port+",传来参数:"+id;
}
}
改造消费者nacos-consumer-project
配置负载均衡
java
@Configuration
public class ConsumerConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
java
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/nacos/consumer/get/{id}",method = RequestMethod.GET)
public String getNacosConsumer(@PathVariable Integer id){
return restTemplate.getForObject("http://nacos-provider/nacos/provider/get/"+id,String.class);
}
}
测试
现在启动两个生产者,先启动一个生产者然后修改一下端口号再启动一个生产者
现在有两个 生产者,端口号分别为8081和8082。
启动消费者消费者端口号为8091
现在通过apifox调用消费者的接口
根据返回值可以看到,消费者分别调用了两个生产者的接口,达成负载均衡的效果。
可以在nacos网站未各个生产者分配权重。权重越高被访问的频率越高,权重设置为0则实例完全不会被访问。
使用负载均衡,可以合理利用资源,服务器性能有差异,当实例部署在性能不同的机器上时,可以通过设置权重,让性能好的机器承担更多的用户请求;另外,在升级服务时,通过调整权重进行平滑升级,例如,把实例1权重调节为0,用户只能去调用实例2、实例3的情况,待实例1升级后,也可以将实例1的权重设置为0.1,让一部分用户先体验,实例1稳定后再调高权重。
nacos配置中心
SpringCLoud Alibaba的Nacos相对于SpringCloud而言,实现了Eureka和Config和Ribbon的作用,上面已经介绍了nacos对应eureka可ribbon的内容,下面介绍config的内容。
nacos的配置中心中,所有服务使用nacos上面的配置,不走本地配置。
创建命名空间
现在nacos网站上创建一个新的命名空间
修改生产者nacos-provider-project
增加一个配置文件bootstrap.properties
配置文件是先加载bootstrap再加载application,所有读取nacos的配置写在bootstrap配置里。
spring.application.name=nacos-provide-config-center
spring.cloud.nacos.config.server-addr=http://192.168.220.1:8848
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.namespace=8302a253-b30a-4a13-bdeb-0caf566317b9
spring.profiles.active=dev
spring.cloud.nacos.config.refresh-enabled=true
在nacos网站里同样需要配置
bootstrap.properties文件中输入的内容与在网页里配置的内容相一致
application.name会对应nacos上面配置文件的dataid值
server-addr是nacos的地址
file-extension是对应nacos上面配置文件的扩展名
namespace是对应nacos上面配置文件所属的命名空间
active是表示后缀使用哪个配置文件,例如nacos-provide-config-center-dev.yaml,nacos-provide-config-center-test.yaml
refresh-enabled是开启配置文件自动刷新(修改nacos的配置文件后默认不会自动刷新,除非重启服务。注意:需要结合@RefreshScope注解一起使用)
在controller层增加注解@RefreshScope
测试
启动生产者与消费者后,可以在nacos网站的配置中看到,端口号与本地不同。