1、概念
大型单体应用拆分成多个独立部署运行的微服务(解决并发问题)
2、特点
3、技术栈
4、微服务带来的问题及解决方案
5、微服务的注册中心
- 服务注册与发现:微服务实例在启动时会向注册中心注册自己的信息,如网络地址、端口号等。其他微服务可以通过注册中心发现这些信息,从而进行通信。
- 健康检查:注册中心会定期检查已注册的服务实例的健康状态,确保只有健康的服务被其他服务发现和调用。
- 负载均衡:注册中心可以帮助实现负载均衡,当有多个相同服务的实例时,可以根据负载情况分配请求,提高系统的可用性和性能。
- 容错性:注册中心通常具有高可用的特性,即使在部分服务实例或注册中心节点出现故障的情况下,也能保证服务的正常运行。
- 配置管理:除了服务发现,一些注册中心还提供配置管理的功能,允许动态地管理和更新服务的配置信息。
6、Feign和Dubbo
Feign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单
Feign集成了Ribbon和Hystrix,可以方便地实现服务发现和负载均衡
Dubbo是一个高性能的RPC框架,它提供了丰富的配置和容错机制,适合大规模分布式系统
Dubbo通过RPC调用实现远程调用,支持多种传输协议,如Dubbo、RMI、HTTP、Redis等,可以根据业务场景选择最佳的方式,非常灵活。Dubbo在性能上有优势,
它通过TCP长连接的方式进行通信,服务粒度是方法级的,适合数据量小、高并发和服务提供者远远少于消费者的场景。
7、微服务架构(背)
注意:es 数据秒查、MongDB存日志 随便丢,
网关限流,做转发(统一认证、日志处理、统一结果集、全局降级处理),基于WebFlux不能整合mysql
8、组件的学习
(1)Spring Cloud
Spring Cloud Gateway | Api网关 |
Spring Cloud OpenFeign | 远程调用 |
Spring Cloud Security | 用户认证、服务认证 |
Spring Cloud Sleuth(少) | 链路追踪 |
Spring Cloud Stream(少) | 做统一的消息管理 |
(2)Spring Cloud Alibaba
Sentinel | 把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性 |
Nacos | 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。(注册中心、配置中心)(解决服务治理问题) |
RocketMQ | 一款开源的分布式消息系统(数据),基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。(异步消息 不阻塞) |
Seata | 阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案 |
Sentinel注意:Feign和Dubbo属于同步消息,同步消息(需要等待响应), 异步消息(不阻塞,类似发短信)
9、nacos、Feign原理图(记)(心跳检测5秒)
String服务名
10、负载均衡(选择一个ip地址+端口)
(1)客户端的负载均衡(正向)
LoadBalancer(2.3以上)和Ribbon(2.3及以下)(客户端、正向、发起请求时)
Spring Cloud中的LoadBalancer和Ribbon都是用于实现负载均衡的组件,它们之间存在一些差异。以下是具体分析:
- **Ribbon**:是一个由Netflix开源的客户端负载均衡器,专注于提供中间层服务(如RPC)的客户端负载均衡。它基于HTTP和TCP等协议,通常与Eureka、Consul或Zookeeper等服务注册中心结合使用。Ribbon需要开发者在代码中手动调用目标服务,提供了多种负载均衡策略(如轮询、随机等),并且支持丰富的配置项,例如超时、重试等。
- **LoadBalancer**:是Spring Cloud提供的负载均衡组件,它是Spring Cloud的原生组件,不需要像Ribbon一样需要在代码中进行服务调用,而是通过服务ID获取负载均衡器的RPC地址。LoadBalancer底层原理是默认调用Ribbon的实现,为客户端负载均衡提供了一种更为便捷的方式。
总的来说,Ribbon是一个功能丰富且灵活的负载均衡器,适用于需要高度自定义负载均衡逻辑的场景。而LoadBalancer则是一个更简单易用的选择,适合快速实现服务调用时的负载均衡需求。
(2)服务器端的负载均衡:Nginx(反向代理 加载静态资源)
11、dubbo和feign对比(远程调用)
Dubbo和Feign是两种流行的微服务框架,它们在远程调用方面各有特点和优势。以下是对两者的对比分析:
1. **使用场景**:Feign是一种声明式的HTTP客户端,主要用于简化对RESTful API的调用。而Dubbo是一个分布式服务框架,支持多种通信协议,包括HTTP、TCP等,适用于各种微服务场景。
2. **通信协议**:Feign基于HTTP/HTTPS协议进行服务间通信,适合轻量级的REST风格服务调用。Dubbo支持多种通信协议,如Dubbo协议(默认)、RMI、Hessian、HTTP等,可以根据不同的应用场景选择合适的协议。
3. **性能**:由于Dubbo支持多种通信协议,并且可以通过各种序列化方式来优化性能,因此在一些高性能要求的场景下,Dubbo可能会有更好的表现。Feign作为Netflix开源的一部分,设计上更侧重于简化RESTful API的调用,其性能对于大多数Web服务来说已经足够。
4. **扩展性和维护性**:Feign通过注解的方式定义接口,与Spring Cloud体系结合紧密,易于扩展和维护。Dubbo则需要额外的配置,但提供了丰富的服务治理功能,如服务注册、发现、负载均衡等。
5. **生态系统**:Feign作为Spring Cloud生态的一部分,与其他Spring Cloud组件(如Hystrix、Ribbon)集成非常方便,有助于构建微服务架构。Dubbo虽然也可以与Spring Cloud集成,但需要额外的适配工作。
6. **社区支持**:Dubbo由阿里巴巴维护,社区活跃,文档齐全,国内使用广泛。Feign由Netflix开源,也是Spring Cloud生态的重要组成部分,国际社区支持较好。
总的来说,Feign和Dubbo各有千秋。如果项目是基于Spring Cloud构建的,且主要涉及RESTful风格的服务调用,Feign可能是更好的选择。而如果项目对性能有极高要求,或者需要更复杂的服务治理功能,Dubbo可能更适合。在选择时,应根据项目的具体需求和团队的技术栈来决定使用哪个框架。
12、nacos领域模型(三者一致)(服务注册 服务发现)namespace+group+Service(找到唯一的服务)
11、nacos配置流程
(1)拿到nacos-docker-master_1706522287_1.zip包(先安装docker-compose)
(2)已弄好
(1)修改隐藏文件.env的版本为2.2.0(包中,已弄好)
(2)新建一个文件夹 mysql-schema.sql存放nacos的sql(包中,已弄好)
两个位置
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id&