Nacos入门之Nacos简单demo示例(idea工具)

文章目录

  • 1、使用idea 创建简单的Nacos入门示例
    • 1.1、nacos服务提供者注册
    • 1.2、nacos服务消费者注册
  • 2、远程调用Ribbon
    • 2.1、什么是Ribbon
    • 2.2、具体使用
    • 2.3、验证Nacos自带负载均衡
    • 2.4、Nacos服务配置中心
      • 2.4.1、YML配置
      • 2.4.2、启动类
      • 2.4.3、业务类(主要内容)
      • 2.4.4、Nacos配置规则
      • 2.4.5、测试


提示:以下是本篇文章正文内容,下面案例可供参考

1、使用idea 创建简单的Nacos入门示例

1.1、nacos服务提供者注册

聚合项目:由于聚合带来的诸多好处,在SpringBoot项目开发中也广泛采用,开发中将SpringBoot项目按照功能分成子模块开发,所以我们使用Sping Cloud Alibaba 完成项目的时候,也是采用聚合项目来完成的。
Nacos入门之Nacos简单demo示例(idea工具)_第1张图片

直接下一步依赖都不用勾选☑️:
父项目构建完成后,将src 目录删除掉

然后修改pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <!--TODO这个地方不能填 2.2.5.RELEASE ,版本之间不兼容的、需要注意⚠️ -->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudAlibabaStudy</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloudAlibabaStudy</name>
    <packaging>pom</packaging>
    <description>SpringCloudAlibabaStudy</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba-version>2.2.5.RELEASE</spring-cloud-alibaba-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>cloudalibaba-nacos-9001</module>
    </modules>
</project>

创建子模块:
Nacos入门之Nacos简单demo示例(idea工具)_第2张图片

# 将子模块项目的pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>SpringCloudAlibabaStudy</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cloudalibaba-nacos-9001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloudalibaba-nacos-9001</name>
    <description>cloudalibaba-nacos-9001</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

子模块的pom.xml配置完成✅后还需在父项目的pom.xml文件中添加

# 模块
<modules>
        <module>cloudalibaba-nacos-9001</module>
</modules>

此时pm的配置已经完成了。
yml文件配置:
在子模块下创建一个application.yml文件内容如下:

server:
  port: 9001
Spring:
  application:
    name: nacos-provider
  cloud:
    nacos: 
      discovery:
        server-addr: localhost:8080 #这个地址是nacos的地址
management:
  endpoint:
    web:
      exposure:
        include: '*'

在子模块的启动项添加@EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaNacos9001Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaNacos9001Application.class, args);
    }

}

账号密码默认是:nacos/nacos
Nacos入门之Nacos简单demo示例(idea工具)_第3张图片

1.2、nacos服务消费者注册

右击项目新建模块
Nacos入门之Nacos简单demo示例(idea工具)_第4张图片

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>SpringCloudAlibabaStudy</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cloudalibaba-consumer-nacos-8083</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloudalibaba-consumer-nacos-8083</name>
    <description>Demo project for Spring Boot</description>
    <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>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml文件内容

server:
  port: 8083
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      server-addr: loaclhost:8080

management:
  endpoint:
    web:
      exposure:
        include: '*'

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConsumerNacos8083Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConsumerNacos8083Application.class, args);
    }

}

父项目pom.xml文件中models中将本模块添入

启动即可
Nacos入门之Nacos简单demo示例(idea工具)_第5张图片

2、远程调用Ribbon

大家现在可能很疑惑,这个服务消费者不是要吊用具体的服务吗?但是现在仅仅是创建出来了,和上面的服务者也没有多大的区别?
是这样的,我们现在想要让这个服务的消费者去调用服务提供者,我面就需要通过Ribbon来进行调用,那么首先我们先来了解Ribbon。

2.1、什么是Ribbon

他是一个居于HTTP和TCP客户端负载均衡器。他虽然只是一个工具库,他却是每一个微服务的基础设施,因为实际上,对于服务间调用、API网关请求转发都是需要经过Ribbon负载均衡来实现。总体来说,Ribbon的主要作用是:从注册服务器拿到对应服务列表后以负载均衡的方式访问对应服务。
何时使用Ribbon呢?一般情况下当一个模块需要从另外一个模块获取数据时就需要使用Ribbon的远程调用功能了。
要注意的是Nacos已经整合了Ribbon,所以我们想要使用只需要导入Sprng Cloud Alibaba Nacos的依赖就可以直接使用了。
Nacos入门之Nacos简单demo示例(idea工具)_第6张图片

2.2、具体使用

RestTemplate封装了Ribbon调用的过程,其中getForObject是常用的方法,同时还哟啊在服务消费者中配置RestTemplate:

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
	return new RestTemplate();
}

restTeamplate.getForObject(arg1,arg2,arg3...);

第一个参数URL表示被调用的目标Rest接口为止

  1. url的第一部分是在Nacos中注册的服务提供者名称,如果多个服务提供者注册相同名称,Ribbon会自动寻找其中一个服务提供者,并且调用接口方法。这个就睡负载均衡功能。
  2. url后半部分是控制器的请求路径。
    第三个参数是可变参数
  3. 是传递给url的动态参数,使用参数时需要在url上需要使用{1},{2},{3}进行参数占位,这样传递的参数就会自动替换占位符。

2.3、验证Nacos自带负载均衡

现在知道了如果我们想要让服务消费者consumer-nacos-8083调用服务提供者nacos-9001或者 9002 ,那么必然要使用Ribbon,所以我面要做的第一件事情就是先让9001或者 9002 服务对外提供借口,用户访问。

内容如下:

@RestController
public class DemoController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/study")
    public String getServerPort(){
        return "Hello Nacos DisCovery "+serverPort;
    }
}

在消费者的applicatin.yml文件中添加以下内容:

# 消费者将要去访问的微服务名称
service-url:
  nacos-user-service: http://nacos-provider

启动类中输入RestTemplate对象

@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConsumerNacos8083Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConsumerNacos8083Application.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

创建一个消费者接口在DemoController中

@RestController
public class DemoController {

	#自动注入restTemplate对象
    @Autowired
    private RestTemplate restTemplate;
    #读取配置文件中的配置信息
    @Value("${service-url.nacos-user-service}")
    private String serviceURL;

    @GetMapping(value = "consumer/nacos")
    public String getDiscovery(){
        return restTemplate.getForObject(serviceURL+"/study",String.class);
    }
}

测试结果:

访问:http://localhost:8080/cosumer/nacos
结果:Hello Nacos Discovery9001/9002

2.4、Nacos服务配置中心

Nacos入门之Nacos简单demo示例(idea工具)_第7张图片

pom.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>SpringCloudAlibabaStudy</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cloudalibaba-config-3377</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloudalibaba-config-3377</name>
    <description>Demo project for Spring Boot</description>
    <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>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.4.1、YML配置

要注意的是这里我们要配置两个,因为Nacos同SpringCloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,boostarp优先级高于application
分别要配置的是,这里bootstrap.yml配置好了以后,作用是两个,第一让3377这个服务注册到Nacos中,第二个作用就是去Nacos中去读取指定后缀为yaml的配置文件:
bootstarp.yml

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos 服务注册中心地址
      config:
        server-addr: localhost:8848 # Nacos 作为配置中心地址
        file-extension: yaml # 指定yaml格式的配置

application.yml

spring:
	profiles:
		active: dev

2.4.2、启动类

@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConfig3377Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConfig3377Application.class, args);
    }

}

2.4.3、业务类(主要内容)

这里的@RefreshScope 实现配置自动更新,意思为如果想要使配置文件中的配置修改后不用重启项目即生效,可以使用@RefieshScope配置来实现

@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getCOnfigInfo(){
        return configInfo;
    }
}

2.4.4、Nacos配置规则

在Nacos Spring Cloud 中,dataId 的完整格式如下(详情可以参考官网https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html);

p r e f i x − {prefix}- prefix{spring.profiles.active}.${file-extension}

  1. prefix默认为spring.application.name 的值,可以通过配置项spring.cloud.nacos.config.prefix来配置。
  2. spring.profiles.active 即为当前环境对应的 profile,注意:**当spring.profiles.active 为空时,对应连接的连接符 - 也将不存在,dataId 的拼接格式成为 ${prefix}.${file-extension} ** (不能删除)
  3. file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。当前只支持 propertiesyaml 类型。
  4. 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新;
  5. 所以根据官方给出的规则我面最终需要在Nacos 配置中心添加的配置文件的名称规则和名字为:

s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{spring.profiles.active}.${file-extension}
Nacos-config-client-dev.yaml
微服务名称-当前环境-文件格式
Nacos入门之Nacos简单demo示例(idea工具)_第8张图片

在nacos的配置管理中的配置列表下创建一个配置信息
在这里插入图片描述
Nacos入门之Nacos简单demo示例(idea工具)_第9张图片

config:
	info: nacos config center,version = 1 

然后在配置中心就会看到刚刚发布的配置
Nacos入门之Nacos简单demo示例(idea工具)_第10张图片

2.4.5、测试

启动服务访问服务来测试:http://localhost:3377/config/info
Nacos入门之Nacos简单demo示例(idea工具)_第11张图片

你可能感兴趣的:(nacos,java)