【On Nacos】SpringCloud 方式使用 Nacos

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 本文介绍下如何在 Spring Cloud 项目中使用 Nacos,Nacos 主要分为两个部分,配置中心和服务注册与发现。在使用 Spring Cloud 项目中使用 Nacos ,首先要保证启动一个 Nacos 服务,具体可以参考《[快速上手 Nacos](https://github.com/li-xiao-shuang/on-nacos/blob/master/docs/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%20Nacos.md)》来搭建一个单机的 Nacos 服务。
如果大家想要了解更多的 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

https://tva1.sinaimg.cn/large/e6c9d24ely1h3kow3r2tkj21680u0wgu.jpg

添加依赖

配置创建好就可以在控制台 配置管理-配置列表中查看到。接下来演示下怎么在 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:8848
spring.cloud.nacos.config.name=nacos-datasource
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.username=nacos
spring.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 获取配置信息

https://tva1.sinaimg.cn/large/e6c9d24ely1h3lzju1ml3j21zq0hoadk.jpg

@ConfigurationProperties 注解绑定配置到类

/**
 * @author lixiaoshuang
 */
@Data
@ConfigurationProperties(prefix = "spring.datasource")
@Component
public 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 获取配置信息

https://tva1.sinaimg.cn/large/e6c9d24ely1h3lzqevse3j21za0ey77u.jpg

服务注册&发现

服务注册

在项目中添加以下依赖:

<!--注册中心-->
<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:8848
spring.cloud.nacos.discovery.username=naocs
spring.cloud.nacos.discovery.password=nacos

当添加完配置启动服务以后看到下面这段日志,就说明服务注册成功了。

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

https://tva1.sinaimg.cn/large/e6c9d24ely1h3m1kf4qllj228v0u0naz.jpg

服务发现

整合 @LoadBalanced RestTemplate

首先模拟一个订单服务的接口,可以通过服务发现的方式调用此接口

/**
 * @author lixiaoshuang
 */
@RestController
public 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 的订单信息,看接口是否能调通:

https://tva1.sinaimg.cn/large/e6c9d24ely1h3m2ii2lp6j20yy07ydgc.jpg

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

/**
 * @author lixiaoshuang
 */
@RestController
public 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} 接口获取订单信息。

https://tva1.sinaimg.cn/large/e6c9d24ely1h3m2wozka4j20xi0akt98.jpg

观察 order 服务的日志会发现有远程调用的日志

https://tva1.sinaimg.cn/large/e6c9d24ely1h3m2xxo8wcj218c0hwmy7.jpg

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
448 13
|
4月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
310 0
|
24天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
78 5
|
2月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
177 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
142 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
2月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
78 0
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
62 0