interceptor

聊聊rocketmq-client-go的ACLInterceptor

拟墨画扇 提交于 2020-08-12 05:12:47
序 本文主要研究一下rocketmq-client-go的ACLInterceptor ACLInterceptor rocketmq-client-go-v2.0.0/internal/remote/interceptor.go func ACLInterceptor(credentials primitive.Credentials) primitive.Interceptor { return func(ctx context.Context, req, reply interface{}, next primitive.Invoker) error { cmd := req.(*RemotingCommand) m := make(map[string]string) order := make([]string, 1) m[accessKey] = credentials.AccessKey order[0] = accessKey if credentials.SecurityToken != "" { m[securityToken] = credentials.SecurityToken } for k, v := range cmd.ExtFields { m[k] = v order = append(order, k) } sort.Slice(order,

解决okhttp无法重用连接的问题

旧城冷巷雨未停 提交于 2020-08-12 04:52:17
解决okhttp无法重用连接的问题 最近在一个程序中使用okhttp调用http接口。开始时一切正常,但是测试运行一段时间后,okhttp就会报告recv失败。同时在调用端机器上,netstat显示很多套接字是TIMEWAIT状态。原来每次调用接口,okhttp都建立了一个新连接。而被调用的服务器在连接超过一定数量后会拒绝服务。 最初的想法是用连接池降低连接数。 OkHttpClient httpClient = new OkHttpClient .Builder() .connectionPool(new ConnectionPool(5, 20, TimeUnit .SECONDS)) .build(); 可是运行一段时间后,又出现了recv失败和大量的TIMEWAIT。连接池方法无效。为什么会这样呢?上网搜索一番,发现StackOverflow上有人提到,如果Request或Response的头部包含Connection: close,okhttp会关闭连接。下断点调试,果然服务器返回了Connection: close。okhttp的CallServerInterceptor在收到应答后,直接关闭了连接。 要怎么处理这种情况呢?直观的想法是用拦截器拦截应答,覆盖http头。 OkHttpClient httpClient = new OkHttpClient

BeetlSQL 3 功能预览2

我只是一个虾纸丫 提交于 2020-08-12 00:53:17
本博客介绍了BeetlSQL3提供的高级扩展功能,以下问题可以在BeetlSQL3中轻易扩展实现 定义一个注解@Jackson能把属性对象转化成json存入到数据库 定义@LoadOne, 当数据加载完毕后,可以加载更多数据 定义@Matcher注解,影响Mapper的执行 多租户问题,通过定义@Tenant解决 BeetlSQL 不支持BigInteger,如何自己扩展一个 BeetlSQL 不支持Jackson的JsonNode,如何自己扩展 不喜欢BeetlSQL提供的json配置映射,自己想搞一个XML的 BeetlSQL的默认映射方式足够好,但我想扩展自己的 给每个发送的DB的SQL的语句自动增加有个sqlId标记的注释,以方便DBA和程序员沟通,或者历史代码方便维护 BeetlSQL的想把执行的SQL和参数输出到日志框架里。或者记录每次执行参数和结果 当底层执行JDBC的时候,我想为一些特殊的SQL增加特殊的JDBC设置 以上代码可以在 BeetlSQL Samples 找到 基础功能在预览介绍里有 PluginAnnotationSample /** * 自定义注解演示 * @author xiandafu * @see Jackson , json注解 * @see LoadOne, 加载更多数据 * @see Matcher, mapper扩展新注解 * @see

聊聊rocketmq-client-go的TraceInterceptor

我的未来我决定 提交于 2020-08-11 23:01:05
序 本文主要研究一下rocketmq-client-go的TraceInterceptor TraceInterceptor rocketmq-client-go-v2.0.0/producer/interceptor.go // WithTrace support rocketmq trace: https://github.com/apache/rocketmq/wiki/RIP-6-Message-Trace. func WithTrace(traceCfg *primitive.TraceConfig) Option { return func(options *producerOptions) { ori := options.Interceptors options.Interceptors = make([]primitive.Interceptor, 0) options.Interceptors = append(options.Interceptors, newTraceInterceptor(traceCfg)) options.Interceptors = append(options.Interceptors, ori...) } } WithTrace方法在options.Interceptors后追加TraceInterceptor

架构简洁之道:从阿里开源应用架构COLA说起

时间秒杀一切 提交于 2020-08-11 17:09:51
导读: COLA 的主要目的是为应用架构提供一套简单的可以复制、可以理解、可以落地、可以控制复杂性的”指导和约束"。在实践中作者发现 COLA 在简洁性上仍有不足,因此给 COLA 做了一次“升级”,在这次升级中,没有增加任何新的功能,而是尽量多删减了一些概念和功能,让 COLA 更简洁有效。 最近,同事告诉我,COLA 作为应用架构,已经被选入阿里云的 Java 应用初始化的应用架构选项之一。 This is really something,于是,在这个里程碑节点上,我开始回过头来,重新审视 COLA 一路走来的得与失。 COLA 作为一种架构思想无疑是成功的。但是作为框架,个人感觉有点鸡肋之嫌。特别是在简洁性上做的不好,感觉做了不少画蛇添足的事情。 试想一下,有些功能我作为作者都很少去使用,我实在想不到,它为什么还有存在的理由。 基于上面的思考,我做了这一次 COLA 2.0 到 COLA 3.0 的升级。在本次升级中,我没有增加任何新的功能,而是尽量多删减了一些概念和功能。让 COLA 可以更加纯粹的 focus 在应用架构上,而不是框架支持和架构约束上。 支持我做这些决策的背后原因只有一个——奥卡姆剃刀原理。 奥卡姆剃刀原理 奥卡姆剃刀原理,是指如无必要,勿增实体(Entities should not be multiplied unnecessarily),即

GRpc异常处理Filter

邮差的信 提交于 2020-08-11 14:39:05
全局错误处理服务端 微软已经实施了 Interceptors ,它们类似于 Filter 或 Middlewares 在ASP.NET MVC的核心或的WebAPI,它们可以用于全局异常处理,日志记录,验证等。 这是服务器端Interceptor自己的实现,Continuation是必须等待的Task,然后,如果引发了任何异常,则可以根据所获得的异常来控制 RpcException 和关联的 StatusCode using Grpc.Core; using Grpc.Core.Interceptors; using Microsoft.Extensions.Logging; using System; using System.Data.SqlClient; using System.Threading.Tasks; namespace DemoGrpc.Web.Logging { public class LoggerInterceptor : Interceptor { private readonly ILogger<LoggerInterceptor> _logger; public LoggerInterceptor(ILogger<LoggerInterceptor> logger) { _logger = logger; } public async

【SpringBoot WEB 系列】RestTemplate 之自定义请求头

自作多情 提交于 2020-08-11 11:00:52
【WEB 系列】RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 User-Agent,携带 Cookie Get 携带请求头 Post 携带请求头 拦截器方式设置统一请求头 <!-- more --> I. 项目搭建 1. 配置 借助 SpringBoot 搭建一个 SpringWEB 项目,提供一些用于测试的 REST 服务 SpringBoot 版本: 2.2.1.RELEASE 核心依赖: spring-boot-stater-web <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> 为了后续输出的日志更直观,这里设置了一下日志输出格式,在配置文件 application.yml 中,添加 logging: pattern: console: (%msg%n%n){blue} 2. Rest 服务 添加三个接口,分别提供 GET 请求,POST 表单,POST json 对象,然后返回请求头

spring-boot集成mybatis-plus

北慕城南 提交于 2020-08-11 08:26:00
1) 引入相关jar包 <!-- 引入mybatis-plus包 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!-- 引入mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 2) 编写配置文件 spring: datasource: # driver-class-name: url: jdbc:mysql://127.0.0.1:3306/DEMO_DB?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8 username: root password: '123456' 3) 配置包扫描路径(必须,要不然启动报错) @SpringBootApplication @EnableWebMvc @ComponentScan("com

SpringBoot使用Spring缓存注解

余生长醉 提交于 2020-08-11 05:10:10
声明:Spring缓存注解的使用非常简单,主要是理解,所以本文主要以示例+注释(图片版)进行说明,核心部分 会给出文字版;当然本人测试时完整的项目代码会放在GitHub上,链接见本文末。 目录 启用Spring缓存注解技术 Spring缓存注解总体介绍 缓存注解的常用属性(以示例进行说明) key condition cacheNames unless allEntries beforeInvocation 缓存注解使用在返回值为viod方法上的测试 背景简述: 自Spring3.1开始,Spring就自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用,将某些数据写入到缓存中间件(缓存中间件可能在其他机器上)中。 启用Spring缓存注解技术: 第一步:确认Spring版本不低于3.1。 注:本人用的是SpringBoot2.1.2.RELEASE,对应的Spring版本为5.1.4.RELEASE。 第二步:在SpringBoot启动类上启用Spring缓存技术。 第三步:在类上或类中的方法上使用缓存注解。 注:这个【类】指的是注入了Spring容器中的。如果没有注入,那么在该类上或该类中的缓存注解是不会生效的。 Spring缓存注解总体介绍: Spring提供的缓存注解有:

AOP原理解析

穿精又带淫゛_ 提交于 2020-08-11 04:54:50
MainConfigOfAOP.class /** * AOP: * 指在程序运行期间动态的将某段代码切入到指定方法指定位置运行的编程方式 * 1. 导入AOP模块:Spring aop,(Spring-aspects) * 2. 定义一个业务逻辑类(MathCalculator),在业务逻辑运行时将日志进行打印(方法之前、方法运行、方法之后、方法异常) * 3. 定义一个日志切面(LogAspect),切面里的方法要动态感知MathCalculator.div运行到哪 * 通知方法: * 前置通知(@Before):logStart:在目标方法(div)运行之前运行 * 后置通知(@After):logEnd:在目标方法(div)运行之后运行(正常结束和异常结束) * 返回通知(@Returning):logEnd:在目标方法(div)返回之后运行 * 异常通知(@AfterThrowing):logEnd:在目标方法(div)异常之后运行 * 环绕通知(@Around):动态代理,手动控制目标方法运行(joinPoint.proceed()) * 4. 给切面的方法标注何时何地运行 * 5. 将切面类和业务逻辑类都加入到容器中 * 6. 必须告诉Spring容器哪个类是切面类,在切面类加@Aspect注解 * 7. 使用@EnableAspectJAutoProxy注解开启 *