JAVA系列课程
Hollis,阿里巴巴技术专家《Java工程师成神之路》系列文章作者,热衷于分享计算机编程相关技术,博文全网阅读量上千万。
2023年10月17日
目的:基于项目需求进行技术调研支持全局资源搜索,保证搜索结果的实时性、准确性、多样性。
搜索功能大致流程:
1.创建索引
2.增量同步数据
3.分词器处理
4.语义分析、自定义语义
5.query查询处理
6.相关性排序
技术选型:
目前常用的搜索引擎有Solr和Elasticsearch
Elasticsearch是一个实时的分布式搜索和分析引擎,可以处理大规模数据,可以用于全文搜索、结构化搜索及分析,Elasticsearch使用Lucene作为内部引擎,基于统一开发API进行操作,支持多语言、多客户端接入。
Elasticsearch作为分布式实时文件存储,并将每一个字段都编入索引,使其可以用于搜索。
Elasticsearch优点
1.Elasticsearch是分布式的,不需要其他组件,方便扩展
2.Elasticsearch建立实时搜索时查询速度快
3.默认配置化完善,搭建方便,开发学习成本低
4.基于RESTful...
2023年10月17日
Gateway基于webflux实现,webflux大量运用流式编程,源码不易理解,但能很好的支持请求异步处理
Gateway过滤器分为全局过滤器(GlobalFilter)、局部过滤器(GatewayFilter)
全局过滤器:一般用来处理统一鉴权、访问安全控制、全局过滤器是非常常用的一种过滤器
局部过滤器:针对单个路由的过滤器,可以对访问的URL过滤,进行切面处理,对于单个接口进行限流操作
Gateway原生过滤器包含:LoadBancer(负载均衡过滤器)、ForwarPath(路径转发过滤器)、
RouteToRequestUrl(转换路由中的请求地址过滤器)
Gateway动态路由实现:
Gateway组件中的RouteDefinitionLocator用于存放route路由对象,真正可以执行route逻辑的是Route
Route路由对象包含
id(路由id)、predicates(断言,路径相匹配的进行路由)、filters(过滤器)、url(服务跳转地址)、order(执行顺序)
Gateway动态路由加载方式通过重写InMemoryRouteDefinitionRepository类来加载配置的路由规则,动态路由刷新需重新加载路由数据,动态路由可以配置nacos配置中心来使用,也可以通过mysql数据来配置。
2023年10月17日
一、需求
优化接口查询响应速度,尽量让尽可能多的数据从缓存中查询出来,减少db的读表操作。
二、待优化点
(1)优化缓存连接池配置
说明:因为频繁创建与销毁连接非常的消耗性能(创建Connection开销),使用连接池就能很好的解决连接创建频繁的问题,优化缓存连接池的配置参数,提高缓存查询效率。
blockWhenExhausted:设置连接池获取连接是否阻塞等待
maxWaitMillis:最大等待时间
maxTotal:最大连接数
连接池状态
是否等待(blockWhenExhausted)
获取连接最大时间
连接池已满无空闲连接
True/False
maxWaitMillis/0
连接池未满无空闲连接
True/False
connectionTimeout+maxWaitMillis/maxWaitMillis
连接池未满有空闲连接
True/False
0/0
解决方法:
合理的设置maxWaitMillis,不要让线程长时间阻塞,导致整个缓存不可用
合理的设置maxTotal的值,maxTotal不可设置为-1
上述配置参数都需要通过具体的压力测试来进行调整,根据测试日志来分析出一个最优值
(2)缓存连接释放
使用缓存操作类发现连接池不够用情况,排查发现操作类没有及时释放连接
解决方案:封装连接释放方法,在使用完之后及时调用,在catch...
2023年10月17日
一、需求
深入了解系统中使用的zuul网关工作原理,对后续系统组件升级、zuul网关异常解决提供技术支撑,优化zuul网关的配置参数
二、实现原理
2.1Zuul介绍
Zuul是netflix开源的微服务网关,它可和Ribbon、hystrix等组件配合使用,
Zuul可以为微服务系统提供动态路由、流量监控、接口安全等功能
Zuul作为微服务的入口,网关可以将集群的服务隐藏在后面,而对于外部客户端来说只需请求网关,不需要关系微服务的内部调用关系。
2.2Zuul组件实现原理
Zuul组件的核心运行机制是一系列可配置的过滤器(filters),过滤器之间没有直接通信,它们是通过一个RequestContext(类似于上下文)的静态类来进行数据传递的,处理的请求的每个处理器都共享一个RequestContext,RequestContext是基于ThreadLocal线程变量来记录共享数据的。
Zuul过滤器是由Groovy写成,Zuul会定期轮询指定目录,动态编译加载有修改的过滤器
Zuul过滤器可分为:前置过滤器(PRE)、路由过滤器(ROUTING)、后置过滤器(POST)、异常过滤器(ERROR)
Zuul运行逻辑图如下:
2.3Zuul路由机制
Zuul组件中有RibbonRoutingFilter路由过滤器用来处理网关路由功能,RibbonRoutingFilter是通过service-id及URL将请求转发到后端对应的微服务。
核心源码如下图:
buildCommandContext方法作用是创建RibbonCommandContext对象,用户后续路由,RibbonCommandContext包含serviceId、method、uri等必须参数
forward方法通过是在HystrixCommand内部执行Ribbon负载均衡调用,使用请求路由功能的
请求是如何路由到后端的?
通过ribbonCommandFatory工厂构建OkhttpRibbonCommand,创建RibbonCommand过程中会OkHttpLoadBalancingclient对象,该client对象在HystrixCommand的execute方法下执行路由转发操作,网关路由最终执行者还是httpClient对象
路由请求地址如何加载的?
通过Ribbon的ILoadBalancer接口加载、刷新、下线服务列表
BaseLoadBalancer类继承ILoadBalancer接口,在BaseLoadBala
ncer中实现了serviceid对应服务ip关系,BaseLoadBalancer对象中存在Timer定时器支持定时刷新注册列表,可用服务列表存储在一个List<server>集合中
Server对象如图:
2023年10月17日
开发过程问题跟踪汇总:
1.Redis服务器部署方式
单机版Redis和Redis云集群部署方式不一致,redis云集群采用主备+分片部署,每个分片都有一个主服务和备用服务,
2.Springboot集成Redis的方式
单机版采用jedis操作redis,redis云集群版项目采用lettuce连接池
3.Redis集群不建议使用管道pipeline
分片后的redis云集群对接人员不建议使用管道pipeline操作,项目中使用lettuce2.0版连接池兼容管道操作
4.Redis序列化方式
Key值采用stringSerializer序列化方式、value值采用jackson2JsonRedisSerializer序列化方式
5.Redis容灾处理
redis云集群采用多节点主备同步方案,不同的主备部署在不同的物理机上,当主节点出现异常情况时,可以切换到备用节点上
6.Redis备份方式
redis云集群采用rdb文件备份数据文件,rdb文件能快速还原数据,避免redis数据不同步问题
2023年10月17日
broker监控指标
Kafka集群broker总数
broker的状态值(是否正常、是否leader)
broker的每秒消费请求数
broker的每秒生产请求数
broker的消息流入总数
broker的消息流出总数
broker的每秒消息流入数
broker的每秒消息流出数
broker的字节流入总数(byte)
broker的每秒字节流入数(byte/s)
broker的字节流出总数(byte)
broker的每秒字节流出数(byte/s)
broker的partition的数量
Kafka集群监控指标
消息积压变化趋势(h...