spring cloud集成nacos,就是这么简单

nacos具备配置管理和服务注册发现的功能,官方建议是只在内网部署nacos服务,不要将其暴露到公网上。本篇我们讲一下如何在spring cloud应用中使用nacos的配置管理和服务注册发现的功能,在执行本文的各个操作前,请确保本地的nacos服务已正常启动。

本篇涉及到应用系统的pom文件的基本内容如下:

<?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.xk</groupId>
    <artifactId>springcloud-nacos-provider</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

        <!--mybatis启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--druid数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--lombok包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.1</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <!--版本关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
          
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.7.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

后面在系统中添加依赖,默认pom文件已包含如上的内容。

1、开启nacos配置管理功能

本部分我们讲一下spring cloud应用如何集成nacos来读取维护在nacos上面的配置数据。首先我们先创建一个普通的spring boot应用。

1.1 、引入nacos配置管理依赖

在系统的pom文件中添加如下内容:

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

1.2、修改配置文件

和spring cloud集成的时候,nacos配置中心的配置项只能放到bootstrap.yml(或bootstrap.properties)中。在resources下的bootstrap.yml中添加如下的配置:

spring:
  application:
    name: provider
  cloud:
    nacos:
      #配置中心
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        #命名空间对应的id,如果是在public空间,可以不配置此项
        namespace: c91a7f69-cefc-4ee3-8350-07ab87affd05

在nacos-spring-cloud中,nacos配置管理中的dataId的命名规则如下:

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

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

当通过配置文件来指定spring.profiles.active时,spring.profiles.active必须放在 bootstrap.properties 文件中。而且spring.profiles.active 为空时,dataId格式中对应的连接符 - 也将不存在,dataId 的拼接格式就变成 :

${prefix}.${file-extension}

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

以上我们的配置就是告诉nacos客户端,启动的时候去nacos上面读取dev命名空间下,group为DEFAULT_GROUP,并且dataId为provider.yaml的配置集的内容。

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataId 为 ${prefix}.${file-extension:properties} 为前缀的基础配置,还加载了dataId为 ${prefix}-${profile}.${file-extension:properties}的基础配置

1.3、新建nacos配置集

登录nacos服务,在配置管理列表选择dev命名空间(如果还没有dev命名空间,可以去命名空间下面创建),然后新建配置,dataId为provider.yaml,group使用默认的组,配置格式选择yaml,配置内容如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8
    username: root
    password: zdan

1.4、验证结果

因为我们的pom文件引入了mybatis的启动器配置,系统启动过程中会自动读取数据源配置,然后创建DataSource对象。如果系统能启动成功,就说明从nacos服务上读到了数据源的配置信息。启动我们的应用,发现打印了下面的日志,说明我们的配置是成功的。

2023-05-17 09:15:01.445  WARN 9560 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[provider] & group[DEFAULT_GROUP]
2023-05-17 09:15:01.467  INFO 9560 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-provider.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-provider,DEFAULT_GROUP'}]
2023-05-17 09:15:01.476  INFO 9560 --- [           main] com.xk.nacos.springcloud.App             : No active profile set, falling back to 1 default profile: "default"
2023-05-17 09:15:02.315  INFO 9560 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=838d775a-2a94-3625-a774-7acc513cf749
2023-05-17 09:15:02.687  INFO 9560 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2023-05-17 09:15:02.698  INFO 9560 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-05-17 09:15:02.698  INFO 9560 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.63]
2023-05-17 09:15:02.891  INFO 9560 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-05-17 09:15:02.891  INFO 9560 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1397 ms
2023-05-17 09:15:03.072  INFO 9560 --- [           main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2023-05-17 09:15:03.219  INFO 9560 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
2023-05-17 09:15:05.050  INFO 9560 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2023-05-17 09:15:05.974  INFO 9560 --- [           main] com.xk.nacos.springcloud.App             : Started App in 11.828 seconds (JVM running for 13.889)
2023-05-17 09:15:05.990  INFO 9560 --- [           main] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Listening config: dataId=provider, group=DEFAULT_GROUP
2023-05-17 09:15:05.994  INFO 9560 --- [           main] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Listening config: dataId=provider.yaml, group=DEFAULT_GROUP

2、开启nacos服务发现和注册功能

本部分我们创建两个spring cloud应用,来演示如何将服务信息注册到nacos,以及其他应用如何从nacos上面读取服务配置信息。

2.1、创建服务提供者

我们将第1部分创建的应用作为一个服务提供者,将它的信息注册到nacos上面。

2.1.1、引入nacos服务注册和发现依赖

首先在pom.xml中新增如下依赖:

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

2.1.2、修改配置文件

在工程的resources资源目录下创建application.yml文件,并添加如下内容:

server:
  port: 8081

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

由于bootstrap.yml中已经配置了spring.application.name,因此这里就不再配置它了。当然,此处也可以不创建application.yml文件,可以直接将此处的配置写到bootstrap.yml文件中。

2.1.3、新增接口

在controller层创建ProviderController文件,内容如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
    
    @GetMapping("hello")
    public String hello(){
        return "hello,2023";
    }
}

2.1.4、修改启动类

我们在启动类上面添加@EnableDiscoveryClient注解,内容如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDiscoveryClient
@SpringBootApplication
public class App {

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

}

2.1.5、启动服务

将启动类App启动,我们的服务信息就注册到nacos上面了。我们通过浏览器进入nacos服务管理页面,可以发现服务列表中多个一条服务的记录:

spring cloud集成nacos,就是这么简单
nacos-provider

其中服务名就是我们应用里面配置的spring.application.name的值。

点击服务详情,可以看到这个服务下面所有的ip和端口号。假如我们搭了一个由3台机器组成的集群,那么在这下面就能看到三条记录。

spring cloud集成nacos,就是这么简单

2.2、创建服务消费者

我们新增一个spring boot应用,应用内部通过服务名的方式去调用服务提供者的接口,底层会通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务的ip和端口信息。

2.2.1、引入nacos服务注册和发现依赖

首先在pom.xml中新增如下依赖:

       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡组件,用于将我们引用的服务转换成真实的ip和端口-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

2.2.2、修改配置文件

在工程的resources资源目录下创建application.yml文件,并添加如下内容:

server:
  port: 8080

spring:
  application:
    name: consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

注意,本项目不需要创建bootstrap.yml文件,服务发现的配置直接写到application.yml(或application.properties)文件就可以了

2.2.3、新增接口

新建BeanConfig配置类,内容如下:

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author xk
 * @since 2023.05.17 8:16
 */

@Configuration
public class BeanConfig {

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

在controller层创建ConsumerController文件,内容如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("hello")
    public String hello(){
        //此处直接写服务名称provider,不需要指定端口号
        return result = restTemplate.getForObject("http://provider/hello",String.class);
    }
}

2.2.4、修改启动类

我们在启动类上面添加@EnableDiscoveryClient注解,内容如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDiscoveryClient
@SpringBootApplication
public class App {

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

}

@EnableDiscoveryClient注解默认会将我们当前的应用信息注册到nacos服务列表,如果我们不想注册我们的服务,可以配置该注解的属性如下:

@EnableDiscoveryClient(autoRegister = false)

2.2.5、启动服务

将启动类App启动,然后浏览器访问如下路径:

http://127.0.0.1:8080/hello

可以看到,浏览器得到了如下的响应:

hello,2023

说明服务注册和发现功能正常。

结束语

觉得有收获的朋友,可以点击关注我,这样方便接收我后续的文章,多谢支持~


原文始发于微信公众号(IT人的天地):spring cloud集成nacos,就是这么简单

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/186537.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!