SpringCloud之Nacos基础认识-服务注册中心
1、注册中心设计思路
不使用注册中心就直接用Spring的RestTemplate框架
存在问题:如果ip和端口发生迁移,就调不通了
因此我们可以手动维护一个注册表,从注册表拉取订单服务信息
存在问题:订单服务水平扩容、某个订单服务宕机,没有及时更新注册表
因此我们可以利用Nginx
存在问题:成千上万的微服务,nginx的配置会非常复杂,运维不便
因此我们考虑mysql作为注册中心
在mysql里建服务注册表,包含状态
1、服务启动调用注册接口,执行insert语句
2、调用服务前查询订单服务列表,执行select语句
3、根据查询的订单服务列表进行远程调用
存在问题:
每次调用都要去拉取的注册中心宕机了怎么办?拉取订单服务对应的机器宕机了怎么办?
1、即使注册中心宕机,也会在会员服务那缓存订单服务
2、用TimeTask定时任务拉取订单服务列表缓存到客户端
3、同时也会定期发送心跳代表自己还活着,如果订单服务没有发送心跳就会把注册中心的状态改成down,时间再长一点可能执行delect语句
2、初识Nacos
官方文档:Nacos 配置中心简介, Nacos 是什么 | Nacos 官网
Nacos既可以作为注册中心,也可以作为配置中心
1、下载安装
1.确认版本
确保下载指定版本:Nacos 2.3.2
2.下载安装包
官网下载地址:发布历史 | Nacos 官网
3.解压并启动
解压后进入bin
目录
Windows单机模式运行命令:
startup.cmd -m standalone
4.访问控制台
启动成功后访问:
http://localhost:8848/nacos
默认账号/密码:nacos
/nacos
2、微服务整合Nacos注册中心
1、引入依赖
<!--nacos-discovery 注册中心依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、在application.yaml中配置nacos注册中心地址
#配置nacos注册中心地址spring:application:name: tlmall-storagecloud:nacos:discovery:server-addr: tlmall-nacos-server:8848
3、在启动类上添加注解(可忽略,nacos-discovery实现了服务自动注册)
@EnableDiscoveryClient
public class TlmallStorageApplication {
3、整个项目架构图
1、订单服务(左)、库存服务(右) 都会去调用注册接口去Nacos注册中心注册
2、订单服务会定期拉取库存服务列表,再利用负载均衡Loadbalacer发起调用
4、Nacos核心概念和功能
一、核心概念
1、服务
2、元数据
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
服务的元数据列表
实例也有
3、服务注册中心
它是服务及其实例和元数据的数据库。
4、命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
5、服务分组
不同的服务可以归类到同一分组
二、核心功能
Open API 指南 | Nacos 官网
1、服务注册
Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
2、服务心跳
在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳
3、服务同步
Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
4、服务发现
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
5、服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
5、微服务整合Nacos常用配置项
一、准备测试环境
二、服务逻辑隔离配置
1、数据模型:
Nacos 数据模型 Key 由三元组唯一确定:Namespace默认是空串、公共命名空间(public)、分组默认是 DEFAULT_GROUP。
2、NameSpace隔离设计
命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
1、在nacos控制台创建一个fox的命名空间
2、订单服务配置namespace为fox
spring:application:name: tlmall-order01cloud:nacos:discovery:server-addr: tlmall-nacos-server:8848namespace: fox #指定为fox开发环境的命名空间
3、group服务分组
不同的服务可以归类到同一分组,group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group参数配置。group更多应用场景是配置分组
6、服务领域模型
集群配置:
spring:application:name: tlmall-order01cloud:nacos:discovery:server-addr: tlmall-nacos-server:8848#namespace: fox #指定为fox开发环境的命名空间cluster-name: SH #上海机房
7、安全配置
Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可以暴露在公网环境
配置鉴权 | Nacos 官网
1、nacos server端
在nacos的conf/application.properties中添加
# 开启认证
nacos.core.auth.enabled=true
# 配置自定义身份识别的key(不可为空)和value(不可为空)
#这两个属性是auth的白名单,用于标识来自其他服务器的请求。
#具体实现见 com.alibaba.nacos.core.auth.AuthFilter
# 用于服务端api鉴权,注意:并不是nacos的用户名密码
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=nacosSecurty# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险 (2.2.0.1后无默认值)
#自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
nacos.core.auth.plugin.nacos.token.secret.key=tXSVzvbEWi8oB4KtTVGvF6nNXFRTSJygtP3xfo50cSVk
随机字符串生成器:随机字符串生成 - 程序员工具箱 - 在线工具
2、nacos client端
nacos server开启鉴权之后微服务会提醒user not found!
要在yaml下添加:
spring:application:name: mall-usercloud:nacos:discovery:server-addr: tlmall-nacos-server:8848username: nacospassword: nacos