文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源:

  • 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备
  • 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备
  • 疯狂创客圈 价值1000元 百度网盘资源大礼包 随便取 GO->【博客园总入口
  • 独孤九剑 Netty灵魂实验 : 本地 100W连接 高并发实验,瞬间提升Java内力

文章目录

  • 写在前面
    • 1.1.1. 短连接API的接口准备
    • 1.1.2. 申明远程接口的本地代理
    • 1.1.3. 远程API的本地调用
  • 写在最后
  • 疯狂创客圈 亿级流量 高并发IM 学习实战

写在前面

​ 大家好,我是作者尼恩。目前和几个小伙伴一起,组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战

​ 在疯狂创客圈的 亿级流程的 IM 聊天程序 学习项目中,短连接Web服务器和长连接IM服务器之间,是相互配合的。在分布式集群的环境下,用户首先通过短连接登录Web服务器。Web服务器在完成用户的账号/密码验证,返回uid和token时,还需要通过一定策略,获取目标IM服务器的IP地址和端口号列表,返回给客户端。客户端开始连接IM服务器,连接成功后,发送鉴权请求,鉴权成功则授权的长连接正式建立。

​ 短连接的调用,使用Feign 技术。下面是详解。

​ 看完之后,Feign 独立使用,完全可以替换掉目前的Http 客户端调用方法。

​ 1.1. Feign短连接Restful调用

一般来说,短连接的服务接口,都是基于应用层Http协议的Http api 或者RESTful api实现,通过JSON文本格式返回数据。如何在Java服务端调用其他节点的Http api 或者RESTful api呢?

至少有以下几种方式:

(1)JDK原生的URLConnection

(2)Apache的Http Client/HttpComponents

(3)Netty的异步HTTP Client

(4)Spring的RestTemplate

目前用的最多的,基本上是第二种,这也是在单体服务时代,最为成熟和稳定的方式,也是效率较高的短连接方式。

插入一个解释: 什么是RESTful api。REST的全称是 Representational State Transfer,它是一种API接口的风格、也而不是标准,只是提供了一组调用的原则和约束条件。也就是说,在短连接服务的领域,它算是一种特殊格式的HTTP api。

回到前面的话题,如果同一个Http api/RESTful api 接口,倘若不止一个短连接服务器提供,而是有多个节点提供服务,那么,简单的使用Http Client调用,就无能为力了。

Http Client/HttpComponents调用不能根据接口的负载、或者其他的条件,去判断哪一个接口应该调用,哪一个接口不应该调用。解决这个问题的方式是啥呢?

可以使用Feign来调用多个服务器的同一个接口。Feign不仅仅可以进行同接口多服务器的负载均衡,一旦使用了Feign作为http api的客户端,调用远程的http接口就会变得像调用本地方法一样简单。

Feign是何方神圣?它是Netflix开发的一个声明式、模板化的HTTP客户端, Feign的目标是帮助Java工程师更快捷、优雅地调用HTTP API//RESTful api。另外,Feign被无缝集成到了SpringCloud微服务框架,使用Feign后,可以非常方便项目SpringCloud微服务技术。

如果项目使用了SpringCloud技术,那就就可以更加方便的声明式使用Feign。如果没有使用SpringCloud,使用Feign也非常之简单。Netflix Feign目前改名为OpenFeign,最新版本是2018.5发布的9.7.0。OpenFeign在Java应用中,负责处理与远程Web服务的请求响应,最大限度降低编码复杂性。可以说是Java应用中调用Web服务的客户端的利器。

下面就看看在单独使用Feign的场景下,是怎么调用远程的http服务。

引入Feign依赖的jar包到pom.xml:

 <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-core</artifactId><version>9.7.0</version>
</dependency>
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-gson</artifactId><version>9.7.0</version>
</dependency>

接下来,就可以开始使用Feign来调用远程的Http API了。

1.1.1. 短连接API的接口准备

前面讲到,高并发的IM系统中,用户的登录与认证、好友的更新与获取等等一些低频的请求,这些都使用短连接来实现。

作为演示,这里仅仅列举两个短连接的API接口:

(1) http://localhost:8080/user/{userid}

这个接口的功能,是用户获取用户信息,是一个典型的RESTful类型的接口。{userid}是一个占位符,调用的时候,需要替换成用户id。 比如说如果用户id为1,调用的链接为:http://localhost:8080/user/1 。

(2) http://localhost:8080/login/{username}/{password}

这个接口的功能,用户登录的认证。占位符{username}是表示用户名称,占位符{password}表示用户密码。 比如说如果用户名称为zhangsan,密码为123调用的链接为:http://localhost:8080/login/zhangsan/123 。

上面的接口很简单,仅仅是为了演示,不能用于生产场景。这些API可以使用Spring MVC 等常见的WEB技术来实现。

1.1.2. 申明远程接口的本地代理

如何通过Feign技术,来调用上面的这些Http API呢?

第一步,需要创建一个本地的API的代理接口。具体如下:

package com.crazymakercircle.imServer.feignClient;
import feign.Param;
import feign.RequestLine;
public interface UserAction
{@RequestLine("GET /login/{username}/{password}")public String loginAction(@Param("username") String username,@Param("password") String password);@RequestLine("GET /user/{userid}")public String getById(@Param("userid") Integer userid);
}

在代理接口中,为每一个远程Http API定义一个方法。

如何将方法对应到远程接口呢?

在方法的前面,加上一个@RequestLine 注解,注明远程Http API的请求地址。这个地址不需要从域名和端口开始,只需要从URI的根目录“/”开始即可。

比如,如果远程Http API的URL为:http://localhost:8080/user/{userid} ,@RequestLine 声明的值,只需要配成 /user/{userid} 即可。

如何给接口传递参数值呢?

在方法的参数前面, 加上一个 @Param 注解即可。 @Param内容为HTTP链接中参数占位符的名称。绑定好之后,实际这个Java接口中的参数值,会替换到@Param注解中的占位符。

比如:由于getById的唯一参数 userid的 @Param注解中,用到的占位符是userid。那么,通过调用 userAction.getById(100) ,那么userid的值100,就会用来替换掉请求链接http://localhost:8080/user/{userid} 中占位符userid,最终得到的请求链接为:http://localhost:8080/user/100。

1.1.3. 远程API的本地调用

在完成远程API的本地代理接口的定以后,接下来的工作就是调用本地代理,这个工作也是非常的简单。

还是以疯狂创客圈的实战项目,获取用户信息、和用户登录两个API的代理接口的调用为例。

实战的代码如下:

import com.crazymakercircle.imServer.feignClient.UserAction;
import feign.Feign;
import feign.Request;
import feign.Retryer;
import feign.codec.StringDecoder;
import org.junit.Test;/*** Created by 尼恩 at 疯狂创客圈*///@ContextConfiguration(
//        locations = { "classpath:application.properties" })
//@RunWith(SpringJUnit4ClassRunner.class)
//@Configuration
//自动加载配置信息
//@EnableAutoConfiguration
public class LoginActionTest
{
/*    // 服务器ip地址@Value("${server.web.user.url}")private String userBase;*/@Testpublic void testLogin(){UserAction action = Feign.builder()
//                .decoder(new GsonDecoder()).decoder(new StringDecoder()).options(new Request.Options(1000, 3500)).retryer(new Retryer.Default(5000, 5000, 3)).target(UserAction.class,
//                        userBase"http://localhost:8080/");String s = action.loginAction("zhangsan","zhangsan");System.out.println("s = " + s);}@Testpublic void testGetById(){UserAction action = Feign.builder()
//                .decoder(new GsonDecoder()).decoder(new StringDecoder()).target(UserAction.class,"http://localhost:8080/");String s = action.getById(2);System.out.println("s = " + s);}
}

主要的也是最为核心的就一步,构建一个远程代理接口的本地实例。使用Feign.builder() 构造器模式方法,带上一票配置方法的链式调用。主要的链式调用的配置方法介绍如下:

(1)target 配置方法

为构造器配置本地的代理接口,和远程的根目录。代理接口类的每一个接口方法前@RequestLine 声明的值,最终都会加上这个根目录。这个是最为重要的一个配置方法。代理接口类很重要,最终Feign.builder() 构造器返回的本地代理实例类型,就这个接口。

(2)options配置方法

options方法指定连接超时时长及响应超时时长。

(3)retryer配置方法

retryer方法主要是指定重试策略。

(4)decoder配置方法

decoder方法指定对象解码方式,这里用的是基于String字符串的解码方式。如果需要使用Jackson的解码方式,需要在pom.xml中添加Jackson的依赖。

主要的配置方法,就介绍这些,具体使用和其他的方法,请参见官网。

通过Feign.builder() 构造完成代理实例后,调用远程API,就变成了调用Java函数一样的简单。

建议,如果是独立调用Http服务,尽量使用Feign。

一是简单,

二是如果采用httpclient或其他相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战。

三是,既可以独立使用Feign,又可以方便后续的和Spring Could微服务框架继承。

总之,何乐而不为呢?

写在最后

下一篇: zookeeper + netty 实现高并发IM 聊天


疯狂创客圈 亿级流量 高并发IM 学习实战

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战
  • Netty 源码、原理、JAVA NIO 原理
  • Java 面试题 一网打尽
  • 疯狂创客圈 【 博客园 总入口 】



Feign - 独立使用 - 替代HttpClient相关推荐

  1. spring客户端resttemplate/feign/httpclient调研

    首先看下搜索引擎中的流行度 行 数量 spring resttemplate 13,300,000 spring feign 15,300,000 httpclient 47,600,000 按照往常 ...

  2. 微服系列之Feign使用HttpClient和OkHttp网络请求框架

    Feign实现了远程调用,底层默认使用的是HttpURLConnection网络请求框架 那Feign支不支持其他的网络请求框架呢,答案那是肯定的,Feign还支持HttpClient和OkHttp, ...

  3. 怎么用feign远程调用别人的接口_Feign - HTTP接口调用- 单独使用 - 实战

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -26[ 博客园 总入口 ] 写在前面 ? 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客圈].正在 ...

  4. 模拟RPC调用(Feign)

    目录 Feign简介 message-center改造 引入Feign依赖 修改启动类 创建Feign客户端 调用Feign客户端 关于传参 重写Feign的默认配置 关于超时 参考文章 Feign简 ...

  5. 《深入理解 Spring Cloud 与微服务构建》第八章 声明式调用 Feign

    ·# <深入理解 Spring Cloud 与微服务构建>第八章 声明式调用 Feign 文章目录 一.Feign 简介 1.简介 2.工作原理 二.写一个 Feign 客户端 三.Fei ...

  6. 详解用Java实现爬虫:HttpClient和Jsoup的介绍及使用(请求方式、请求参数、连接池、解析获取元素)

    一.介绍:何为爬虫 网络爬虫(Web crawler)也叫做网络机器人 可以代替人 自动地在互联网中进行数据信息的采集和整理 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 可以自动采集所有 ...

  7. SpringCloud 微服务(一)

    看完了黑马程序员的免费课程,感觉受益匪浅,写个笔记,记录一下 课程地址:https://www.bilibili.com/video/BV1LQ4y127n4?p=1 1.微服务框架,学习哪些内容 系 ...

  8. SpringCloud Alibaba 从入门到精通(精选)

    SpringCloud Alibaba 从入门到精通 一. 课程介绍 1.1 课程导学 1.2 项目环境搭建 二. SpringBoot基础 2.1 本章概述 2.2 Spring Boot是什么?能 ...

  9. Feign-独立使用-实战

    目录 写在前面 1.1.1. 短连接API的接口准备 1.1.2. 申明远程接口的本地代理 1.1.3. 远程API的本地调用 写在最后 疯狂创客圈 亿级流量 高并发IM 学习实战 疯狂创客圈 Jav ...

最新文章

  1. 最新!2020世界一流大学学术排名出炉:北京大学、清华大学、中国人民大学表现卓越!...
  2. linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
  3. 输出所有的合法的括号组合
  4. 上传jar包到Apache Archiva本地仓库
  5. 深入理解Kafka(2)-Producer
  6. 阿里云服务器mysql默认密码_阿里云服务器修改MySQL初始密码---Linux学习笔记
  7. 离奇的xenapp客户端无法加载应用故障解决过程 ...
  8. android logcat 根据包名过滤,adb logcat通过包名过滤(dos命令find后跟变量)
  9. 【Python】类的基本写法与注释风格
  10. UVA11027 Palindromic Permutation【回文】
  11. 99,36岁老码农现身说法
  12. 万字详解 阿里面试真题:请你说说索引的原理
  13. 桌面云服务器联想,联想Livc桌面云解决方案产品介绍
  14. UCLA教授朱松纯:走向通用人工智能,从大数据到大任务
  15. android app报告,知乎APP用户体验报告
  16. Valley Blue Pasture《谷蓝尼牧场》签到可领大红包
  17. python绘制动态图形_让Python绘制一套动态图形给你看看
  18. 无线通信-信道模型概念(Wireless Communication Overview)
  19. getline()的用法详解
  20. svchost.exe占用cpu100 的解决方法

热门文章

  1. cat全链路监控_全链路监控(一):方案概述
  2. Android Gradle排除依赖模块的某个类
  3. markdown使用方法大全
  4. I.MX6UL 时钟略解
  5. SaveLoad--Unity存档读档的学习总结
  6. stm32+hx711+蓝牙hc05 称重系统(蓝牙电子秤)
  7. The underlying provider failed on Open
  8. 网络结构及mac和phy介绍
  9. 医学统计学 第八章( t 检验)
  10. 手把手教你python实现量价形态选股知乎_如何通过量价形态选股