2. kafka细节知识

2022-07-18
  1. kafka细节知识 一. 配置文件 listeners broker 服务器要监听的地址及端口 . 默认是 localhost:9092 ,0.0.0.0的话 ,表示监听本机的所有ip地址. 这个地址只能是内网地址 advertised.listeners broker对外开放的地址,客户端请求broker的地址,例如生产者,消费者,集群内其他broker kafka会把该地址注册到zookeeper中,所以只能为除0.0.0.0之外的合法ip或域名 ,默认和listeners的配置一致 例如: listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://152.136.103.222:9092

3. kafka的使用

2022-07-18
  1. kafka的使用 一. KLE日志采集系统 1.1 基本介绍 KLE,即kafka+logstash+elasticsearch组成的一套日志采集展示系统。 基本思路为: 项目作为生产者,往kafka中发送日志消息 logstash消费kafka日志消息,然后转到elasticsearch中 kibana展示日志信息 1.2 kafka收集日志 我的kafka搭建在腾讯云上 基于springboot2.x,项目中引入如下依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>com.github.danielwegener</groupId> <artifactId>logback-kafka-appender</artifactId....

1. kafka运维监控

2022-07-18
  1. kafka运维监控 1.1 gui工具 Offset Explorer (kafkatool.com) 1.2 web工具 akhq,官网 java编写的web监控工具 首先编写application-dev.yml配置文件 micronaut: server: cors: enabled: true configurations: all: allowedOrigins: - http://localhost:3000 akhq: connections: local: properties: bootstrap.servers: "152.136.103.222:9092" schema-registry: url: "http://localhost:8085" connect: - name: "connect" url: "http://localhost:8083" 启动jar包携带配置文件参数 java -Dmicronaut.config.files=akhq-0.19.0/application-dev.yml -jar akhq.jar 打开l....

01-activiti工作流

2022-07-18

01-activiti工作流 Activiti深入研究 一. 表结构详解 1.1 表概述 activiti一共25张表 Activiti的表都是以ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。 ACT_RE_:'RE'表示Repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等等)。 ACT_RU_:'RU'表示Runtime。这些运行时的表,包含流程实例,任务、变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这些运行时表可以一直很小并且速度很快。 ACT_HI_:'HI'表示History。这些表包含历史数据,比如历史流程实例,变量,任务等等。 ACT_GE_:'GE'表示General。通用数据,用于不同场景下。 表分类表名解释 一般数据 act_ge_bytearray通用的流程定义和流程资源 act_ge_property系统相关属性 流程历史记录act_hi_actinst历史的流程实例 act_hi_attachment历史的流程附件 ac....

04-rocketmq事务消息

2022-07-18

04-rocketmq事务消息 rocketmq事务消息 一. 问题由来 首先要弄懂一个概念:     在事务中,一个方法执行结束(最后一行执行完了),此时事务不一定执行成功,直到所有的事务提交mysql,mysql事务执行成功了,才算事务执行成功 因此,在业务中,尝尝会遇到如下情况: 本地业务事务执行成功了,消息发送失败了 本地事务执行失败了,但是消息却发送成功了 这两种情况都会造成不同系统之间消息的不一致性,比如订单系统下单成功了,库存系统却没有减库存。或者下单失败了,库存却减了,这种都是不符合业务需求的 二. 事务消息 事务消息就是为了解决在分布式系统下事务的一致性。 rocketmq的事务消息解决了本地事务和消息发送的原子性,即本地事务成功,消息一定发送成功,本地事务失败,消息一定不被消费。 注意:rocketMq事务消息并不能保证消费的成功,消费的成功性由消费重试相应的功能去实现。 三. 实现原理 3.1 基本思想 rocketMq借助prepare消息这个概念,实现了事务消息的功能。 prepare消息(half消息),是....

02-NameServer剖析

2022-07-18

02-NameServer剖析 NameServer剖析 一. 启动流程 1. 解析配置文件 与启动配置相关的两个类NamesrvConfig和NettyServerConfig 在启动NameServer时,可以先使用./mqnameserver -c configFile -p打印当前加载的配置属性。 NamesrvConfig nameserver业务参数: rocketmqhome: rocketmq主目录,可以通过-Drocketmq.home.dir=path或通过设置环境变量ROCKETMQ_HOME来配置RocketMQ的主目录。 kvConfigPath:NameServer存储KV配置属性的持久化路径。 configStorePath:nameServer默认配置文件路径,不生效。nameServer启动时如果要通过配置文件配置NameServer启动属性的话,请使用-c选项。 orderMessageEnable:是否支持顺序消息,默认是不支持。 NettyServerConfig 网络参数: listenPort:NameServer监听端口,....

05-消费者Consumer

2022-07-18

05-消费者Consumer 消费者Consumer 一. 启动流程 1.1 参数配置 创建一个DefaultMQPushConsumer,基于push模式的消费者客户端 设置nameserver地址及消费进度 订阅主题和TAG 注册消息监听器,这个是收到消息后的处理逻辑,核心业务逻辑 启动消费者 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("mhn_consumer1"); consumer.setNamesrvAddr("localhost:9876"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); consumer.subscribe("TopicMhn", "TAG_A"); consumer.registerMessageListener(); consumer.start(); 1.2 构建主题订阅信息 构建SubscriptionData,并加入到RebalanceImpl的订阅消息中 订阅....

01-rocketmq环境搭建

2022-07-18

01-rocketmq环境搭建 rocketmq环境搭建 一. 本机源码环境 从git上拉取源码 启动namesrv ​ 在NamesrvStartup.java中启动 启动broker 有如下的注意事项: 从源码中可以看到这样的语句 String namesrvAddr = brokerConfig.getNamesrvAddr(); private String namesrvAddr = System.getProperty(MixAll.NAMESRV_ADDR_PROPERTY, System.getenv(MixAll.NAMESRV_ADDR_ENV)); 因此需要在启动时,携带环境变量rocketmq.namesrv.addr或者NAMESRV_ADDR 在idea启动项中添加即可 运行测试producer和consumer即可 注意设置namesrv的地址即可 二. Broker单机集群启动 以本机mac搭建为例: 本机是通过rocket源码启动的,步骤如下: 1. 配置ROCKETMQ_HOME 从源码中可以看到,ROCKETMQ_HOME....

03-生产者Producer

2022-07-18

03-生产者Producer 生产者Producer 一. 消息结构 1. 单体消息 public class Message implements Serializable { private static final long serialVersionUID = 8445773977080406428L; //所属topic private String topic; private int flag; /* 扩展属性 tag: 消息tag,用来过滤消息 keys: 索引建,多个空格隔开,用来快速检索信息 waitStoreMsgOK:消息发送时是否等到消息存储完后再返回 delayTimeLevel: 消息延迟级别,用于定时消息或消息重试 */ private Map<String, String> properties; private byte[] body; private String transactionId; } topic: 所属topic flag:rocketMq不做处理,业务上可以使用flag来做标记 Properties: 拓展属性 bo....

01-mybatis

2022-07-18

01-mybatis Mybatis概述 一. mybatis参数处理 1. 单个参数 mybatis不会做特殊处理,#{参数名} 2. 多个参数 会做特殊处理 多个参数会被封装成一个map,#{}就是从map中获取指定的key的值 Key: param1…paramN, 或者参数的索引也可以 Value:传入的参数值 因此建议使用命名参数: ​ 明确的指出封装参数时map的key, 使用@Param注解指定的值 Employee getEmpByIdAndLastname(@Param("id") Integer id, @Param("lastName") String lastName); 如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo #{属性名},取出传入的pojo属性值 如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们也可以传入map #{key}: 取出map中对应的值 如果多个参数不是业务模型中的数据,没有对应的pojo,但是经常使用, 推荐来编写一个TO(Transfer Object) 特别注....

01-dubbo基础知识

2022-07-18

01-dubbo基础知识 dubbo基础知识 一. RPC 远程过程调用 A,B服务器建立连接,进行通讯,序列化和反序列化 RPC框架的效率取决于: 通信效率 序列化和反序列效率 二. dubbo核心概念 2.1 简介 Dubbo是一款高性能的,轻量级的开源java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 2.2 环境搭建 先搭建zookeeper,然后搭建dubbo_admin监视管理项目 2.3 helloWorld 将服务提供者注册到注册中心 导入dubbo依赖, 操作zookeeper的客户端 <!--引入dubbo--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!--注册中心使用的是zookee....

02. dubbo使用总结

2022-07-18
  1. dubbo使用总结 基于dubbo 2.7.15 一. filter 1. 注入filter filter的注入基于SPI机制,需要配置如下两部分,二者缺一不可 在META-INF下添加文件 然后再该文件中写入需要配置的filter myFilter=com.wanmei.roshan.perm.config.filter.MyFilter 在filter上加注解@Activate(group = {"provider"}) 2. @Activate解析 group 指该filter作用的分组,一般为consumer或者provider。也可以二者都指定,代表消费端和生产者都生效 value 当Url包含指定的值时,该filter生效,这个后面细讲 order 指多个filter的排序,越小越早生效 在这个版本中,dubbo会在启动时加载所有filter,然后根据一定的条件筛选出合适的filter放入内存中,筛选的方法是ExtensionLoader.getActivateExtension 简单概述下这个方法的实现: 新建了一个按orde....

08-MultipartResolver

2022-07-18

08-MultipartResolver springmvc之MultipartResolver 一. 概述 上传文件的组件,主要分为以下两种方式: StandardServletMultipartResolver和CommonsMultipartResolver,前者采用Servlet3.0标准的上传方式,后者则使用了Apache的commons-fileupload 二. 源码分析 2.1 MultipartResolver boolean isMultipart(HttpServletRequest request); MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException; void cleanupMultipart(MultipartHttpServletRequest request); 这个接口中定义了三个方法 isMultipart:request中是否包含文件内容 resolveMultipart:负责解析request中的....

11-实战总结

2022-07-18

11-实战总结 一. 接口请求参数 1.1 list传参 简单基本类型传参 如果在controller参数中直接写list参数,需要注意,必须加@RequestParam,不然会抛异常 No primary or default constructor found for interface java.util.List @RequestMapping("/test1") @ResponseBody public ResponseResult<String> sendMessage(@RequestParam String message, @RequestParam List<Integer> numbers) throws Exception{ return ResponseResult.ok("success"); } 前端请求如下: GET请求:http://localhost:8081/requestType/test1?message=1&amp;numbers=1&amp;numbers=2,此时可以正常解析 POST multipart/fo....

04-HandlerAdapter

2022-07-18

04-HandlerAdapter springmvc之HandlerAdapter 一. 概述 ​ 前面HandlerMapping的作用是根据request找到Handler。通过分析我们也知道Handler可能有很多种,我们自定义的类,方法,还有springmvc给我们内置的一些。每种Handler的调用方式都不尽相同,因此就需要HandlerAdapter。 ​ 顾名思义,HandlerAdapter是一种适配器,对于某种类型的Handler,都有一种对应的Adapter,用来完成对Handler的调用。 // Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // Actually invoke the handler. mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); DispatchServle....

07-HandlerExceptionResolver

2022-07-18

07-HandlerExceptionResolver springmvc之HandlerExceptionResolver 一. 概述 HandlerExceptionResolver用于解析请求处理过程中所产生的异常。 public interface HandlerExceptionResolver { @Nullable ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex); } 异常解析过程主要包含两部分内容:给ModelAndView设置相应内容、设置response的相关属性。当然还可能有一些辅助功能,如记录日志等,在自定义的ExceptionHandler里还可以做更多的事情。 二. 源码分析 2.1 AbstractHandlerExceptionResolver 该类是所有异常解析类的父类。提供了一些共有的方法,定义了通用的解析流程,子类只需要实现其中的模板方法即....

05-ViewResolver

2022-07-18

05-ViewResolver springmvc之ViewResolver 一. 概述 ​ ViewResolver是根据视图名和Locale解析出视图。在传统的web项目中,jsp,ftl等页面的渲染生成都是由ViewResolver来完成的。但是随着前后端分离项目的流行,该组件的使用已经越来越少。 ​ 本文主要分析下ViewResolver的原理及执行流程,纪念一下渐渐退出历史舞台的组件。 二. 源码分析 ViewResolver在DispatchServlet中的使用见如下代码: // Did the handler return a view to render? if (mv != null && !mv.wasCleared()) { render(mv, request, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } } @Nullable protected View resolveViewName(String viewName, @Nulla....

02-整体处理流程

2022-07-18

02-整体处理流程 spingmvc之整体处理流程 一. 概述 springmvc对请求的处理主要是围绕DispatchServlet展开的。 一个请求进来以后,首先经过tomcat的一系列处理,然后根据不同的请求类型,servlet不同的方法,例如get请求调用doGet()。springmvc在处理该请求的过程中,先找到处理该请求的Handler,即我们编写的业务方法;接着找到调用该Handler的HandlerAdapter;然后执行handler;接着利用ViewResolver对视图进行解析,最后封装成response返回给浏览器。 Handler可以表现为多种形式,我们最常用的即添加了@RequestMapping的方法 HandlerAdapter是用来执行不同Handler的适配器,每一种Handler都需要一种适配器,通常用的是RequestMappingHandlerAdapter 视图层并不是必须的,当我们使用@RequestBody时,会在调用方法的时候就返回response,后续的视图解析就不进行了。 二. 整体流程 2.1 FrameworkServlet ....

01-启动流程

2022-07-18

01-启动流程 springmvc源码之启动流程 一. 说明 源码基于Springboot2.2.1分析,并且围绕DispatchServlet相关进行分析,其余关于spring的未做探讨。 参考资料:《看透 Spring mvc:源代码分析与实践》韩路彪 二. 启动流程 2.1 综述 ​ SpringMvc的核心类是DispatchServlet,可以说web应用的整个流程都是围绕DispatchServlet展开的。而springmvc又是依赖于spring 的一个子容器,spring为springmvc提供了便捷的对bean的操作以及其他的一些支持。 ​ SpringMvc整个启动流程,其实就是配置DispatchServlet,并交给spring管理的流程。结合servlet的特性以及springboot的自动配置,我们分析一下SpringMvc的启动流程。 2.2 HttpServletBean ​ HttpServletBean是直接继承自HttpServlet的类,同时也实现了EnvironmentCapable, EnvironmentAware,可以使用spring容....