1.SpringCloud和Dubbo的区别
- 服务调用方式 dubbo是RPC springcloud Rest Api
- 注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper
- 服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事 物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。
2. SpringCloud有哪些核心组件?
eureka: 注册中心, 服务注册和发现
Ribbon: 负载均衡, 实现服务调用的负载均衡
Hystrix: 熔断器
Feign: 远程调用
Zuul: 网关
Spring Cloud Config: 配置中心
1.微服务架构优缺点?
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高
2.springcloud组件有哪些?
服务注册发现:Eureka\Nacos\Consul
服务远程调用:OpenFeign\Dubbo
服务链路监控:Ziplin.Sleuth
统一配置管理:SpringCloudConfig\Nacos
统一网关路由:SpringCloudGateway\Zuul
流控、降级、保护:Hystrix\Sentinel
3.说一说Eureka底层执行流程?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 服务消费者利用负载均衡算法,从服务列表中挑选一个进行调用
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常(90s内没收到心跳)会被剔除
- 消费者就可以拉取到最新的信息
4.说一说Ribbon负载均衡底层执行流程?
- 发起请求
- 被LoadBalanceInterceptor负载均衡拦截器拦截
- RibbonLoadBanlancerClient客户端调用DynamicServerListLoadBalancer
- DynamicServerListLoadBalancer连接注册中心根据服务名获取服务列表
- 再通过DynamicServerListLoadBalancer调用负载均衡规则选择一个服务得到服务实际地址
- 发起请求得到最终结果
5.如何使用Feign?
- 引入Feign依赖
- 启动类添加@EnableFeignClients注解
- 编写FeignClient接口(定义服务名称、请求方式、请求路径、请求参数、返回值类型)添加注解@FeignClient(调用微服务的名称)
- 使用FeignClient中定义的方法代替RestTemplate
1.Nacos与Eureka的共同点和区别分别是什么?
Nacos与eureka的共同点:
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别:
1.Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
2.临时实例心跳不正常会被剔除,非临时实例则不会被剔除
3.Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
4.Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
2.为什么使用配置中心?哪些配置适合放到配置中心?
微服务部署集群后,假设有几十上百个微服务工程。如果没有搭建配置中心,
当修改某个配置时,需要分别进入每个微服务中进行修改,过程非常耗时和繁琐,也容易出错。
把易改变的配置,比如选项、开关、阈值、密码等,从代码中独立出来,从外部去加载。
这样做的主要好处有两个,一个是改变配置,不需要重新编译打包应用程序。第二配置可以做到动态变更。
3.为什么使用网关?
对用户请求做限流
如果有上百个微服务,没有使用微服务网关,客户端要使用上百个接口地址。(使用网关,对外只暴露一个域名,并实现负载均衡)
如果有上百个微服务,每个服务都要做身份验证。(使用网关,对用户请求做身份认证、权限校验)
还可以在网关中对用户请求做限流
4.说一说请求经过网关整个执行过程?
用户发起请求进入网关
根据路由规则判断用户请求转发到哪个微服务
如果需要被转发的微服务搭建了集群,则连接注册中心根据服务名获取服务列表数据
根据负载均衡获取某个服务地址,发送请求得到结果
5.网关中如何实现全局过滤器?
实现GlobalFilter接口
添加@Order注解或实现Ordered接口
编写处理逻辑(1获取请求头中authorization 2 校验是否为admin 3如果是则放行 4 如果不是则禁止访问)
1.说一说你对倒排索引的理解?
答:首先将文档按语义进行分词,形成倒排索引库,主要由词条和文档id构成。当进行搜索的时候,将搜索的内容进行分词,根据词条所在文档的id。
再根据文档id获得文档对象存入结果集。
2.分词器的作用是什么? IK分词器有几种分词模式?
答:创建倒排索引时对文档进行分词。用户搜索时,对输入内容进行分词。
ik_smart:智能切分,粗粒度 ik_max_word:最细切分,细粒度
3.如何使用JavaRestClient?
答:引入es的RestHighLevelClient依赖
初始化RestHighLevelClient
创建xxxxRequest对象
client.xx()方法操作索引库或文档
1.es常见的查询类型有哪些?
答:
查询所有:match_all
全文检索:match_query multi_match_query
精确查询:range term
地理查询:geo_distance geo_bounding_box
复合查询:bool function_score
2.算分函数(function score query)定义的三要素是什么?
答:过滤条件:哪些文档要加分
算分函数:如何计算function score
加权方式:function score 与 query score如何运算
3.bool查询有几种逻辑关系?
答:must:必须匹配的条件,可以理解为“与”
should:选择性匹配的条件,可以理解为“或”
must_not:必须不匹配的条件,不参与打分
filter:必须匹配的条件,不参与打分
4.说一说es查询步骤?
答:
创建SearchRequest对象
准备Request.source(),也就是DSL。
QueryBuilders来构建查询条件
传入Request.source() 的 query() 方法
发送请求,得到结果
解析结果
5.如何实现黑马旅游的酒店搜索功能,完成关键字搜索和分页?
答:
启动类注册RestHighLevelClient
定义实体类,接收前端请求
定义controller接口,接收页面请求,调用IHotelService的search方法
定义IHotelService中的search方法,利用match查询实现根据关键字搜索酒店信息
1.聚合的分类有哪些?以及参与聚合的字段类型必须是什么类型?
答: 桶(Bucket)聚合:用来对文档做分组
TermAggregation:按照文档字段值分组
Date Histogram:按照日期分组
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
Avg:求平均值
Max:求最大值
Min:求最小值
Stats:同时求max、min、avg、sum等
管道(pipeline)聚合:其它聚合的结果为基础做聚合
必须是:keyword 数值 日期 布尔
2.如何实现对品牌、城市、星级的聚合?
答:
编写controller接口,接收该请求
修改IUserService#getFilters()方法,添加RequestParam参数
修改getFilters方法的业务,聚合时添加query条件
3.如何实现hotel索引库的自动补全、拼音搜索功能?
答:
修改hotel索引库结构,设置自定义拼音分词器
修改索引库的name、all字段,使用自定义分词器
索引库添加一个新字段suggestion,类型为completion类型,使用自定义的分词器
给HotelDoc类添加suggestion字段,内容包含brand、business
重新导入数据到hotel库
4.为什么使用es集群?
答:解决了海量数据存储问题、单点故障问题