注册中心Nacos
Nacos概述
什么是Nacos
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
常见的注册中心
- Eureka(原生,2.0遇到瓶颈,停止维护)
- Zookeeper(支持,专业的独立产品。例如:dubbo)
- Consul(原生,GO语言开发)
- Nacos
相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config
实现配置的动态变更。
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery
实现服务的注册与发现。
Nacos结构图
Nacos下载和安装
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.2.1.tar.gz或nacos-server-1.2.1.zip,解压任意目录即可
启动Nacos服务
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式)
启动命令:sh startup.sh -m standalone
Windows
启动命令:cmd startup.cmd 或者双击startup.cmd运行文件。
访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
服务注册
项目结构
springcloudalibaba
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.zysheep</groupId>
<artifactId>springcloudalibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>springcloudalibaba</name>
<modules>
<module>provider</module>
<module>cosumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
<cloud.version>Hoxton.RELEASE</cloud.version>
<alibaba.version>2.2.0.RELEASE</alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Hoxton -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${cloud.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>${alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
cosumer
pom
<!-- 服务注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
# 配置nacos注册中心
spring:
application:
name: nacos-cosumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class CosumerApplication{
// 开启ribbon负载均衡
// ribbon不是Spring cloud alibaba 的组件,是netflix公司提供的
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(CosumerApplication.class, args);
}
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class TestController{
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/cosumer/{str}")
public String echo(@PathVariable String str){
return restTemplate.getForObject("http://nacos-provider/provider/"+str,String.class);
}
}
}
provider
pom
<!-- 服务注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
# 配置nacos注册中心
spring:
application:
name: nacos-cosumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动类
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@Value("${server.port}")
String port;
@RestController
public class EchoController {
@RequestMapping(value = "/provider/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
log.info("调用了接口:{}",port);
return String.format("Hello Nacos Discovery %s port: %s",string,port);
}
}
}
启动服务
先启动provider提供服务,在启动cosumer消费服务
访问测试
Nacos配置管理
理解配置中心
什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。
配置主要有以下几个特点:
- 配置是独立于程序的只读变量
- 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
- 配置伴随应用的整个生命周期
- 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
- 配置可以有多种加载方式
- 常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
- 配置需要治理
- 同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理
什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了,不仅如此,分散中还包含着冗余;下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
配置中心的服务流程如下
- 用户在配置中心更新配置信息。
- 服务A和服务B及时得到配置更新通知,从配置中心获取配置
总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件
主流配置中心对比
目前市面上用的比较多的配置中心有:Spring Cloud Confifig、Apollo、Nacos和Disconf等。 由于Disconf不再维护,下面主要对比一下Spring Cloud Confifig、Apollo和Nacos。
对比项目 | Spring Cloud Confifig | Apollo | Nacos |
---|---|---|---|
配置实时推送 | 支持(Spring Cloud Bus) | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) |
版本管理 | 支持(Git) | 支持 | 支持 |
配置回滚 | 支持(Git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 |
权限管理 | 支持(依赖Git) | 支持 | 不支持 |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | 主流语言,提供了Open API | 主流语言,提供了Open API |
配置格式校验 | 不支持 | 支持 | 支持 |
单机读(QPS) | 7(限流所致) | 9000 | 15000 |
单击写(QPS) | 5(限流所致) | 1100 | 1800 |
3节点读 (QPS) | 21(限流所致) | 27000 | 45000 |
3节点写 (QPS) | 5(限流所致) | 3300 | 5600 |
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Confifig依赖Git场景不适合开 放的大规模自动化运维API。功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Confifig不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比 Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
Nacos配置管理
发布配置
首先在nacos发布配置,nacos-config-test服务从nacos读取配置。
浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单配置管理->配置列表:
在Nacos添加如下的配置:
Namespace: public
Data ID: nacos-config-test.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容:
common:
name: application1 config
获取配置
要想从配置中心获取配置添加nacos-confifig的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在bootstrap.yml添加配置:
spring:
application:
name: nacos-config-test
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
file-extension: yaml # application.name和file-extension拼装成Data ID
group: DEFAULT_GROUP
注意:要使用配置中心就要在bootstrap.yml中来配置,bootstrap.yml配置文件的加载顺序要比application.yml要 优先。
在nacos-config-test工程的controller中增加获取配置的web访问端点/,通过标准的spring @Value 方式
package cn.zysheep.springboot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version v1.0
* @ProjectName: springboot-learning-examples
* @ClassName: IndexController
* @Description: TODO(一句话描述该类的功能)
* @Author: 三月三
*/
@RestController
public class IndexController {
@Value("${common.name}")
private String common_name;
@GetMapping("/")
public String main(){
return common_name;
}
}
基于上面的例子,若要实现配置的动态更新,只需要进行如下改造:
package cn.zysheep.springboot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version v1.0
* @ProjectName: springboot-learning-examples
* @ClassName: IndexController
* @Description: TODO(一句话描述该类的功能)
* @Author: 三月三
*/
@RestController
public class IndexController {
@Value("${common.name}")
private String common_name;
// 注入配置文件上下文,实现配置的动态更新
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/")
public String main(){
return common_name;
}
//实现配置的动态更新
@GetMapping("/dynamicUpdate")
public String main1(){
return applicationContext.getEnvironment().getProperty("common.name");
}
}
我们通过nacos控制台更新common.name的配置值,再次访问web端点/dynamicUpdate,发现应用程序能够获取到最新 的配置值,说明spring-cloud-starter-alibaba-nacos-confifig
支持配置的动态更新。
配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
**配置集(Data ID) 😗*在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可 能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
**配置项 😗*配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形 式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项
**配置分组(Group)😗*配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有 相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默 认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集 可以定义一个group为:STUDENT_GROUP。
**命名空间(Namespace)😗*命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为 它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
获取某配置集的代码:
- nacos服务地址,必须指定
- namespace,如不指定默认public
- group,如不指定默认 DEFAULT_GROUP
- dataId,必须指定,名称为应用名称+配置文件扩展名
spring:
application:
name: nacos-ext-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
file-extension: yaml
namespace: fbbcbf8a-5d5f-45fc-9074-9b96677c1adb # 开发环境dev
group: DEFAULT_GROUP
自定义扩展的 Data Id 配置
ext-confifig扩展配置
Spring Cloud Alibaba Nacos Confifig可支持自定义 Data Id 的配置。 一个完整的配置案例如下所示:
spring:
application:
name: nacos-ext-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
file-extension: yaml
namespace: fbbcbf8a-5d5f-45fc-9074-9b96677c1adb # 开发环境dev
group: DEFAULT_GROUP
# config external configuration
# Data Id
# group:组名
#refresh:动态刷新
ext-config[0]:
data-id: ext-config-common01.yaml
group: COMMON_GROUP
refresh: true
ext-config[1]:
data-id: ext-config-common02.yaml
group: COMMON_GROUP
refresh: true
# 其中 n 的值越大,优先级越高。 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置的优先级最大。
# 相同的配置优先级大的会覆盖低优先级的配置,没有,就会互补配置
可以看到:
- 通过
spring.cloud.nacos.config.ext-config[n].data-id
的配置方式来支持多个 Data Id 的配置。 - 通过
spring.cloud.nacos.config.ext-config[n].group
的配置方式自定义 Data Id 所在的组,不明确配置 的话,默认是 DEFAULT_GROUP。 - 通过
spring.cloud.nacos.config.ext-config[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是 否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
Note :
spring.cloud.nacos.config.ext-config[n].data-id
的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时spring.cloud.nacos.config.file-extension
的配置对自定义扩 展配置的 Data Id 文件扩展名没有影响。
扩展配置优先级
扩展配置优先级是
spring.cloud.nacos.config.ext-config[n].data-id
其中 n 的值越大,优先级越高。 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置的优先级最大。
总结
Nacos用来干什么?
Nacos是阿里巴巴公司开源的项目,它用来实现配置中心和服务注册中心。
什么是服务发现?
在微服务架构中一个业务流程需要多个微服务通过网络接口调用完成业务处理,服务消费方从服务注册中心获取服 务提供方的地址,从而进行远程调用,这个过程叫做服务发现。
服务发现的流程是什么?
- 服务发现的客户端从服务注册中心获取服务列表
- 服务消费方通过客户端负载均衡获取服务实例地址,进行远程调用
什么是配置中心?
在微服务架构中为了统一管理各各微服务的配置信息专门设置配置中心,配置中心就是一种统一管理各种应用配置 的基础服务组件
配置中心的应用流程是什么?
- 发布配置,将配置信息发布到配置中心。
- 获取配置,配置中心客户端得到配置中心的通知,从配置中心获取配置
Spring Cloud是什么?
Spring Cloud是一套微服务开发框架集合,包括微服务开发的方方页面,Spring Cloud是一套微服务开发的标准, 集成了很多优秀的开源框架,比如有名的Netflflix公司的众多项目。
Spring Cloud Alibaba是什么?
Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud标准实现一套微服务开发框架集合,它和Netflflix一样都是 Spring Cloud微服务开发实现方案。
Dubbo服务开发流程是什么?
- 定义api工程。
- 方便其它服务原来api工程,远程调用dubbo服务。
- 定义api实现工程
- service实现类使用 @org.apache.dubbo.confifig.annotation.Service注解标记为dubbo服务
- 服务消费方开发
- 引入api工程依赖
- 使用org.apache.dubbo.confifig.annotation.Reference注解注入service,发起远程调用