<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在上面一篇介紹Nacos的文章最後,兩個服務的相互呼叫是用的RestTemplate類完成的。但這種方式不是很推薦,更佳的方式是用OpenFeign元件去呼叫。OpenFeign是官方推出的服務呼叫和負載均衡元件,基於Ribbon和Hystrix,前身是第一代Spring Cloud的Feign,對Feign進行了擴充套件,支援了SpringMvc的相關注解。
OpenFeign是使用介面+註解實現的,因此瞭解它的常用註解是必要的,有以下幾個:
@EnableFeignClients:在啟動類上新增,用於開啟OpenFeign功能。當專案啟動時,會掃描帶有@FeignClient的介面,生成代理類並註冊到Spring容器中
@FeignClient:通知OpenFeign元件對該註解下的介面進行解析,通過動態代理的方式產生實現類,完成服務呼叫
@RequestMapping:SpringMvc中的註解,不過此時該註解表示發起Request請求(預設Get方式)
@GetMapping:SpringMvc中的註解,不過此時該註解表示發起Get請求
@PostMapping:SpringMvc中的註解,不過此時該註解表示發起Post請求
首先得把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; }
服務呼叫方,
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); } }
建立@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類(服務呼叫方再建立一個,不是同一個):
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服務呼叫方會報錯。1s是可以設定的,按照業務需要調整。@FeignClient註解有個fallback屬性,當該屬性有值時,服務提供方超時,會返回程式所指定的降級值。
服務呼叫方,bootstrap.yml新增(更規範的做法是引入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("拋異常");來觸發降級(丟擲未捕獲的異常也能觸發)。
到此這篇關於SpringCloud OpenFeign基本介紹與實現範例的文章就介紹到這了,更多相關SpringCloud OpenFeign內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45