Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去 管理配置,各个服务从配置中心中获取配置。
为什么用配置中心?
传统应用配置往往是本地静态配置,修改起来非常麻烦。而且在发布的时候,也容易出现问题,格式不标准等,使用配置中心,对配置进行统一管理,各个服务从配置中心中获取配置,实现动态配置。让配置标准化。
配置中心的服务流程如下:
1、用户在配置中心更新配置信息。
2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。
Data ID: nacos‐simple‐demo.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: common:
config1: something
新建项目,引入依赖:
com.alibaba.nacos
nacos‐client
1.1.3
类:
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
//nacos 地址
String serverAddr = "127.0.0.1:8848";
//Data Id
String dataId = "nacos‐simple‐demo.yaml";
//Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String dataId, String group, long timeoutMs
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
}
}
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可 能包含了数据源、线程池、日志级别等配置项。
配置项
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形 式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,不同的配置分组下可以有 相同的配置集(Data ID)。配置分组的名称默 认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,业务业务隔离-Group分组:,例如:学生管理系统的配置集 可以定义一个group为:STUDENT_GROUP。
有两个微服务,一个是订单系统,一个是用户系统,用group对其分组
命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为 它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过 namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
4.2.1namespace 隔离设计
namespace 的设计是 nacos 基于此做多环境以及多用户进行隔离,不同的开发环境就是创建不同的namespace,每个用户也有自己的namespace
新建命名空间
在编写程序获取配置集过程中没有感知到这个参数的输入,那么 nacos 统一会使用一个默认的 namespace 作为输入,nacos config 会使用一个空字符串作为默认的参数来初始化,对应界面上就是public命名空间。namesace 为 public 是 nacos 的一个保留空间,如果您需要创建自己的 namespace,不要和 public 重名,
Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式
可以导入配置、导出配置、也可以克隆配置,克隆到其他命名空间。
Nacos通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置 管理上的可用性风险。
4.2.3 监听查询
Nacos提供监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配 置变更是否推送到 Client 端。
创建两个微服务,service1、service2,并添加依赖和配置
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: service1
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
group: TEST_GROUP # 测试组
C:内部规则,用服务名+后缀的 配置。
(1)安装3个以上Nacos
我们可以复制之前已经解压好的nacos文件夹,分别命名为nacos、nacos1、nacos2
(2)配置集群配置文件
配置ip、端口号
每一个都要这样配置,然后依次启动。
客户端配置:
spring:
application:
name: xxxx
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
如果一个宕机了,就会选举一个新的leader
静态服务调用需要在本地设置想要调用服务的ip和端口,如果服务发生变化,相应配置也要修改,不能够动态的分配。
在分布式开发者,会有多个服务,服务之间存在相互调用的关系。为了更好的管理服务,提出了服务注册中心,每一个服务都会注册进注册中心。一个服务通过注册中心,获取到注册到其中的服务实例的信息并调用。
Spring Cloud 常见的集成方式是使用Feign+Ribbon技术来完成服务间远程调用及负载均衡的,
(2)微服务会定期从Nacos Server(服务发现中心)获取服务实例列表。
(3)当ServiceA调用ServiceB时,ribbon组件从本地服务实例列表中查找ServiceB的实例,如获取了多个实例如 Instance1、Instance2。这时ribbon会通过用户所配置的负载均衡策略从中选择一个实例。(轮询策略、随机策略、加权策略)
(4)最终,Feign组件会通过ribbon选取的实例发送http请求。 采用Feign+Ribbon的整合方式,是由Feign完成远程调用的整个流程。而Feign集成了Ribbon,Feign使用Ribbon 完成调用实例的负载均衡。
负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。
当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负 载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。
例如Nginx,通过Nginx进行负载均衡,客户端发送请求至Nginx,Nginx通过负载均衡算法,在多个服务器 之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。
在ribbon客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均 衡算法分配。
轮询、随机等策略
ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的 服务;
account‐service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRul
//account-service 是调用的服务的名称,后面的组成部分是固定的。
Feign
Feign可以帮助我们更快捷、优雅地调用HTTP API
引入相关的依赖,
指定@FeignClient value为serviceB,则说明这个类的远程目标为spring cloud的服务名称为serviceB的微服 务。