微服务技术
一、微服务 SpringCloud
微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。
Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
二、Eureka
介绍
服务注册与发现提供了一个服务注册中心、服务发现的客户端,还有一个方便查看所有注册的服务的界面。所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。
Eureka架构图
Eureka由两个组件组成: Eureka服务器和Eureka客户端。
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka关键概念
- 服务注册:register
- 服务续约:renew, 客户端默认每隔30秒向服务器发送一次心跳进行续约,如果服务器90秒内没有收到心跳,则将该客户端剔除
- 获取服务注册列表信息:fetch registries
- 服务下线:cancel
- 服务剔除eviction
参考资料:https://blog.csdn.net/ZSA222/article/details/124219338
三、Ribbon
Ribbon是什么?
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
下图展示了Eureka使用Ribbon时的大致架构:
Ribbon组件IRule
默认的是RoundBobinRule(轮询)
参考资料:https://blog.csdn.net/JinXYan/article/details/90726707
四、Nacos
什么是Nacos
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
Nacos 支持如下核心特性:
1)服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
2)服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
3)动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
4)动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
5)服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
注:nacos与eureka的区别(简单介绍)
1)nacos和eureka的范围不同,Nacos的阈值是针对某个具体Service的,而不是针对所有服务的;但Eureka的自我保护阈值是针对所有服务的。nacos支持CP和AP两种;eureka只支持AP。nacos使用netty,是长连接; eureka是短连接,定时发送。
2)Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server. enab1e-self-preservation:false)
Nacos保护方式:当域名健康实例(Instance)占总服务实例(Instance)的比例小于阈值时,无论实例(Instance)是否健康,都会将这个实例(Instance)返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例(Instance)能正常工作。
Nacos结构图
参考资料:https://blog.csdn.net/qq_51726114/article/details/123115068
五、Feign
Feign概述
Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。
Feign 原理
1、将feign接口的代理类扫描到Spring容器中:
@EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。
2、为接口的方法创建RequestTemplate
当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
3、发出请求
代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求
参考资料:https://blog.csdn.net/F0217911/article/details/126370721
六、Gateway
API 网关的职能
API 网关的分类与功能
Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
最重要的几个概念
Gateway怎么用
说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理
- 通过时间匹配
- 通过 Cookie 匹配
- 通过 Host 匹配
- 通过请求方式匹配
- 通过请求路径匹配
- 通过请求参数匹配
- 通过请求 ip 地址进行匹配
- 组合使用
参考资料:https://blog.csdn.net/rain_web/article/details/102469745
七、SpringAMQP
1、介绍
Spring AMQP 是对 Spring 基于 AMQP 的消息收发解决方案,它是一个抽象层,不依赖于特定的 AMQP Broker 实现和客户端的抽象,所以可以很方便地替换。比如我们可以使用 spring-rabbit 来实现。
2、核心组件
2.1 ConnectionFactory
Spring AMQP 的连接工厂接口,用于创建连接。CachingConnectionFactory 是ConnectionFactory 的一个实现类。
2.2 RabbitAdmin
RabbitAdmin 是 AmqpAdmin 的实现,封装了对 RabbitMQ 的基础管理操作,比如对交换机、队列、绑定的声明和删除等。
2.3 Message
Message 是 Spring AMQP 对消息的封装。两个重要的属性:body:消息内容。 messageProperties:消息属性。
2.4 RabbitTemplate 消息模板
RabbitTemplate 是 AmqpTemplate 的一个实现(目前为止也是唯一的实现),用来简化消息的收发,支持消息的确认(Confirm)与返回(Return)。跟 JDBCTemplate一 样 , 它 封 装 了 创 建 连 接 、 创 建 消 息 信 道 、 收 发 消 息 、 消 息 格 式 转 换(ConvertAndSend→Message)、关闭信道、关闭连接等等操作。
针对于多个服务器连接,可以定义多个 Template。可以注入到任何需要收发消息的地方使用。
2.5 Messager Listener 消息监听
MessageListener
MessageListener 是 Spring AMQP 异步消息投递的监听器接口,它只有一个方法onMessage,用于处理消息队列推送来的消息,作用类似于 Java API 中的 Consumer。
MessageListenerContainer
MessageListenerContainer可以理解为MessageListener的容器,一个Container只有一个 Listener,但是可以生成多个线程使用相同的 MessageListener 同时消费消息。
Container 可以管理 Listener 的生命周期,可以用于对于消费者进行配置。
例如:动态添加移除队列、对消费者进行设置,例如 ConsumerTag、Arguments、并发、消费者数量、消息确认模式等等。
2.6 转换器 MessageConvertor
RabbitMQ 的消息在网络传输中需要转换成 byte[](字节数组)进行发送,消费者需要对字节数组进行解析。
在 Spring AMQP 中,消息会被封装为 org.springframework.amqp.core.Message对象。消息的序列化和反序列化,就是处理 Message 的消息体 body 对象。
参考资料:https://blog.csdn.net/weixin_45596022/article/details/113359009
八、ES
ES是什么?
ES全称ElasticSearch,是一个基于Lucene的搜索服务器。(其实就是对Lucene进行封装,提供了REST API的操作接口)
ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速的对大数据进行存储,搜索和分析。
ElasticSearch是基于Java开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
根据DB-Engines排名显示,ElasticSearch是最受欢迎的企业级搜索引擎。
ElasticSearch和Logstash(数据收集、日志解析引擎)、Kibana(分析和可视化平台)一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前被称为ELK技术栈)。
ElasticSearch的使用场景
- 云计算。能够达到实时搜索、稳定、可靠、快速、安装使用方便。
- 搜索各种文档。
ElasticSearch的主要特点:
- 分布式(无需人工搭建集群,solr就需要人为配置,使用Zookeeper作为注册中心)
- 高可用
- 异步写入
- 多API(一切API都遵循RESTful原则,容易上手近实时搜索,数据更新在ElasticSearch中几乎完全同步)
- 面向文档
ElasticSearch的核心概念
- 近实时
- 集群
- 节点(保存数据)
- 索引
- 分片(将索引分片)注意:一旦创建了索引就无法更改主分片的数量。
- 副本(分片可设置多个副本)
它可以快速的储存、搜索和分析海量数据
倒排索引
正排索引(传统)
id | content |
---|---|
1001 | my name is zhang san |
1002 | my name is li si |
倒排索引
keyword | id |
---|---|
name | 1001, 1002 |
zhang | 1001 |
Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化, Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了。
可视化界面操作ES
- 检查集群的健康状态
GET _cluster/health
PUT /index
PUT /ecommerce/product/1
{"name": "gaolujie yagao","price": 20,"desc": "gaolujie yaga desc","tags": "meibai jieya"
}
GET /ecommerce/product/1
#创建索引结构
PUT sku
{"mappings": {"doc":{"properties":{"name":{"type":"text","analyzer":"ik_smart"},"price":{"type":"integer"},"image":{"type":"text"},"createTime":{"type":"date"},"spuId":{"type":"text"},"categoryName":{"type":"keyword"},"brandName":{"type":"keyword"},"spec":{"type":"object"},"saleNum":{"type":"integer"},"commentNum":{"type":"integer"}}}}
}#增加文档
POST sku/doc
{"name":"华为手机","price":4500,"spuId":"106","createTime":"2019-06-25","categoryName":"手机","brandName":"华为","saleNum":54532,"commentNum":32543,"spec":{"网络制式":"全网通","屏幕尺寸":"6.5"}
}#新增指定ID文档
PUT sku/doc/1
{"name":"小米电视","price":3500,"spuId":"117","createTime":"2019-06-25","categoryName":"电视","brandName":"小米","saleNum":2332,"commentNum":4123,"spec":{"网络制式":"联通4G","屏幕尺寸":"6.5"}
}#查询所有文档
GET /sku/_search
{"query": {"match_all": {}}
}#匹配查询(单字段查询 分词查询默认为or)
GET /sku/doc/_search
{"query": {"match": {"name": "小米手机"}}
}#匹配查询(精准查找)
GET /sku/doc/_search
{"query": {"match": {"name": {"query": "小米电视","operator": "and"}}}
}#多字段查询(multi_match)
GET /sku/_search
{"query": {"multi_match": {"query": "小米","fields": ["name","brandName","categoryName"]}}
}#词条匹配(term)
GET /sku/_search
{"query": {"term": {"price": "1000"}}
}#多词条匹配(terms)
GET /sku/_search
{"query": {"terms": {"price": ["1000","3500"]}}
}#布尔查询(bool)
#查询名称包含手机的,并且品牌为小米的。
GET /sku/_search
{"query": {"bool": {"must": [{"match": {"name": "手机"}},{"term": {"brandName": "小米"}}]}}
}#布尔查询(bool)
#查询名称包含手机的,或者品牌为小米的。
GET /sku/_search
{"query": {"bool": {"should": [{"match": {"name": "手机"}},{"term": {"brandName": "小米"}}]}}
}#过滤查询
GET /sku/_search
{"query": {"bool": {"filter":[{"match":{"brandName":"小米"}}]}}
}#分组查询
#按分组名称聚合查询,统计每个分组的数量
GET /sku/_search
{"size": 0,"aggs": {"sku_category": {"terms": {"field": "categoryName"}}}
}
参考资料:https://blog.csdn.net/u013495921/article/details/113791808
https://blog.csdn.net/u011863024/article/details/115721328
https://blog.csdn.net/qq_45759093/article/details/124634333