Nacos - 服务发现和配置管理
1 理解服务发现
1.1 微服务架构
为适应企业的业务发展,提高软件研发的生产力,降低软件研发的成本,软件架构也作了升级和优化,将一个独立 的系统拆分成若干小的服务,每个小服务运行在不同的进程中,服务与服务之间采用RESTful、RPC等协议传输数 据,每个服务所拥有的功能具有独立性强的特点,这样的设计就实现了单个服务的高内聚,服务与服务之间的低耦 合效果,这些小服务就是微服务,基于这种方法设计的系统架构即微服务架构。
下图是基于微服务架构的电商系统:
特点:
1、服务层按业务拆分为一个一个的微服务。
2、微服务的职责单一。
3、微服务之间采用RESTful、RPC等轻量级协议传输。
4、有利于采用前后端分离架构。
1.2理解服务发现
1.2.1 测试环境
在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码 中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务 生产方的网络位置(IP地址和端口号)。
我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:
我们通过Spring boot技术很容易实现:
1、创建nacos-discovery父工程
pom.xml如下:
1 | <?xml version="1.0" encoding="UTF‐8"?> |
2、Service B(服务生产者)
创建服务提供者 nacos-restful-provider。
pom.xml如下:
1 | <?xml version="1.0" encoding="UTF‐8"?> |
1、创建Controller
1 | package com.itheima.nacos.provider.controller; |
2、创建启动类
1 | @SpringBootApplication |
配置文件:
创建application.yml,内容如下:
1 | server: |
3、Service A(服务消费者)
创建nacos-restful-consumer 服务消费工程。
pom.xml如下:
1 | <?xml version="1.0" encoding="UTF‐8"?> |
实现代码:
1、创建controller
1 | package com.itheima.nacos.consumer.controller; |
2、创建启动类
1 | @SpringBootApplication |
配置文件:
创建application.yml,内容如下:
1 | server.port = 56020 # 服务生产方地址 |
访问http://127.0.0.1:56020/service,输出以下内容:
1 | consumer invoke | provider invoke |
1.2.2 服务发现流程
上边的例子看上去很完美,但是,仔细考虑以下,此方案对于微服务应用而言行不通。首先,微服务可能是部署在 云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机 或升级,服务实例网络地址会经常动态改变。再者,每一个服务也可能应对临时访问压力增加新的服务节点。正如 下图所示:
基于以上的问题,服务之间如何相互发现?服务如何管理?这就是服务发现的问题了。
服务发现就是服务消费方通过服务发现中心智能发现服务提供方,从而进行远程调用的过程。 如下图:
上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端。
(1) 在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册 表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。
(2) 服务发现客户端会定期从服务发现中心同步服务注册表 ,并缓存在客户端。
(3) 当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地 址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。
总结,在微服务环境中,由于服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化 ,因此无法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。 各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中 心来获取访问目标服务的网络地址,从而实现服务发现的机制。
2 Nacos 服务发现
2.1. Nacos特性
Nacos主要提供以下四大功能:
- 服务发现与服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。
- 动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新 部署应用程序,这使配置的更改更加高效和灵活。
- 动态DNS服务
Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
- 服务和元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
2.2 启动服务器
nacos的默认端口是8848,需要保证8848默认端口没有被其他进程占用。 进入安装程序的bin目录:
Windows启动方式: 启动命令:
1 | cmd startup.cmd |
或者双击startup.cmd运行文件。
启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos ,打开如下nacos控制台登录页面:
启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos ,打开如下nacos控制台登录页面:
2.3外部mysql数据库支持
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步 骤:
安装数据库,版本要求:5.6.5+ ,mysql 8 以下
初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos- mysql.sql
修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
1 | spring.datasource.platform=mysql |
2.4 服务注册
在服务提供工程中配置nacos服务发现相关的配置:
服务提供:
1 | spring: |
启动nacos
启动服务提供
观察nacos服务列表,nacos-restful-provider注册成功
3. 服务发现数据模型
3.1 Namespace 隔离设计
命名空间**(Namespace)**用于进行租户粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套nacos 集群可以分别建以下三个不同的 namespace。如下图所示:
从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名 空间。如下图所示:
3.2 命名空间管理
前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环 境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。 如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace(环境)的tab按 钮,如下图:
4. Nacos配置管理
首先在nacos发布配置,nacos-restful-consumer服务从nacos读取配置。
浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单配置管理**->**配置列表: 在Nacos添加如下的配置:
nacos-restful-consumer:
1 | Namespace: public |
要想从配置中心获取配置添加nacos-config的依赖:
1 | <dependency> |
在bootstrap.yml添加配置:
1 | spring: |
注意:要使用配置中心就要在bootstrap.yml中来配置,bootstrap.yml配置文件的加载顺序要比application.yml要优先。
5 定义扩展的 Data Id 配置
5.1 ext-config扩展配置
Spring Cloud Alibaba Nacos Config可支持自定义 Data Id 的配置。 一个完整的配置案例如下所示:
扩展配置优先级是spring.cloud.nacos.config.ext-config[n].data-id中 n 的值越大,优先级越高。
通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置的优先级最大。
总结
Nacos用来干什么?
Nacos是阿里巴巴公司开源的项目,它用来实现配置中心和服务注册中心。 什么是服务发现?
在微服务架构中一个业务流程需要多个微服务通过网络接口调用完成业务处理,服务消费方从服务注册中心获取服 务提供方的地址,从而进行远程调用,这个过程叫做服务发现。
服务发现的流程是什么?
1、服务发现的客户端从服务注册中心获取服务列表
2、服务消费方通过客户端负载均衡获取服务实例地址,进行远程调用。什么是配置中心?
在微服务架构中为了统一管理各各微服务的配置信息专门设置配置中心,配置中心就是一种统一管理各种应用配置 的基础服务组件。
配置中心的应用流程是什么?
1、发布配置,将配置信息发布到配置中心。
2、获取配置,配置中心客户端得到配置中心的通知,从配置中心获取配置。
Spring Cloud是什么?
Spring Cloud是一套微服务开发框架集合,包括微服务开发的方方页面,Spring Cloud是一套微服务开发的标准, 集成了很多优秀的开源框架,比如有名的Netflix公司的众多项目。
Spring Cloud Alibaba是什么?
Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud标准实现一套微服务开发框架集合,它和Netflix一样都是Spring Cloud微服务开发实现方案。
Dubbo服务开发流程是什么? 1、定义api工程。
方便其它服务原来api工程,远程调用dubbo服务。
2、定义api实现工程。
service实现类使用 @org.apache.dubbo.config.annotation.Service注解标记为dubbo服务。
3、服务消费方开发
引入api工程依赖
使用org.apache.dubbo.config.annotation.Reference注解注入service,发起远程调用