微服务框架——Nacos安装和背景介绍
背景介绍
Spring 是基于bean mybatis :SqlSessionFactory xml @Bean
SpringBoot 基于Application 自动配置 @Autowired 自动配置
Spring Cloud 基于Service 微服务框框架共性功能 集成
netfix、alibaba、huawei 都有微服务框架
思考一:微服务之前调用用到哪些技术?
微服务和微服务之前调用存在什么问题,需要用到什么技术?
1、RPC调用(feign、dubbo) RestTemplate webClient 可以进行服务间调用
2、服务注册和发现(nacos、 eureka)、配置统一管理(zookeeper、nacos、redis)、
3、服务链路的排除、微服务的监控
4、服务熔断降级限流:hystrix、sentinel
思考二: 假如没有SpringCloud技术栈,该怎么进行微服务调用?
服务间调用 RestTemplate webclient
//RestTemplate 调用
String url = "http://mall-order/order/findOrderByUserId/"+id; R result = restTemplate.getForObject(url,R.class);
Spring提供的RestTemplate模板类存在哪些问题?
问题1:首先不能进行负载均衡能力,客户端负载均衡。没有负载均衡
问题2:客户端感知provider的节点存活性,节点是否可用。没有心跳机制
问题3:节点出问题后,怎么剔除这个节点。没有剔除掉线or问题节点的能力
场景介绍:
电商场景下,会员服务去调用订单服务。中心是一个类似注册中心,具有保活、注册、注销,其实就是Nacos功能。
左下角是会员服务,可以看到,使用了两个TimeTask定时任务,一个定时任务定时负责发送心跳供注册中心知道自己还存活,另一个定时任务负责 定时拉取订单服务列表,缓存到客户端中,当会员服务需要去调用服务时候,就立即远程调用订单服务。
右下角是订单服务,订单服务启动时会调用注册接口和停止时候调用注销接口,定时任务负责进行心跳注册,定时确保自己保活。
Nacos注册instance是什么存储?
临时节点存在内存,持久化节点持久化到磁盘文件 data/naming/id,下图展示的我本机存储的instance实例
nacos :拉取 持久实例和临时实例一次性全部拉取
配置数据是什么存储?
derby、mysql
1. 什么是 Nacos
官方文档: https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 的关键特性包括:
-
服务发现和服务健康监测
-
动态配置服务
-
动态 DNS 服务
-
服务及其元数据管理
主流的注册中心
CAP : Consistency 一致性、Availability 可用性、Partition tolerance分区容错性
1.1 Nacos 架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvmNgGz2-1644204650658)(G:\技术积累\微服务 Nacos\微服务框架.assets\a97899f52bb.jpeg)]
NamingService: 命名服务,注册中心核心接口
ConfigService:配置服务,配置中心核心接口
OpenAPI文档:https://nacos.io/zh-cn/docs/open-api.html
nacos版本: v1.1.4 升级到v1.4.1
1.2 Nacos Server部署
下载源码编译
源码下载地址:https://github.com/alibaba/nacos/ 可以用迅雷下载
cd nacos/ mvn -Prelease-nacos clean install -U cd nacos/distribution/target/
下载安装包
下载地址:https://github.com/alibaba/Nacos/releases
1.2.1 单机模式
官方文档: https://nacos.io/zh-cn/docs/deployment.html
解压,进入nacos目录
单机启动nacos,执行命令
bin/startup.sh -m standalone
也可以修改默认启动方式
如果是windows,需要修改startup.cmd 的配置文件。
访问nocas的管理端:http://192.168.3.14:8848/nacos ,默认的用户名密码是 nocas/nocas
1.2.2 集群模式
官网文档: https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
集群部署架构图
1)单机搭建伪集群,复制nacos安装包,修改为nacos8849,nacos8850,nacos8851
2)以nacos8849为例,进入nacos8849目录
2.1)修改conf\application.properties的配置,使用外置数据源
#使用外置mysql数据源
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
2.2)将conf\cluster.conf.example改为cluster.conf,添加节点配置
# ip:port
192.168.3.14:8849
192.168.3.14:8850
192.168.3.14:8851
nacos8850,nacos8851 按同样的方式配置。
3)创建mysql数据库,sql文件位置:conf\nacos-mysql.sql
- 修改启动脚本(bin\startup.sh)的jvm参数
- 分别启动nacos8849,nacos8850,nacos8851
以nacos8849为例,进入nacos8849目录,启动nacos
bin/startup.sh
- 测试
登录 http://192.168.3.14:8849/nacos ,用户名和密码都是nacos
7)官方推荐,nginx反向代理
访问: http://192.168.3.14:8847/nacos
服务实例内部注册表
Map(namespace, Map(group::serviceName, Service))
namespace 隔离的作用
group::serviceName: 隔离作用 group 所有服务同用一个group(通常用于配置中心,起到环境隔离的作用)
Service #就是微服务 mall-order mall-user
Map<String, Cluster> clusterMap #集群 BJ SH 互通 性能:尽可能同一集群(ribbon 负载均衡算法: 优先使用同一集群的)
@JsonIgnore
private Set<Instance> presistentInstance = new HashSet<>(); #持久实例
@JsonIgnore
private Set<Instance> ephemeralInstance = new HashSet<>(); #临时实例
Instance: 8020 8021 mall-order
问题: nacos怎么实现自动注册?
一旦有注册请求,就去调用 onApplicationEvent 事件