SpringCloud OpenFeign基本介紹與實現(xiàn)示例
介紹
在上面一篇介紹Nacos的文章最后,兩個服務的相互調(diào)用是用的RestTemplate類完成的。但這種方式不是很推薦,更佳的方式是用OpenFeign組件去調(diào)用。OpenFeign是官方推出的服務調(diào)用和負載均衡組件,基于Ribbon和Hystrix,前身是第一代Spring Cloud的Feign,對Feign進行了擴展,支持了SpringMvc的相關(guān)注解。
常用注解
OpenFeign是使用接口+注解實現(xiàn)的,因此了解它的常用注解是必要的,有以下幾個:
@EnableFeignClients:在啟動類上添加,用于開啟OpenFeign功能。當項目啟動時,會掃描帶有@FeignClient的接口,生成代理類并注冊到Spring容器中
@FeignClient:通知OpenFeign組件對該注解下的接口進行解析,通過動態(tài)代理的方式產(chǎn)生實現(xiàn)類,完成服務調(diào)用
@RequestMapping:SpringMvc中的注解,不過此時該注解表示發(fā)起Request請求(默認Get方式)
@GetMapping:SpringMvc中的注解,不過此時該注解表示發(fā)起Get請求
@PostMapping:SpringMvc中的注解,不過此時該注解表示發(fā)起Post請求
代碼實現(xiàn)
首先得把Nacos啟動
服務提供方,
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>
服務方法:
@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; }
服務調(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>
啟動類上添加注解:
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值是服務提供方的服務名稱 */ @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類(服務調(diào)用方再創(chuàng)建一個,不是同一個):
import lombok.Data; @Data public class Person { private Integer height; private String skin; }
編寫控制器,使用接口請求提供方的服務:
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); } }
注意事項
OpenFeign是基于Ribbon的,所以它默認是負載均衡的。其次,它也是基于Hystrix的,有超時降級的處理:默認服務提供方的接口超時時間是1s,超過1s服務調(diào)用方會報錯。1s是可以配置的,按照業(yè)務需要調(diào)整。@FeignClient注解有個fallback屬性,當該屬性有值時,服務提供方超時,會返回程序所指定的降級值。
服務調(diào)用方,bootstrap.yml添加(更規(guī)范的做法是引入spring-cloud-starter-alibaba-nacos-config依賴,nacos中新建配置,然后在這個配置中添加):
feign:
hystrix:
enabled: true
ribbon:
# 請求連接的超時時間
ConnectionTimeout: 3000
# 請求處理的超時時間
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 "超時3s"; } @Override public String distribute1(String name, Integer age) { return "超時3s"; } @Override public String distribute2(Person p) { return "超時3s"; } }
服務提供方ProviderController類的方法中,加入Thread.sleep(4000);或者throw new RuntimeException("拋異常");來觸發(fā)降級(拋出未捕獲的異常也能觸發(fā))。
到此這篇關(guān)于SpringCloud OpenFeign基本介紹與實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringCloud OpenFeign內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
websocket在springboot+vue中的使用教程
這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決
這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01SpringBoot http post請求數(shù)據(jù)大小設置操作
這篇文章主要介紹了SpringBoot http post請求數(shù)據(jù)大小設置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例
本文主要介紹了SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11IntelliJ IDEA 使用經(jīng)驗總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗總結(jié),非常不錯,具有參考價值,需要的朋友可以參考下2018-02-02使用Spring Data Jpa的CriteriaQuery一個陷阱
使用Spring Data Jpa的CriteriaQuery進行動態(tài)條件查詢時,可能會遇到一個陷阱,當條件為空時,查詢不到任何結(jié)果,并不是期望的返回所有結(jié)果。這是為什么呢?2020-11-11