本人学习中的简单笔记,本文写的极其不详细,慎看!!!
Nacos 简介
Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 特性介绍
Nacos 具有以下特性:
- 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
- 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- 动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
- 服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。
主要的两大功能
注册中心
让应用相互认识
功能:健康检查,路由转发,远程调用
配置中心
动态修改线上配置
功能:开关,阈值,枚举类
安装
下载地址
以2.2.1版本为例子,其他高版本配置可能有调整,介意请参考其他教程
Release 2.2.1 (Mar 17th, 2023) · alibaba/nacos (github.com)
解压目录不得有中文
配置文件
解压后进入conf修改配置修改conf目录下的application.properties
添加其中的nacos.core.auth.plugin.nacos.token.secret.key配置,在配置项中填入一个不低于32位的字符串后保存即可
Base64 在线编码解码 | Base64 加密解密 - Base64.us
nacos.core.auth.plugin.nacos.token.secret.key=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=
启动
nacos/bin目录执行
startup.cmd -m standalone
进入网址
http://127.0.0.1:8848/nacos/
用户名密码 都是nacos
配置springboot
引入依赖
引入阿里巴巴的统一依赖管理
<!-- spring cloud alibaba https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/README-zh.md
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
再引入配置中心的依赖,无需设置版本,上一个依赖管理会自动选择版本
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
为后续引入配置做准备
<!--SpringBoot 2.4版本之后 SpringCloud 2020,需要引入该依赖,才能读取bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
resource增加bootstrap.properties
# 注册中心的名字
spring.application.name=member
## 启动环境,nacos会根据环境读不同的配置dataId:member-dev.properties
spring.profiles.active=dev
## nacos server地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
## 配置中心文件后缀,默认properties
spring.cloud.nacos.config.file-extension=properties
插入一个bootstrap和application的运用场景的区别
bootstrap常见应用场景:
(1)bootstrap配置文件中的配置一般是引导配置,类似于bios,用于连接到spring cloud配置中心,加载应用真正需要的配置数据,如:
spring.application.name 和 spring.cloud.config.server.git.uri
(2)配置一些固定的不能被覆盖的属性
默认情况下,本地的配置文件不能覆盖远程配置
(3)配置加密解密外部配置信息的相关属性
application常见应用场景:spring boot项目的自动化配置
注意:在一些情况上不用区分这两个配置文件,只需使用application.yml即可,把全部配置信息都写在这里,效果基本是一致的
简单说,springboot一般用application,springcloud用bootstrap,而且bootstrap优先级高于application
测试
进入nacos创建配置如下
其中Data ID命名规则如下
${应用名}-${环境标识}.properties/yml
按照bootstrap.application中的配置做修改
创建测试Controller
@RefreshScope//该注解会识别该区域 并实时更新nacos中的配置信息
@RestController
public class TestController {
@Value("${test.nacos}")
private String testNacos;
@GetMapping("/hello")
public String hello() {
return String.format("Hello %s!", testNacos);
}
}
启动项目后,访问网站成功(member是我自己配置的,正常只需要访问http://127.0.0.1:端口号/helllo)
配置中心
配置中心就是一种统一管理各种应用配置的基础服务组件,它将将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
多环境配置
引入依赖
在上面安装测试中已经引入
添加配置
nacos中添加配置如下
访问成功
命名空间
主要可以用与项目隔离或者不同生产环境配置分离
bootstrap引入配置(这里的namespace是命名空间ID)
## nacos命名空间
spring.cloud.nacos.config.namespace=train
注册中心
注册中心是微服务架构中的纽带,类似于“通讯录”,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址并进行调用。注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的,更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。
引入依赖
<!-- 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
bootstrap中引入
## nacos server注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.namespace=train
注册成功
在nacos中就可以看到我配置好的多个服务
同时可以进行上下线,编辑等操作
服务间调用
以引入feign作为演示
business服务下的test接口
@RestController
public class Test {
@GetMapping("/hello")
public String hello(){
return "hello,Feign!";
}
}
batch
新增方法以调用business的test接口
@FeignClient(name="business")
public interface businessFeign {
@GetMapping("/business/hello")
String hello();
}
新增测试接口测试是否调用成功
@RestController
public class Test {
@Resource
private businessFeign feign;
@GetMapping("/hello")
public String hello(){
return feign.hello();
}
}