SpringCloud OpenFeign基本介紹與實(shí)現(xiàn)示例
介紹
在上面一篇介紹Nacos的文章最后,兩個(gè)服務(wù)的相互調(diào)用是用的RestTemplate類完成的。但這種方式不是很推薦,更佳的方式是用OpenFeign組件去調(diào)用。OpenFeign是官方推出的服務(wù)調(diào)用和負(fù)載均衡組件,基于Ribbon和Hystrix,前身是第一代Spring Cloud的Feign,對(duì)Feign進(jìn)行了擴(kuò)展,支持了SpringMvc的相關(guān)注解。
常用注解
OpenFeign是使用接口+注解實(shí)現(xiàn)的,因此了解它的常用注解是必要的,有以下幾個(gè):
@EnableFeignClients:在啟動(dòng)類上添加,用于開啟OpenFeign功能。當(dāng)項(xiàng)目啟動(dòng)時(shí),會(huì)掃描帶有@FeignClient的接口,生成代理類并注冊(cè)到Spring容器中
@FeignClient:通知OpenFeign組件對(duì)該注解下的接口進(jìn)行解析,通過動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類,完成服務(wù)調(diào)用
@RequestMapping:SpringMvc中的注解,不過此時(shí)該注解表示發(fā)起Request請(qǐng)求(默認(rèn)Get方式)
@GetMapping:SpringMvc中的注解,不過此時(shí)該注解表示發(fā)起Get請(qǐng)求
@PostMapping:SpringMvc中的注解,不過此時(shí)該注解表示發(fā)起Post請(qǐng)求
代碼實(shí)現(xiàn)
首先得把Nacos啟動(dòng)
服務(wù)提供方,
bootstrap.yml:
server:
port: 8083
servlet:
context-path: /nacosProviderspring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
引入依賴:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
服務(wù)方法:
@Controller
@RequestMapping("/provide")
public class ProviderController {
@RequestMapping("/distribute")
@ResponseBody
public String distribute() {
return "吃雞胸肉";
}
@RequestMapping("/distribute1")
@ResponseBody
public String distribute1(String name, Integer age) {
return "姓名:" + name + ",年齡:" + age;
}
@PostMapping("/distribute2")
@ResponseBody
public String distribute2(@RequestBody Person p) {
return "身高:" + p.getHeight() + ",膚色:" + p.getSkin();
}
}
import lombok.Data;
@Data
public class Person {
private Integer height;
private String skin;
}
服務(wù)調(diào)用方,
bootstrap.yml
server:
port: 8082
servlet:
context-path: /nacosInvokespring:
application:
name: nacos-invoke
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
引入依賴:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
啟動(dòng)類上添加注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
//開啟OpenFeign
@EnableFeignClients
@SpringBootApplication
public class NacosInvokeApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
創(chuàng)建@FeignClient修飾的接口:
import com.gs.nacos_invoke.dto.Person;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* value值是服務(wù)提供方的服務(wù)名稱
*/
@FeignClient(value = "nacos-provider")
public interface InvokeClient {
@GetMapping("/nacosProvider/provide/distribute")
String distribute();
@GetMapping("/nacosProvider/provide/distribute1")
String distribute1(@RequestParam("name") String name,
@RequestParam("age") Integer age);
@PostMapping("/nacosProvider/provide/distribute2")
String distribute2(@RequestBody Person p);
}
Person類(服務(wù)調(diào)用方再創(chuàng)建一個(gè),不是同一個(gè)):
import lombok.Data;
@Data
public class Person {
private Integer height;
private String skin;
}
編寫控制器,使用接口請(qǐng)求提供方的服務(wù):
import com.gs.nacos_invoke.dto.Person;
import com.gs.nacos_config.feign.InvokeClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private InvokeClient invokeClient;
@GetMapping("/invoke")
public void invoke(String name, Integer age) {
String str = invokeClient.distribute();
System.out.println(str);
}
@GetMapping("/invoke1")
public void invoke1() {
String str = invokeClient.distribute1("coder", 20);
System.out.println(str);
}
@GetMapping("/invoke2")
public void invoke2() {
Person p = new Person();
p.setHeight(183);
p.setSkin("黃皮膚");
String s = invokeClient.distribute2(p);
System.out.println(s);
}
}
注意事項(xiàng)
OpenFeign是基于Ribbon的,所以它默認(rèn)是負(fù)載均衡的。其次,它也是基于Hystrix的,有超時(shí)降級(jí)的處理:默認(rèn)服務(wù)提供方的接口超時(shí)時(shí)間是1s,超過1s服務(wù)調(diào)用方會(huì)報(bào)錯(cuò)。1s是可以配置的,按照業(yè)務(wù)需要調(diào)整。@FeignClient注解有個(gè)fallback屬性,當(dāng)該屬性有值時(shí),服務(wù)提供方超時(shí),會(huì)返回程序所指定的降級(jí)值。
服務(wù)調(diào)用方,bootstrap.yml添加(更規(guī)范的做法是引入spring-cloud-starter-alibaba-nacos-config依賴,nacos中新建配置,然后在這個(gè)配置中添加):
feign:
hystrix:
enabled: true
ribbon:
# 請(qǐng)求連接的超時(shí)時(shí)間
ConnectionTimeout: 3000
# 請(qǐng)求處理的超時(shí)時(shí)間
ReadTimeout: 3000hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
接口修改為:
import com.gs.nacos_invoke.dto.Person;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "nacos-provider",
fallback = InvokeClientFallback.class)
public interface InvokeClient {
@GetMapping("/nacosProvider/provide/distribute")
String distribute();
@GetMapping("/nacosProvider/provide/distribute1")
String distribute1(@RequestParam("name") String name,
@RequestParam("age") Integer age);
@PostMapping("/nacosProvider/provide/distribute2")
String distribute2(@RequestBody Person p);
}
fallback指定的類:
import com.gs.nacos_invoke.dto.Person;
import org.springframework.stereotype.Component;
@Component
public class InvokeClientFallback implements InvokeClient {
@Override
public String distribute() {
return "超時(shí)3s";
}
@Override
public String distribute1(String name, Integer age) {
return "超時(shí)3s";
}
@Override
public String distribute2(Person p) {
return "超時(shí)3s";
}
}
服務(wù)提供方ProviderController類的方法中,加入Thread.sleep(4000);或者throw new RuntimeException("拋異常");來觸發(fā)降級(jí)(拋出未捕獲的異常也能觸發(fā))。
到此這篇關(guān)于SpringCloud OpenFeign基本介紹與實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringCloud OpenFeign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java之Springcloud Feign組件詳解
- Java之Springcloud Gateway內(nèi)置路由案例講解
- Java之SpringCloud nocos注冊(cè)中心講解
- Java之SpringCloud Eurka注冊(cè)錯(cuò)誤解決方案
- SpringSecurit鹽值加密的密碼驗(yàn)證以及強(qiáng)密碼驗(yàn)證過程
- springcloud引入spring-cloud-starter-openfeign失敗的解決
- SpringCloud OpenFeign Post請(qǐng)求400錯(cuò)誤解決方案
- Java中?springcloud.openfeign應(yīng)用案例解析
相關(guān)文章
websocket在springboot+vue中的使用教程
這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解,定時(shí)任務(wù)是企業(yè)級(jí)開發(fā)中最常見的功能之一,如定時(shí)統(tǒng)計(jì)訂單數(shù)、數(shù)據(jù)庫(kù)備份、定時(shí)發(fā)送短信和郵件、定時(shí)統(tǒng)計(jì)博客訪客等,簡(jiǎn)單的定時(shí)任務(wù)可以直接通過Spring中的@Scheduled注解來實(shí)現(xiàn),需要的朋友可以參考下2024-01-01
詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決
這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
SpringBoot http post請(qǐng)求數(shù)據(jù)大小設(shè)置操作
這篇文章主要介紹了SpringBoot http post請(qǐng)求數(shù)據(jù)大小設(shè)置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫分離的示例
本文主要介紹了SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫分離的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié),非常不錯(cuò),具有參考價(jià)值,需要的朋友可以參考下2018-02-02
使用Spring Data Jpa的CriteriaQuery一個(gè)陷阱
使用Spring Data Jpa的CriteriaQuery進(jìn)行動(dòng)態(tài)條件查詢時(shí),可能會(huì)遇到一個(gè)陷阱,當(dāng)條件為空時(shí),查詢不到任何結(jié)果,并不是期望的返回所有結(jié)果。這是為什么呢?2020-11-11

