springboot 2.1.7.RELEASE
feign的版本:
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.2.3</version>
</dependency>
使用時,配置config類
package com.young.springdemo.config;
import feign.Feign;
import okhttp3.ConnectionPool;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignConfig {
@Bean
public okhttp3.OkHttpClient okHttpClient(){
return new okhttp3.OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool())
.build();
}
}
springapplication主類上添加註解
@EnableFeignClients
編寫feign調用接口
@FeignClient(name = "feignSerive", url = "192.168.100.52:16010/myapi")
public interface FeignService {
url可以配置文件編寫;
接口形式爲下面:
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
ResponseData<String> invoke();
@Component
class DefaultFallback implements FeignService {
@Override
public ResponseData<String> invoke() {
throw new RuntimeException();
// return new ResponseData<String>().setCode("40004").setDesc("服務異常").setData(null);
}
調用時,直接在controller中,注入該接口,此時,還需要實現該接口,拋出異常處理.可以內部類,可以外部都可以..
再看下192.168.100.52:16010/myapi/test 對應的接口,
@RequestMapping(value = "test",method = RequestMethod.GET)
public void getTest(){
System.out.println("無參GET方法,調用成功");
return;
}
很簡單,只是暴露簡單的業務來執行.
東西不多,坑很多,要調用的類型也很多,所以將所有的代碼貼出來,大家參考就行,我也是參考別人的....
兩個通用實體類
package com.young.springdemo.utils.domain;
public class ResponseData<T> {
private String code;
private String desc;
private T data;
public String getCode() {
return code;
}
public ResponseData<T> setCode(String code) {
this.code = code;
return this;
}
public String getDesc() {
return desc;
}
public ResponseData<T> setDesc(String desc) {
this.desc = desc;
return this;
}
public T getData() {
return data;
}
public ResponseData<T> setData(T data) {
this.data = data;
return this;
}
}
package com.young.springdemo.utils.domain;
public class DemoResp {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
外部被調用接口實現:
package com.young.springdemo.utils.domain;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "myapi")
@ResponseBody
public class TestController {
@RequestMapping(value = "test",method = RequestMethod.GET)
public void getTest(){
System.out.println("無參GET方法,調用成功");
return;
}
@RequestMapping(value = "getParam",method = RequestMethod.GET)
@ResponseBody
public String getParam(@RequestParam String name,@RequestParam String age) {
System.out.println("有參GET,獲取到的參數name位:" + name+"==== age:"+age);
return name;
}
@RequestMapping(value = "getPost",method = RequestMethod.POST)
@ResponseBody
public String getPost(){
System.out.println("調用無參post成功");
return "SUCCESS";
}
@RequestMapping(value = "getPostParam",method = RequestMethod.POST)
@ResponseBody
public String getPostParam(@RequestParam("name")String name){
System.out.println("調用有參成功,name:"+name);
DemoResp demoResp = new DemoResp();
demoResp.setName(name);
return name;
}
@RequestMapping(value = "getPostResult",method = RequestMethod.POST)
@ResponseBody
public ResponseData getPostResult(){
System.out.println("調用無參post成功");
return new ResponseData<DemoResp>().setCode("200");
}
@RequestMapping(value = "getPostParamResult",method = RequestMethod.POST)
@ResponseBody
public ResponseData<DemoResp> getPostParamResult(@RequestParam("name")String name){
System.out.println("調用有參成功,name:"+name);
DemoResp demoResp = new DemoResp();
demoResp.setName(name);
return new ResponseData<DemoResp>().setCode("200").setData(demoResp);
}
@RequestMapping(value = "getPostParamEntityResult",method = RequestMethod.POST)
@ResponseBody
public ResponseData<DemoResp> getPostParamResult(@RequestBody DemoResp resParam){
System.out.println("調用有參成功,name:"+resParam.toString());
return new ResponseData<DemoResp>().setCode("200").setData(resParam);
}
}
內部feign接口調用
package com.young.springdemo.service.feign;
import com.sun.org.apache.regexp.internal.RE;
import com.young.springdemo.utils.DemoResp;
import com.young.springdemo.utils.ResponseData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = "feignSerive", url = "192.168.100.52:16010/myapi")
public interface FeignService {
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
ResponseData<String> invoke();
@RequestMapping(value = "getParam",method = RequestMethod.GET)
String getParam(@RequestParam(value = "name") String name,@RequestParam(value = "age")String age);
@RequestMapping(value = "getPost",method = RequestMethod.POST)
String getPost();
@RequestMapping(value = "getPostParam",method = RequestMethod.POST)
String getPostParam(@RequestParam(value = "name")String name);
@RequestMapping(value = "getPostResult",method = RequestMethod.POST)
ResponseData<DemoResp> getPostResult();
@RequestMapping(value = "getPostParamResult",method = RequestMethod.POST)
ResponseData<DemoResp> getPostParamResult(@RequestParam(value = "name")String name);
@RequestMapping(value = "getPostParamEntityResult",method = RequestMethod.POST)
ResponseData<DemoResp> getPostParamEntityResult(@RequestBody DemoResp resp);
@Component
class DefaultFallback implements FeignService {
@Override
public ResponseData<String> invoke() {
throw new RuntimeException();
// return new ResponseData<String>().setCode("40004").setDesc("服務異常").setData(null);
}
@Override
public String getParam(String name,String age) {
throw new RuntimeException();
}
@Override
public String getPost() {
throw new RuntimeException();
}
@Override
public String getPostParam(String name) {
throw new RuntimeException();
}
@Override
public ResponseData<DemoResp> getPostResult() {
throw new RuntimeException();
}
@Override
public ResponseData<DemoResp> getPostParamResult(String name) {
throw new RuntimeException();
}
@Override
public ResponseData<DemoResp> getPostParamEntityResult(DemoResp resp) {
throw new RuntimeException();
}
}
}
自身調用接口
package com.young.springdemo.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.young.springdemo.AsyncService.StudentServiceAsync;
import com.young.springdemo.service.feign.FeignService;
import com.young.springdemo.utils.DemoResp;
import com.young.springdemo.utils.ResponseData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import java.io.*;
@RestController
@RequestMapping("/myapi")
public class StudentController {
private final static Logger logger = LoggerFactory.getLogger(StudentController.class);
@Autowired
private StudentServiceAsync studentServiceAsync;
@RequestMapping(value = "getStu", method = RequestMethod.GET)
@ResponseBody
public void getStudent() {
logger.info("開始執行接口");
for (int i = 0; i < 5; i++) {
studentServiceAsync.getStudent();
studentServiceAsync.getStu();
}
logger.info("結束執行接口");
}
@RequestMapping(value = "testPy", method = RequestMethod.GET)
@ResponseBody
public void testPy() {
}
public static void main(String[] args) {
String line;
try {
//創建讀取python的必要條件.
// 數組1:必須是"python",指定文件格式
//數組2:該python的文件的路徑,可以是絕對路徑,也可以是相對路徑
//數組3及以後:是對python調用的方式的傳遞參數的方式
String[] params = new String[]
{"python", "D:\\py\\project\\hello_py.py", "小明", "20"};
//給調用python分配一個進程,並執行py文件
Process process = Runtime.getRuntime().exec(params); //執行py文件
//讀取python寫的數據
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
while ((line = in.readLine()) != null) {
//todo 輸出處理python傳輸數據
System.out.println(line);
}
in.close();//關閉字節流
//java代碼中的process.waitFor()返回值爲0表示我們調用python腳本成功,
//返回值爲1表示調用python腳本失敗
int re = process.waitFor();//0:執行成功;1:執行失敗;2:調用失敗
switch (re) {
case 0:
//todo :執行成功
System.out.println("調用python,執行成功");
break;
case 1:
//todo :執行失敗
System.out.println("調用python,執行失敗");
break;
case 2:
//todo: 調用失敗
System.out.println("調用python文件失敗");
}
} catch (Exception e) {
e.printStackTrace();
}
}
//測試Feign
@Autowired
private FeignService feignClientProxy;
@RequestMapping(value = "test")
@ResponseBody
public String testFeign(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("開始執行");
ResponseData<String> respResponseBody = feignClientProxy.invoke();
System.out.println("執行結束");
return "調用結果:"+ objectMapper.writeValueAsString(respResponseBody);
}
@RequestMapping(value = "getParam",method =RequestMethod.GET)
@ResponseBody
public String getParam(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("開始執行");
String obj = feignClientProxy.getParam(name,"12");
System.out.println("執行結束");
return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
}
@RequestMapping(value = "getPost",method =RequestMethod.POST)
@ResponseBody
public String getPost() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("開始執行");
String obj = feignClientProxy.getPost();
System.out.println("執行結束");
return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
}
@RequestMapping(value = "getPostParam",method =RequestMethod.POST)
@ResponseBody
public String getPostParam(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("開始執行");
String obj = feignClientProxy.getPostParam(name);
System.out.println("執行結束");
return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
}
@RequestMapping(value = "getPostParamResult",method =RequestMethod.POST)
@ResponseBody
public String getPostParamResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
ResponseData<DemoResp> postParamResult = feignClientProxy.getPostParamResult(name);
System.out.println("執行結束,"+postParamResult.toString());
return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
}
@RequestMapping(value = "getPostResult",method =RequestMethod.POST)
@ResponseBody
public String getPostResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println("開始執行");
ResponseData<DemoResp> postParamResult = feignClientProxy.getPostResult();
System.out.println("執行結束,"+postParamResult.toString());
return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
}
@RequestMapping(value = "getPostParamEntityResult",method =RequestMethod.POST)
@ResponseBody
public ResponseData getPostParamEntityResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
DemoResp demoResp = new DemoResp();
demoResp.setName(name);
ResponseData<DemoResp> postParamResult = feignClientProxy.getPostParamEntityResult(demoResp);
return postParamResult;
// System.out.println("執行結束,"+postParamResult.toString());
// return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
}
}