4

SpringCloud系列教程(二)之Nacos

 3 years ago
source link: https://blog.winterchen.com/2021/08/01/2021-07-23-spring-cloud-hoxton-2-nacos/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

阅读提醒:

  1. 本文面向的是有一定springboot基础者
  2. 本次教程使用的Spring Cloud Hoxton RELEASE版本
  • 什么是注册中心?
  • 什么是配置中心?
  • 如何在springcloud中使用Nacos?

在使用nacos之前我们需要理解nacos在整个微服务架构中担任了什么样的角色,在微服务架构中,注册中心是非常核心的基础服务之一,在微服务流行之前就已经出现在分布式架构中。比如Dubbo,Dubbo在国内是比较流行的分布式架构,也是一个非常实用的框架,提供了比较完备的服务治理功能,而服务治理的实现主要依靠注册中心。

本文中用到的demo源码地址:https://github.com/WinterChenS/spring-cloud-hoxton-study

什么是注册中心?

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

列举一个比较简单的生活例子:

  1. 小明要给小红打电话,需要从通讯录(注册中心)中获取到小红的电话号码(服务地址);
  2. 小明根据通讯录中的电话号码拨打小红的电话号码(服务请求);
  3. 小红接通了电话,并随后完成了通话;
  4. 后面再拨打小红的电话号码可以通过电话保存的号码进行拨打(本地缓存);

nacos在整个微服务架构中充当了通讯录的角色,服务之间的调用,监控等都需要通过注册中心进行获取服务的地址端口的映射,并且一般服务端都会有本地缓存,下次请求之前会查询本地的服务映射信息,可以减少网络请求提高服务的吞吐量。

什么是配置中心?

配置中心其实理解起来很简单,就是字面意思,把服务的配置集中在配置中心,可以实现动态的修改,避免了每次修改配置文件都需要重新发布服务的尴尬。

下载nacos,并启动

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。下载地址https://github.com/alibaba/nacos/releases,下载最新版的2.0版本。

下载完成后,解压,在解压后的文件的/bin目录下,windows系统点击startup.cmd就可以启动nacos。linux或mac执行以下命令启动nacos。

sh startup.sh -m standalone

登陆页面:http://localhost:8848/nacos/ 登陆用户nacos,登陆密码为nacos。

jdk版本

  • jdk: 1.8
  • maven: 3.3.9
  • nacos: 2.0

springcloud 和 springboot 版本

  • springcloud: Hoxton.RELEASE
  • springboot: 2.2.13.RELEASE
  • springcloud-alibaba: 2.2.6.RELEASE

首先我们新建一个springboot 基础项目,这里项目命名为:spring-cloud-hoxton-study

项目结构:

-spring-cloud-hoxton-study
|—spring-cloud-nacos-consumer
|—pom.xml

父pom文件加入依赖(spring-cloud-hoxton-study):


<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
<spring-boot.version>2.2.13.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- springBoot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- spring cloud alibaba 依赖 -->
<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>

子pom修改(spring-cloud-nacos-consumer):parent

<parent>
<groupId>com.winterchen</groupId>
<artifactId>spring-cloud-hoxton-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

子pom加入依赖(spring-cloud-nacos-consumer):

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

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

注意:这里只是放了主要的maven依赖,如果需要查看全部的依赖,请查看demo的源码

创建配置:bootstrap.properties 或者 bootstrap.yml

bootstrap.properties

spring.cloud.nacos.config.server-addr=127.0.0.1:8848

spring.application.name=winter-nacos-consumer

spring.profiles.active=dev

bootstrap.yml

spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
application:
name: winter-nacos-consumer
profiles:
active: dev

文中的:127.0.0.1:8848 就是上面搭建的nacos服务

之所以需要配置 spring.application.name是因为nacos默认获取配置文件是按照name作为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 来配置。目前只支持 propertiesyaml 类型。

在nacos配置中心创建配置文件

配置详情:

Data ID: winter-nacos-consumer-dev.yaml

Group: DEFAULT_GROUP

配置内容:

server:
port: 16011

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

test:
config:
refresh: true

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:

@Api("nacos api")
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController extends BaseController {

@Value("${test.config.refresh:true}")
private boolean refresh;

@GetMapping("/")
public CommonResult<Boolean> get() {
return CommonResult.success(refresh);
}

}

我们可以通过请求上面的接口: http://127.0.0.1:16011/nacos

返回的结果是:true

然后修改一下配置中心的:

test:
config:
refresh: false

可以发现控制台的日志有打印:

2021-07-27 11:25:13.973  INFO 17240 --- [8.25.36.41_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [test.config.refresh]

再请求一次就可以发现结果变成了:false

服务注册与发现

仍然使用上面的项目进行

添加依赖:

<!-- Nacos 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

以下是完整的配置

server:
port: 16011

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

test:
config:
refresh: true

启动类增加:@EnableDiscoveryClient 以启用服务注册与发现

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class SpringCloudNacosApplication {

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

}

接下来需要测试一下服务注册与发现的功能是否正常,所以我们需要复制原有的服务spring-cloud-nacos-consumer 并改名为:spring-cloud-nacos-provider

当前工程结构:

-spring-cloud-hoxton-study
|—spring-cloud-nacos-consumer
|—spring-cloud-nacos-provider
|—pom.xml

spring-cloud-nacos-consumer 服务下的NacosController 增加方法:echo

@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController {

@Value("${test.config.refresh:true}")
private boolean refresh;

private final RestTemplate restTemplate;

@Autowired
public NacosController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}

@GetMapping("")
public boolean get() {
return refresh;
}

@GetMapping("/echo/{str}")
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://winter-nacos-provider/nacos/echo/" + str, String.class);
}

}

spring-cloud-nacos-provider 服务下的NacosController 增加方法:echo

@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController {

@Value("${test.config.refresh:true}")
private boolean refresh;

@GetMapping("")
public boolean get() {
return refresh;
}

@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}

}

开始测试:

测试之前需要给spring-cloud-nacos-provider 进行配置中心的配置:

  1. 修改bootstrap.ymlspring.application.name=winter-nacos-provider ;
  2. 在配置中心新增配置文件:winter-nacos-provider-dev.yaml 具体的配置如下:
server:
port: 16012

spring:
cloud:
nacos:
discovery:
server-addr: 118.25.36.41:8848
profiles:
active: dev

test:
config:
refresh: true

分别启动两个服务,然后调用接口: http://127.0.0.1:16011/nacos/echo/hello

请求的结果:

本文介绍了springcloud如何使用nacos作为配置中心和注册中心,作为微服务中比较核心的两个基础功能,需要熟练的在实战中进行使用,后面也会陆续介绍如何与其他的组件进行组合使用。

上面使用的restTemplate进行服务的调用,这样显然在实际的使用当中是非常的不便利的,那么在实际应用中使用什么方式进行远程调用呢?下一篇将介绍如何使用open feign进行远程服务调用的。

https://github.com/WinterChenS/spring-cloud-hoxton-study

参考文献:

Nacos Spring Cloud 快速开始


Recommend

  • 22
    • www.eknown.cn 4 years ago
    • Cache

    SpringCloud Nacos 配置中心

    上一篇介绍了 Spring Cloud 中配置中心的使用,地址: https://mp.weixin.qq.com/s/QcIaGAYUvPBIqJM8oMbVvQ 这一节介绍 Nacos 作为配置中...

  • 7

    SpringCloud Nacos 本文主要分为SpringCloud Nacos的设计思路 简单分析一下触发刷新事件后发生的过程以及一些踩坑经验 org.springframework.cloud.bootstrap.config.PropertySourceLocator

  • 12
    • tomoya92.github.io 3 years ago
    • Cache

    SpringCloud学习记录 - Nacos

    作者:朋也 日期:2021-02-02 版权声明:自由转载-非商用-非衍生-保持署名( 创意共享3.0许可证 ) Nacos是啥? Nacos是alibaba...

  • 5
    • blog.winterchen.com 3 years ago
    • Cache

    SpringCloud系列教程开篇

    SpringCloud 作为目前最热门的技术之一,拥有众多的开发者的爱戴,开箱即用,简单配置的特性让开发者只需要关注业务代码的开发,无需在繁琐和架构中挣扎。SpringCloud也成为了java开发人员必须了解和使用的技能。 作为系列的开篇,全系列会介绍hoxton的...

  • 3
    • blog.winterchen.com 3 years ago
    • Cache

    SpringCloud系列教程(三)之Open Feign

    SpringCloud系列教程(三)之Open Feign August 02, 2021 14801 阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Sprin...

  • 7

    SpringCloud系列教程(四)之SpringCloud Gateway August 03, 2021 4982 **阅读提醒: 本文面向的是有一定springboot基础者 本次教程...

  • 3
    • www.cnblogs.com 2 years ago
    • Cache

    springcloud~nacos中的共享配置文件

    共享配置文件,即多个应用配置中有共同的配置项,如redis,mysql,hystrix等等,这些公共配置,我们可以抽象出来,通过nacos的shared-configs来共享。 共享配置,需要有扩展名,我们以yaml为例,添加一个例子 const.yaml const: ema...

  • 3
    • xiaomozhang.github.io 2 years ago
    • Cache

    springcloud结合nacos实现灰度发版方案

    最近和组内伙伴一起分享讨论了灰度方案,先将内容整理出来, 具体如下: 灰度方案设计及demo实现 组件设计及原理 关键代码实现 项目资料一. 架构设计

  • 6

    在使用SpringCloud开发微服务时,经常会遇到一些比较小的后台参数配置,这些配置不足以单独开一张表去存储,而且其他服务会读取该参数。比如IP白名单。这时,使用Nacos去保存和读取就比较方便。 使用SpringCloud的项目 启动Nacos

  • 3

    【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验 精选 原创 服务治理介绍什么是...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK