如果大家想要理解更多的 Nacos 教程,欢送 star 《on-nacos》开源我的项目。基于 Nacos 2.x 的入门、原理、源码、实战介绍,帮忙开发者疾速上手 Nacos。

本文介绍下如何在 Spring Cloud 我的项目中应用 Nacos,Nacos 次要分为两个局部,配置核心和服务注册与发现。在应用 Spring Cloud 我的项目中应用 Nacos ,首先要保障启动一个 Nacos 服务,具体能够参考《疾速上手 Nacos》来搭建一个单机的 Nacos 服务。

Nacos 接入 Spring Cloud 的源代码能够参考 spring-cloud-alibaba 这个我的项目,感兴趣的敌人能够查看源代码。Spring Cloud Alibaba 的版本对应关系能够参考:版本阐明 Wiki

本篇文章的具体的代码示例点击【nacos-spring-cloud】查看

配置核心

创立配置

关上控制台 http://127.0.0.1:8848/nacos ,进入 配置管理-配置列表 点击+号新建配置,这里创立个数据源配置例子: nacos-datasource.yaml

spring:    datasource:     name: datasource     url: jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useDynamicCharsetInfo=false&useSSL=false     username: root     password: root     driverClassName: com.mysql.jdbc.Driver

增加依赖

配置创立好就能够在控制台 配置管理-配置列表中查看到。接下来演示下怎么在 Spring Cloud 我的项目中获取到 Nacos 中的配置信息。

须要在我的项目中增加以下依赖:

<!--配置核心--><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>    <version>${latest.version}</version></dependency>

如果我的项目的 Spring Boot 版本 小于 2.4.0 须要在我的项目中创立 bootstrap.properties 而后在我的项目中的 bootstrap.properties 文件中增加 nacos 的一些配置:

spring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.name=nacos-datasourcespring.cloud.nacos.config.file-extension=yamlspring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacos
Spring Boot 2.4.0 版本开始默认不启动 bootstrap 容器 本我的项目演示如何在 Spring boot < 2.4.0 版本应用 nacos。如果 Spring Boot 版本 ≥ 2.4.0 能够参考 **Nacos Config 2.4.x Example 进行配置

在 SpringCloud Alibaba 中,Nacos dataId 的拼接格局为:

${prefix} - ${spring.profiles.active} . ${file-extension}
  • prefix默认为spring.application.name的值,也能够通过配置项 @spring.cloud.nacos.config.prefix`来配置。
  • spring.profiles.active即为以后环境对应的 profile,详情能够参考 Spring Boot文档

    留神,当 active profile 为空时,对应的连接符-也将不存在,dataId 的拼接格局变成${prefix}.${file-extension}
  • file-extension为配置内容的数据格式,能够通过配置项spring.cloud.nacos.config.file-extension来配置。

获取配置

@Value 注解获取配置

/** * @author lixiaoshuang */@RestController@RequestMapping(path = "springcloud/nacos/config")public class AnnotationGetController {        @Value(value = "${spring.datasource.name:}")    private String name;        @Value(value = "${spring.datasource.url:}")    private String url;        @Value(value = "${spring.datasource.username:}")    private String username;        @Value(value = "${spring.datasource.password:}")    private String password;        @Value(value = "${spring.datasource.driverClassName:}")    private String driverClassName;        @GetMapping(path = "annotation/get")    private Map<String, String> getNacosDataSource2() {        Map<String, String> result = new HashMap<>();        result.put("name", name);        result.put("url", url);        result.put("username", username);        result.put("password", password);        result.put("driverClassName", driverClassName);        return result;    }}

启动服务后,通过拜访 http://localhost:8333/springcloud/nacos/config/annotation/get 获取配置信息

@ConfigurationProperties 注解绑定配置到类

/** * @author lixiaoshuang */@Data@ConfigurationProperties(prefix = "spring.datasource")@Componentpublic class NacosDataSourceConfig {        private String name;        private String url;        private String username;        private String password;        private String driverClassName;}/** * @author lixiaoshuang */@RestController@RequestMapping(path = "springcloud/nacos/config")public class BindingClassController {        @Resource    private NacosDataSourceConfig nacosDataSourceConfig;            @GetMapping(path = "binding/class/get")    private Map<String, String> getNacosDataSource() {        Map<String, String> result = new HashMap<>();        result.put("name", nacosDataSourceConfig.getName());        result.put("url", nacosDataSourceConfig.getUrl());        result.put("username", nacosDataSourceConfig.getUsername());        result.put("password", nacosDataSourceConfig.getPassword());        result.put("driverClassName", nacosDataSourceConfig.getDriverClassName());        return result;    }}

启动服务后,通过拜访 http://localhost:8333/springcloud/nacos/config/binding/class/get 获取配置信息

服务注册&发现

服务注册

在我的项目中增加以下依赖:

<!--注册核心--><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>    <version>${latest.version}</version></dependency>

而后在我的项目中的 application.properties 文件中增加 nacos 的一些配置:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.cloud.nacos.discovery.username=naocsspring.cloud.nacos.discovery.password=nacos

当增加完配置启动服务当前看到上面这段日志,就阐明服务注册胜利了。

nacos registry, DEFAULT_GROUP SPRING-CLOUD-CONFIG 192.168.1.8:8444 register finished

服务发现

整合 @LoadBalanced RestTemplate

首先模仿一个订单服务的接口,能够通过服务发现的形式调用此接口

/** * @author lixiaoshuang */@RestControllerpublic class OrderServiceController {        @GetMapping("/order/{orderid}")    public String echo(@PathVariable String orderid) {        System.out.println("接到近程调用订单服务申请");        return "[ORDER] : " + "订单id:[" + orderid + "] 的订单信息";    }}

先拜访下 http://localhost:8444/order/1234 获取订单id 为 1234 的订单信息,看接口是否能调通:

接下来在模仿一个业务接口,调用订单接口。这里通过应用 @LoadBalanced 注解使 RestTemplate 具备负载平衡和服务发现的能力,这样就能够通过指定服务名调用。

/** * @author lixiaoshuang */@RestControllerpublic class RestTemplateController {        @Autowired    public RestTemplate restTemplate;        @Bean    @LoadBalanced    public RestTemplate RestTemplate() {        return new RestTemplate();    }        @GetMapping("/call/order/{orderid}")    public String callEcho(@PathVariable String orderid) {        // 拜访利用 SPRING-CLOUD-CONFIG 的 REST "/order/{orderid}"        return restTemplate.getForObject("http://SPRING-CLOUD-CONFIG/order/" + orderid, String.class);    }}

拜访接口 http://localhost:8444/call/order/1234 获取订单 1234 的订单信息,外部将通过服务名 SPRING-CLOUD-CONFIG 发现服务,并调用 /order/{orderid} 接口获取订单信息。

察看 order 服务的日志会发现有近程调用的日志