接口请求工具 - Feign

接口请求工具

在微服务还未盛行的时候,一般服务间的请求使用的底层方式: jdk自带的HttpURLConnection 或者 封装的Apache HttpClient / Okhttp 等框架,微服务盛行后优秀的请求框架 Feign 被Spring看中 推荐成了微服务体系里面的请求工具,有着简洁 效率 易读 侵虐性低等优点。本文主要介绍剥离开Spring框架使用Feign,或者在Spring中调用未接入微服务注册中心的服务/系统。

Git 地址

Feign配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 设置不格式化json
ObjectMapper mapper = new ObjectMapper().disable(SerializationFeature.INDENT_OUTPUT);
JacksonDecoder decoder = new JacksonDecoder();
// json 编码 并兼容表单提交方式
FormEncoder formEncoder = new FormEncoder(new JacksonEncoder(mapper));
// 包含熔断器的builder
HystrixFeign.Builder builder = HystrixFeign.builder()
// 设置底层实现形式 提高效率
.client(new OkHttpClient())
// 请求连接时间 请求等待时间
.options(new Request.Options(10000, 120000))
// 重试机制
.retryer(new Retryer.Default(5000, 5000, 3))
.encoder(formEncoder).decoder(decoder)
.logger(new Slf4jLogger());
}

Get 请求

1
2
3
4
public interface IGetFeign {
@RequestLine("GET /xxxxx?param={id}")
UserVO getXXXById(@Param("id") Long id);
}

可以使用@QueryMap 注解查询多个参数

POST 请求

1
2
3
4
5
6
7
8
public interface IPostFeign {
@RequestLine("POST /xxx/save")
Boolean save(Map data, @HeaderMap Map<String, String> headerMap);

@RequestLine("POST /xxx/get_product")
@Headers("Content-Type: application/x-www-form-urlencoded")
Product getProductInfo(@Param("id") Long id);
}

可以使用 @Headers() 单独添加头信息 变量可以使用 @Param 注解传入,或者 使用 @HeaderMap 添加多个头信息;默认使用json编码传输,可以通过头信息来指定content-type传输,或者使用 @Body 注解直接书写传输内容

使用

1
2
IPostFeign feign = builder.target(IPostFeign.class, "productAddress", fallbackFactory);
Product product = feign.getProductInfo(1L);

使用了熔断器的话 需要写个fallback类 继承 FallbackFactory

Spring中使用

把Feign配置使用@Configuration注解,并把targer生成的对象 添加 @Bean注解 添加到容器中,在使用的地方注入即可

push 推送服务

需求

实现客户端和服务端的tcp长链接通信 完成数据交换

基础功能

  • 动态调整服务端设置提高性能
  • 心跳检测
  • 闲时检测 清除或处理长时间无响应客户端
  • 自动编/解码
  • 自定义数据包编码 实现 256 种操作的解析(可拓展)
  • 支持任意类型数据的发送,配合操作解析
  • 基于JWT 的登录认证
  • 授权检查,清除未授权客户端
  • 消息确认ACK
  • 非主动下线的断线检测与重连
  • 支持客户端查询与下线等操作
  • 微服务化 支持其他服务动态调用
  • 支持websocket
  • 支持多种序列化方式(现暂json)
  • ssl 通道加密 保证数据安全
  • data数据加密 保证数据安全
  • ID 规则设计 便于后期分布式拓展
  • session信息持久化或缓存
  • 异常监控 便于错误发现
  • 日志 便于错误处理
  • 线程池 提高执行效率 缓解通道压力
  • 数据压缩 提高传输效率

python-data

Python 简单数据处理

互联网中常见的数据基本基于 json xml 或者 html。本文介绍几种个人常用的组件,下载方式自行搜索,文中api仅供参考


json

Python自带json库,转换后和字典的操作方式相同

常用api:

  • json.loads() 字符转json
  • json.dumps() json转字符

python_request

python requests

requests 是出入python时就接触的网路请求神器,在学习了这么久后总结一些经验保存、学习。
这也是第一个python博客,顺便吐槽下 python的源码 注释真少 = = 好多都必须得看doc才能了解

安装

1
2
3
pip install requests
or
conda install requests (Anaconda)

RabbitMQ 拓展篇

jackson

在 rabbitMq 中还有个重要的组件是 MessageConverter,用于消息格式的设置。
默认使用amqp的 SimpleMessageConverter 使用text传输,在传输量较大的数据时比较消耗性能。
另一种就是 Jackson2JsonMessageConverter,使用json传输。

RabbitMQ 基础篇

消息队列

单线程中间件,主要用于异步通知、消息分发、缓存、分布式事务等场景。

RabbitMQ

主要有Exchange 交换器 和 Queue 队列功能组件。
生产者会向Exchange发送消息并且绑定一个RoutingKey,
Exchange 用来接收生产者发送的消息并通过模式和规则将这些消息路由给服务器中的队列,
Exchange通过BindingKey找到匹配的队列,Queue 用来保存消息直到发送给消费者。

aop

spring aop

通过自定义注解和aop实现参数校验.

配置

  • mvc 配置文件 添加
    1
    <aop:aspectj-autoproxy proxy-target-class="true"/>

开启自动切面代理