SpringCloud Alibaba【二】nacos

nacos配置与使用

nacos初步使用

Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

简单来说,nacos可以用来管理一个springcloud项目中各个模块与组件。安装运行nacos后可以在专门的页面上看到注册进nacos的各个模块的信息。

以上是个人理解,如有不对,可在评论区纠正。

nacos安装与配置

GitHub下载地址

在此目录下进入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网站的配置中看到,端口号与本地不同。

相关推荐
小宋10214 小时前
多线程向设备发送数据
java·spring·多线程
鹦鹉0076 小时前
SpringMVC的基本使用
java·spring·html·jsp
努力的小雨6 小时前
还在为调试提示词头疼?一个案例教你轻松上手!
后端
魔都吴所谓6 小时前
【go】语言的匿名变量如何定义与使用
开发语言·后端·golang
陈佬昔没带相机7 小时前
围观前后端对接的 TypeScript 最佳实践,我们缺什么?
前端·后端·api
Livingbody8 小时前
大模型微调数据集加载和分析
后端
Livingbody8 小时前
第一次免费使用A800显卡80GB显存微调Ernie大模型
后端
橘子编程9 小时前
SpringMVC核心原理与实战指南
java·spring boot·spring·tomcat·mybatis
Goboy9 小时前
Java 使用 FileOutputStream 写 Excel 文件不落盘?
后端·面试·架构
Goboy9 小时前
讲了八百遍,你还是没有理解CAS
后端·面试·架构