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网站的配置中看到,端口号与本地不同。

相关推荐
2401_895521342 分钟前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare17 分钟前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL23 分钟前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本2 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
lclcooky3 小时前
Spring 中使用Mybatis,超详细
spring·tomcat·mybatis
大佐不会说日语~5 小时前
Spring AI Alibaba 模块化重构:从单体到分层架构实践
人工智能·spring·重构
yhole5 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉5 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠6 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet6 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin