后端开发

JAVA系列课程

Hollis,阿里巴巴技术专家《Java工程师成神之路》系列文章作者,热衷于分享计算机编程相关技术,博文全网阅读量上千万。

了解更多
关于搜索功能技术调研
目的:基于项目需求进行技术调研支持全局资源搜索,保证搜索结果的实时性、准确性、多样性。 搜索功能大致流程: 1.创建索引 2.增量同步数据 3.分词器处理 4.语义分析、自定义语义 5.query查询处理 6.相关性排序 技术选型: 目前常用的搜索引擎有Solr和Elasticsearch Elasticsearch是一个实时的分布式搜索和分析引擎,可以处理大规模数据,可以用于全文搜索、结构化搜索及分析,Elasticsearch使用Lucene作为内部引擎,基于统一开发API进行操作,支持多语言、多客户端接入。 Elasticsearch作为分布式实时文件存储,并将每一个字段都编入索引,使其可以用于搜索。 Elasticsearch优点 1.Elasticsearch是分布式的,不需要其他组件,方便扩展 2.Elasticsearch建立实时搜索时查询速度快 3.默认配置化完善,搭建方便,开发学习成本低 4.基于RESTful...
Gateway网关组件使用
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数据来配置。
高并发缓存优化
一、需求 优化接口查询响应速度,尽量让尽可能多的数据从缓存中查询出来,减少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...
Zuul网关实现原理
一、需求 深入了解系统中使用的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对象如图:
Redis云集群接入的问题及注意事项
开发过程问题跟踪汇总: 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数据不同步问题
MongoDB3.0.4 Linux下的安装和启动
1.升级openssl rpm -Uvh openssl-1.0.1e-30.el6.x86_64.rpm...
libreoffice安装
Linux 下的安装方法作为一般的原则,我们建议您通过您的特定Linux发行版推荐的方式安装...
Kafka监控指标
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...