CDN加速

文档中心 容器服务 步骤三 应用使用nacos 实现配置管理和服务注册发现

步骤三 应用使用nacos 实现配置管理和服务注册发现

更新时间:2022-01-24 17:26:23

本文主要面向 Spring Cloud 的使用者,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务注册发现。

pom依赖管理

对于spring-cloud项目,其中cloud相关以来的版本控制可由springcloud进行统一管理,同样的,nacos或其他alibaba相关依赖也可以由spring-cloud-alibaba进行相应依赖的版本控制,以下为一个parent的pom示例,开发者只需要依赖此pom作为父项目即可在不同项目中统一相应的springcloud或springcloudalibaba相关组件版本。

<?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>cn.mastercom</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>cloud-parent</name>
    <description>Parent Pom for Spring Cloud</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <spring-cloud.version>2.2.6.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>pring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

其中spring-cloud版本、spring-cloud-alibaba版本、spring-boot版本建议关系如下:
毕业版本依赖关系(推荐)
2亿人见证IG夺冠 火的还不只是直播!

如果不希望引入parent依赖,也可直接在项目的pom文件中加入dependencyManagement节点内容进行版本依赖管理,选择合适的springcloud版本及springcloudalibaba版本即可。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>pring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


启动配置管理

  1. 添加依赖
    在pom文件中加入以下依赖项,其中版本由dependencyManagement进行管理,无需配置
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置修改
    在bootstrap.yml文件中配置Nacos server的地址和应用配置相关信息
spring:
  application:
    name: service-example
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
        prefix: service-example
        namespace: public
        group: DEFAULT_GROUP
  profiles:
    active: dev

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:

> ${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置

  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

其中namespace和group是nacos做环境隔离的配置项,可以指定不同的环境,更好的管理开发、测试、生产的配置文件管理。

  1. 配置自动更新
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}
  1. 首先在Nacos Server中public命名空间下增加配置文件,其中
    Data ID为 ce-example.yml,Group为DEFAULT_GROUP,配置格式为YAML,内容如下:
useLocalCache: true
  1. 启动程序,此时访问http://localhost:8080/config/get 返回内容为true。

  2. 修改Nacos Server中的配置文件为:

useLocalCache: false
  1. 再次访问http://localhost:8080/config/get 返回内容为false。

  2. Nacos Config可以在应用启动时加载配置文件,亦可以加载多个配置文件,更进一步的使用请参阅Nacos Config 相关介绍。

启动服务发现

本节通过实现一个简单的 echo service 演示如何在您的 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:
2亿人见证IG夺冠 火的还不只是直播!

  1. 添加依赖
    在pom文件中加入以下依赖项,其中版本由dependencyManagement进行管理,无需配置
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 服务提供者配置修改

    • 在服务提供者application.yml文件中配置Nacos server的地址和应用配置相关信息。
      根据步骤二中配置的访问方式,可以是本地域名或者IP地址的方式。
    server:
      port: 8070
    spring:
      application:
        name: service-provider
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            namespace: public
            group: DEFAULT_GROUP
    
    • 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(NacosProviderApplication.class, args);
        }
    
        @RestController
        class EchoController {
            @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
            public String echo(@PathVariable String string) {
                return "Hello Nacos Discovery " + string;
            }
        }
    }
    
  2. 服务消费者配置修改

    • 在服务消费者application.yml文件中配置Nacos server的地址和应用配置相关信息
    server:
      port: 8080
    spring:
      application:
        name: service-consumer
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            namespace: public
            group: DEFAULT_GROUP
    
    • 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成
    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosConsumerApplication {
    
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(NacosConsumerApplication.class, args);
        }
    
        @RestController
        public class TestController {
    
            private final RestTemplate restTemplate;
    
            @Autowired
            public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
    
            @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
            public String echo(@PathVariable String str) {
                return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
            }
        }
    }
    
  3. 启动服务提供者,此时可以在Nacos Server的服务列表中发现注册的服务
    2亿人见证IG夺冠 火的还不只是直播!

  4. 启动服务消费者调用http://localhost:8080/echo/2018 ,返回内容为 Hello Nacos Discovery 2018。此时服务消费者通过Nacos发现服务提供者信息并成功调用。

本篇文档内容对您是否有帮助?
有帮助
没帮助
提交成功!非常感谢您的反馈,我们会继续努力做到更好!