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

相关推荐
2402_857589368 分钟前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
一只爱打拳的程序猿27 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧28 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
假装我不帅2 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
神仙别闹2 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
计算机-秋大田3 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
货拉拉技术3 小时前
货拉拉-实时对账系统(算盘平台)
后端
掘金酱4 小时前
✍【瓜分额外奖金】11月金石计划附加挑战赛-活动命题发布
人工智能·后端