微服務(wù)都是獨立部署的,要實現(xiàn)一個業(yè)務(wù)可能需要多個服務(wù)之間的通信,所以遠程調(diào)用必不可少,本文將提供三種遠程調(diào)用的方案:jodd-http、RestTemplate、Feign。
在此說一下 springboot父子 工程的搭建流程:
先創(chuàng)建一個springboot項目,然后刪掉不必要的文件,如下圖:
然后創(chuàng)建子項目,新建模塊,選擇 maven 工程
注意:
UTF-8 UTF-8 1.8 2021.0.5 org.springframework.cloud spring-cloud-dependencies ${spring.cloud-version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.6.RELEASE pom import
前期準(zhǔn)備:
搭建好工程:
remote_service是模擬遠程服務(wù)的一個模塊,其controller代碼如下:
@RequestMapping("/remote")
@RestController
public class RemoteController {@GetMapping("/{name}")
public String sayHello(@PathVariable("name") String name) {return name.toUpperCase() + " 發(fā)起了請求,并請求成功";
}
}
RestTemplate 是spring自帶的遠程調(diào)用工具,所以只要有spring的依賴,都可以直接使用(隨便導(dǎo)入一個spring-boot-dependencies或者spring-boot-starter-web都行)。
2. 代碼在使用RestTemplate之前,需要先在容器中注冊。將下述代碼寫在一個配置類(@Configuration)中,或者直接寫在 啟動類(main)中都可以。
@Bean
public RestTemplate restTemplate() {return new RestTemplate();
}
controller代碼:
@RequestMapping("/rest")
@org.springframework.web.bind.annotation.RestController
public class RestController {private static final String NAME = "rest_template";
@Autowired
private RestTemplate restTemplate;
@GetMapping
public String sayHello() {String url = "http://127.0.0.1:8088/remote/" + NAME;
String msg = restTemplate.getForObject(url, String.class);
return msg;
}
}
測試: 請求成功。
RestTemplate的使用比較簡單,這里再簡單說一下它的常用方法:
方法 | 請求 | 說明 |
---|---|---|
getForEntity | GET | 常用:public |
getForObject | GET | 常用:public 對getForEntity函數(shù)的進一步封裝,只關(guān)注返回的消息體的內(nèi)容,對其他信息都不關(guān)注 |
postForEntity | POST | 常用:public |
postForObject | POST | 常用:public 對postForEntity函數(shù)的進一步封裝,只關(guān)注返回的消息體的內(nèi)容,對其他信息都不關(guān)注 |
postForLocation | POST | 常用:public URI postForLocation(地址, 上傳的參數(shù)(可為空)) 返回新資源所在的 url |
put | PUT | 常用:public void put(地址, 上傳的參數(shù)(可為空)) |
delete | DELETE | 常用:public void delete(地址, 上傳的參數(shù)) |
在這里補充一下Restful的HTTP動詞:
需要導(dǎo)入兩個依賴:
com.alibaba fastjson 1.2.83 org.jodd jodd-http 3.7.1
2. 代碼工具類:
import com.alibaba.fastjson.JSONObject;
import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.Map;
public class HttpUtil {public static String post(String url, Mapmap) {HttpResponse res = HttpRequest.post(url).connectionTimeout(90000).timeout(90000)
.contentType("application/json", "UTF-8")
.bodyText(JSONObject.toJSONString(map), "application/json", "UTF-8")
.send();
res.charset("utf-8");
return res.bodyText();
}
public static String post(String url, String jsonStr) {HttpResponse resp = HttpRequest.post(url).connectionTimeout(60000).timeout(60000)
.contentType("application/json", StandardCharsets.UTF_8.toString())
.bodyText(jsonStr ,"application/json", "UTF-8")
.send();
resp.charset(StandardCharsets.UTF_8.toString());
return resp.bodyText();
}
public static String get(String url, Mapparams) {HttpRequest request = HttpRequest.get(url);
if (params != null) {request.query(params);
}
HttpResponse response = request.send();
return response.bodyText();
}
}
Controller:
@RequestMapping("/jodd")
@RestController
public class JoddController {private static final String NAME = "jodd_http";
@GetMapping
public String sayHello() {String url = "http://127.0.0.1:8088/remote/" + NAME;
String msg = HttpUtil.get(url, new HashMap<>());
return msg;
}
}
3. 測試注意: 這個我在之前的文章中講過,點擊跳轉(zhuǎn) ,這里就不再多說。
3. FeignFeign是一個聲明式的http客戶端:點擊圖片跳轉(zhuǎn)。
鑒于前面的兩種方法,對于參數(shù)復(fù)雜URL難以維護,所以建議使用Feign。
1. 引入依賴Feign是基于springcloud來發(fā)起遠程請求的,需要與nacos等注冊中心搭配使用,點擊跳轉(zhuǎn)注冊中心文章。
要引入Feign依賴,就需要先引入springcloud的依賴:
org.springframework.cloud spring-cloud-dependencies 2021.0.5 pom import
注意: 引入springcloud依賴的時候,需要注意springboot的版本。
- springboot 與 springcloud 的版本對應(yīng)關(guān)系
點擊圖片跳轉(zhuǎn)
然后導(dǎo)入Feign依賴:
org.springframework.cloud spring-cloud-starter-openfeign 3.1.2
注意: 啟動項目報錯:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
解決方案: https://blog.csdn.net/qq_43788878/article/details/115764008
2. 使用過程在啟動類上添加一個@EnableFeignClients
編寫Feign接口
@Component
//@FeignClient:微服務(wù)客戶端注解,value:指定微服務(wù)的名字,這樣就可以使Feign客戶端直接找到對應(yīng)的微服務(wù)
@FeignClient(value = "remote")
public interface MyFeignClient {@GetMapping("/remote/{name}")
String sayHello(@PathVariable("name") String name);
}
這個客戶端主要是基于SpringMVC的注解來聲明遠程調(diào)用的信息,比如:
這樣,F(xiàn)eign就可以幫助我們發(fā)送http請求,無需自己使用RestTemplate來發(fā)送了。
controller
@RestController("/feign")
public class FeignController {private static final String NAME = "feign";
@Resource
private MyFeignClient feignClient;
@GetMapping
public String sayHello() {String msg = feignClient.sayHello(NAME);
return msg;
}
}
以上就是Feign的使用步驟,因為懶得去搭建注冊中心,所以就不測試了。
3. 自定義配置Feign可以支持很多的自定義配置,如下表所示:
類型 | 作用 | 說明 |
---|---|---|
feign.Logger.Level | 修改日志級別 | 包含四種不同的級別:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 響應(yīng)結(jié)果的解析器 | http遠程調(diào)用的結(jié)果做解析,例如解析json字符串為java對象 |
feign.codec.Encoder | 請求參數(shù)編碼 | 將請求參數(shù)編碼,便于通過http請求發(fā)送 |
feign. Contract | 支持的注解格式 | 默認是SpringMVC的注解 |
feign. Retryer | 失敗重試機制 | 請求失敗的重試機制,默認是沒有,不過會使用Ribbon的重試 |
一般情況,直接使用默認配置就OK了。
自定義配置的方法:
方法一:修改配置文件
feign:
client:
config:
remote: # 針對某個微服務(wù)的配置,這里也可以使用 default(全局配置),針對所有微服務(wù)
loggerLevel: FULL # 日志級別
日志的四種級別:
- NONE:不記錄任何日志信息,這是默認值
- BASIC:僅記錄請求的方法,URL以及響應(yīng)狀態(tài)碼和執(zhí)行時間
- HEADERS:在BASIC的基礎(chǔ)上,額外記錄了請求和響應(yīng)的頭信息
- FULL:記錄所有請求和響應(yīng)的明細,包括頭信息、請求體、元數(shù)據(jù)
方式二:Java代碼
先聲明一個類,然后聲明一個Logger.Level的對象
public class DefaultFeignConfiguration {@Bean
public Logger.Level feignLogLevel(){return Logger.Level.FULL; // 日志級別為BASIC
}
}
啟動類添加注解(全局配置,針對所有微服務(wù)):
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
添加到自定義FeignClient接口中(針對某一微服務(wù)):
@FeignClient(value = "remote", configuration = DefaultFeignConfiguration .class)
URLConnection:默認實現(xiàn),不支持連接池
Apache HttpClient :支持連接池
OKHttp:支持連接池
優(yōu)化演示:
引入feign-httpclient依賴(帶連接池的客戶端)
io.github.openfeign feign-httpclient
配置連接池和日志
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志級別,BASIC就是基本的請求和響應(yīng)信息
httpclient:
enabled: true # 開啟feign對HttpClient的支持
max-connections: 200 # 大的連接數(shù)
max-connections-per-route: 50 # 每個路徑的大連接數(shù)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧