最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用okhttp替換Feign默認(rèn)Client的操作

 更新時間:2021年02月25日 09:10:56   作者:chengqiuming  
這篇文章主要介紹了使用okhttp替換Feign默認(rèn)Client的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一 關(guān)鍵pom

<dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- Spring Cloud OpenFeign的Starter的依賴 -->
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
 <dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
 </dependency>
</dependencies>

二 核心配置

server:
 port: 8011
spring:
 application:
 name: ch4-3-okhttp
 
feign:
 httpclient:
   enabled: false
 okhttp:
   enabled: true

三 其他代碼位置

https://github.com/cakin24/spring-cloud-code/tree/master/ch4-3/ch4-3-okhttp

四 運(yùn)行測試

補(bǔ)充:Feign - 獨(dú)立使用 - 替代HttpClient

學(xué)習(xí)項目中,短連接Web服務(wù)器和長連接IM服務(wù)器之間,是相互配合的。在分布式集群的環(huán)境下,用戶首先通過短連接登錄Web服務(wù)器。Web服務(wù)器在完成用戶的賬號/密碼驗證,返回uid和token時,還需要通過一定策略,獲取目標(biāo)IM服務(wù)器的IP地址和端口號列表,返回給客戶端。客戶端開始連接IM服務(wù)器,連接成功后,發(fā)送鑒權(quán)請求,鑒權(quán)成功則授權(quán)的長連接正式建立。

短連接的調(diào)用,使用Feign 技術(shù)。下面是詳解。

看完之后,F(xiàn)eign 獨(dú)立使用,完全可以替換掉目前的Http 客戶端調(diào)用方法。

​ 1.1. Feign短連接Restful調(diào)用

一般來說,短連接的服務(wù)接口,都是基于應(yīng)用層Http協(xié)議的Http api 或者RESTful api實現(xiàn),通過JSON文本格式返回數(shù)據(jù)。如何在Java服務(wù)端調(diào)用其他節(jié)點的Http api 或者RESTful api呢?

至少有以下幾種方式:

(1)JDK原生的URLConnection

(2)Apache的Http Client/HttpComponents

(3)Netty的異步HTTP Client

(4)Spring的RestTemplate

目前用的最多的,基本上是第二種,這也是在單體服務(wù)時代,最為成熟和穩(wěn)定的方式,也是效率較高的短連接方式。

插入一個解釋: 什么是RESTful api。REST的全稱是 Representational State Transfer,它是一種API接口的風(fēng)格、也而不是標(biāo)準(zhǔn),只是提供了一組調(diào)用的原則和約束條件。也就是說,在短連接服務(wù)的領(lǐng)域,它算是一種特殊格式的HTTP api。

回到前面的話題,如果同一個Http api/RESTful api 接口,倘若不止一個短連接服務(wù)器提供,而是有多個節(jié)點提供服務(wù),那么,簡單的使用Http Client調(diào)用,就無能為力了。

Http Client/HttpComponents調(diào)用不能根據(jù)接口的負(fù)載、或者其他的條件,去判斷哪一個接口應(yīng)該調(diào)用,哪一個接口不應(yīng)該調(diào)用。解決這個問題的方式是啥呢?

可以使用Feign來調(diào)用多個服務(wù)器的同一個接口。Feign不僅僅可以進(jìn)行同接口多服務(wù)器的負(fù)載均衡,一旦使用了Feign作為http api的客戶端,調(diào)用遠(yuǎn)程的http接口就會變得像調(diào)用本地方法一樣簡單。

Feign是何方神圣?它是Netflix開發(fā)的一個聲明式、模板化的HTTP客戶端, Feign的目標(biāo)是幫助Java工程師更快捷、優(yōu)雅地調(diào)用HTTP API//RESTful api。另外,F(xiàn)eign被無縫集成到了SpringCloud微服務(wù)框架,使用Feign后,可以非常方便項目SpringCloud微服務(wù)技術(shù)。

如果項目使用了SpringCloud技術(shù),那就就可以更加方便的聲明式使用Feign。如果沒有使用SpringCloud,使用Feign也非常之簡單。Netflix Feign目前改名為OpenFeign,最新版本是2018.5發(fā)布的9.7.0。OpenFeign在Java應(yīng)用中,負(fù)責(zé)處理與遠(yuǎn)程Web服務(wù)的請求響應(yīng),最大限度降低編碼復(fù)雜性??梢哉f是Java應(yīng)用中調(diào)用Web服務(wù)的客戶端的利器。

下面就看看在單獨(dú)使用Feign的場景下,是怎么調(diào)用遠(yuǎn)程的http服務(wù)。

引入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來調(diào)用遠(yuǎn)程的Http API了。

1.1.1. 短連接API的接口準(zhǔn)備

前面講到,高并發(fā)的IM系統(tǒng)中,用戶的登錄與認(rèn)證、好友的更新與獲取等等一些低頻的請求,這些都使用短連接來實現(xiàn)。

作為演示,這里僅僅列舉兩個短連接的API接口:

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

這個接口的功能,是用戶獲取用戶信息,是一個典型的RESTful類型的接口。{userid}是一個占位符,調(diào)用的時候,需要替換成用戶id。 比如說如果用戶id為1,調(diào)用的鏈接為:http://localhost:8080/user/1 。

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

這個接口的功能,用戶登錄的認(rèn)證。占位符{username}是表示用戶名稱,占位符{password}表示用戶密碼。 比如說如果用戶名稱為zhangsan,密碼為123調(diào)用的鏈接為:http://localhost:8080/login/zhangsan/123 。

上面的接口很簡單,僅僅是為了演示,不能用于生產(chǎn)場景。這些API可以使用Spring MVC 等常見的WEB技術(shù)來實現(xiàn)。

1.1.2. 申明遠(yuǎn)程接口的本地代理

如何通過Feign技術(shù),來調(diào)用上面的這些Http API呢?

第一步,需要創(chuàng)建一個本地的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);
}

在代理接口中,為每一個遠(yuǎn)程Http API定義一個方法。

如何將方法對應(yīng)到遠(yuǎn)程接口呢?

在方法的前面,加上一個@RequestLine 注解,注明遠(yuǎn)程Http API的請求地址。這個地址不需要從域名和端口開始,只需要從URI的根目錄“/”開始即可。

比如,如果遠(yuǎn)程Http API的URL為:http://localhost:8080/user/{userid} ,@RequestLine 聲明的值,只需要配成 /user/{userid} 即可。

如何給接口傳遞參數(shù)值呢?

在方法的參數(shù)前面, 加上一個 @Param 注解即可。 @Param內(nèi)容為HTTP鏈接中參數(shù)占位符的名稱。綁定好之后,實際這個Java接口中的參數(shù)值,會替換到@Param注解中的占位符。

比如:由于getById的唯一參數(shù) userid的 @Param注解中,用到的占位符是userid。那么,通過調(diào)用 userAction.getById(100) ,那么userid的值100,就會用來替換掉請求鏈接http://localhost:8080/user/{userid} 中占位符userid,最終得到的請求鏈接為:http://localhost:8080/user/100。

1.1.3. 遠(yuǎn)程API的本地調(diào)用

在完成遠(yuǎn)程API的本地代理接口的定以后,接下來的工作就是調(diào)用本地代理,這個工作也是非常的簡單。

還是以瘋狂創(chuàng)客圈的實戰(zhàn)項目,獲取用戶信息、和用戶登錄兩個API的代理接口的調(diào)用為例。

實戰(zhàn)的代碼如下:

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 瘋狂創(chuàng)客圈
 */
//@ContextConfiguration(
//  locations = { "classpath:application.properties" })
//@RunWith(SpringJUnit4ClassRunner.class)
//@Configuration
//自動加載配置信息
//@EnableAutoConfiguration
public class LoginActionTest
{
/* // 服務(wù)器ip地址
 @Value("${server.web.user.url}")
 private String userBase;*/
 @Test
 public 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);
 }
 @Test
 public 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);
 }
}

主要的也是最為核心的就一步,構(gòu)建一個遠(yuǎn)程代理接口的本地實例。使用Feign.builder() 構(gòu)造器模式方法,帶上一票配置方法的鏈?zhǔn)秸{(diào)用。主要的鏈?zhǔn)秸{(diào)用的配置方法介紹如下:

(1)target 配置方法

為構(gòu)造器配置本地的代理接口,和遠(yuǎn)程的根目錄。代理接口類的每一個接口方法前@RequestLine 聲明的值,最終都會加上這個根目錄。這個是最為重要的一個配置方法。代理接口類很重要,最終Feign.builder() 構(gòu)造器返回的本地代理實例類型,就這個接口。

(2)options配置方法

options方法指定連接超時時長及響應(yīng)超時時長。

(3)retryer配置方法

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

(4)decoder配置方法

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

主要的配置方法,就介紹這些,具體使用和其他的方法,請參見官網(wǎng)。

通過Feign.builder() 構(gòu)造完成代理實例后,調(diào)用遠(yuǎn)程API,就變成了調(diào)用Java函數(shù)一樣的簡單。

建議,如果是獨(dú)立調(diào)用Http服務(wù),盡量使用Feign。

一是簡單,

二是如果采用httpclient或其他相對較重的框架,對初學(xué)者來說編碼量與學(xué)習(xí)曲線都會是一個挑戰(zhàn)。

三是,既可以獨(dú)立使用Feign,又可以方便后續(xù)的和Spring Could微服務(wù)框架繼承。

總之,何樂而不為呢?

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • java的Jackson框架實現(xiàn)輕易轉(zhuǎn)換JSON

    java的Jackson框架實現(xiàn)輕易轉(zhuǎn)換JSON

    本篇文章主要介紹了java的Jackson框架實現(xiàn)輕易轉(zhuǎn)換JSON,Jackson將Java對象轉(zhuǎn)換成json對象和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對象,有興趣的可以了解一下。
    2017-02-02
  • SSH框架網(wǎng)上商城項目第10戰(zhàn)之搭建商品類基本模塊

    SSH框架網(wǎng)上商城項目第10戰(zhàn)之搭建商品類基本模塊

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項目第10戰(zhàn)之搭建商品類基本模塊的相關(guān)資料,有一定的實用性,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java字符串相關(guān)類使用方法詳解

    Java字符串相關(guān)類使用方法詳解

    String、StringBuilder、StringBuffer還傻傻分不清,下面這篇文章主要給大家介紹了關(guān)于Java字符串相關(guān)類使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 詳談Java8新特性泛型的類型推導(dǎo)

    詳談Java8新特性泛型的類型推導(dǎo)

    這篇文章我們來看一篇關(guān)于Java8新特性之泛型的類型推導(dǎo),希望這篇文章能夠讓各位深入到了解到關(guān)于Java8新特性之泛型的類型用法,有需要的朋友們下面來一起看看吧。
    2016-09-09
  • java byte與base64的互轉(zhuǎn)的實現(xiàn)示例

    java byte與base64的互轉(zhuǎn)的實現(xiàn)示例

    在項目開發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Java中Klass模型與類加載的詳細(xì)機(jī)制

    Java中Klass模型與類加載的詳細(xì)機(jī)制

    這篇文章主要介紹了Java中Klass模型與類加載的詳細(xì)機(jī)制,java語言是在jvm中運(yùn)行而jvm是不認(rèn)識java代碼的我們使用javac編譯的class文件jvm是不認(rèn)識的 所以有一個類加載的動作 這個動作就是把class字節(jié)碼拼裝成一個klass類型,需要的朋友可以參考下
    2023-08-08
  • 詳解Java如何利用位操作符創(chuàng)建位掩碼

    詳解Java如何利用位操作符創(chuàng)建位掩碼

    在本文中,我們來看看如何使用位操作符實現(xiàn)低級別的位掩碼。我們將看到我們?nèi)绾螌⒁粋€單一的int變量作為一個單獨(dú)的數(shù)據(jù)容器,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    本文主要對SpringBoot2.x集成騰訊云短信進(jìn)行簡單總結(jié),其中SpringBoot使用的2.4.5版本,本文通過業(yè)務(wù)流程圖實例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • SpringBoot集成Spring Security的方法

    SpringBoot集成Spring Security的方法

    Spring security,是一個強(qiáng)大的和高度可定制的身份驗證和訪問控制框架。這篇文章主要介紹了SpringBoot集成Spring Security的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • springboot如何使用yml文件方式配置shardingsphere

    springboot如何使用yml文件方式配置shardingsphere

    這篇文章主要介紹了springboot如何使用yml文件方式配置shardingsphere問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

东明县| 古丈县| 桃源县| 呼玛县| 玛曲县| 平塘县| 绿春县| 青州市| 怀化市| 长兴县| 金秀| 金山区| 陇南市| 绥德县| 福清市| 永嘉县| 罗甸县| 绥宁县| 新竹市| 尚志市| 大英县| 灌云县| 涞水县| 农安县| 安龙县| 游戏| 东阳市| 桐乡市| 交口县| 台北县| 台东县| 阿城市| 河池市| 镇安县| 偏关县| 陇西县| 无极县| 岱山县| 台中市| 浦城县| 吴旗县|