欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud OpenFeign基本介紹與實現(xiàn)示例

 更新時間:2023年02月21日 16:44:53   作者:尚少  
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡通信的細節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡通信細節(jié)。所有遠程調(diào)用,都像調(diào)用本地方法一樣完成

介紹

  在上面一篇介紹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: /nacosProvider

spring:
  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: /nacosInvoke

spring:
  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: 3000

hystrix:
    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中的使用教程

    這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot定時任務的實現(xiàn)詳解

    SpringBoot定時任務的實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot定時任務的實現(xiàn)詳解,定時任務是企業(yè)級開發(fā)中最常見的功能之一,如定時統(tǒng)計訂單數(shù)、數(shù)據(jù)庫備份、定時發(fā)送短信和郵件、定時統(tǒng)計博客訪客等,簡單的定時任務可以直接通過Spring中的@Scheduled注解來實現(xiàn),需要的朋友可以參考下
    2024-01-01
  • Spring@Value屬性注入使用方法解析

    Spring@Value屬性注入使用方法解析

    這篇文章主要介紹了Spring@Value屬性注入使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決

    詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決

    這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java如何使用正則表達式查找指定字符串

    Java如何使用正則表達式查找指定字符串

    在軟件開發(fā)中正則表達式是個很有用的功能,使用正則表達式可以簡化代碼,省去不少時間,下面這篇文章主要給大家介紹了關(guān)于Java如何使用正則表達式查找指定字符串的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • SpringBoot http post請求數(shù)據(jù)大小設置操作

    SpringBoot http post請求數(shù)據(jù)大小設置操作

    這篇文章主要介紹了SpringBoot http post請求數(shù)據(jù)大小設置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例

    SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例

    本文主要介紹了SpringBoot整合sharding-jdbc實現(xiàn)分庫分表與讀寫分離的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Spring 加載多個xml配置文件的原理分析

    Spring 加載多個xml配置文件的原理分析

    我們知道Spring一次可以加載多個Bean定義的Xml配置文件,我們可以設想下如果讓我們來做我們會怎么做?我估計會根據(jù)配置文件的順序依次讀取并加載,那再來看看Spring是如何做的?
    2021-06-06
  • IntelliJ IDEA 使用經(jīng)驗總結(jié)(推薦)

    IntelliJ IDEA 使用經(jīng)驗總結(jié)(推薦)

    這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗總結(jié),非常不錯,具有參考價值,需要的朋友可以參考下
    2018-02-02
  • 使用Spring Data Jpa的CriteriaQuery一個陷阱

    使用Spring Data Jpa的CriteriaQuery一個陷阱

    使用Spring Data Jpa的CriteriaQuery進行動態(tài)條件查詢時,可能會遇到一個陷阱,當條件為空時,查詢不到任何結(jié)果,并不是期望的返回所有結(jié)果。這是為什么呢?
    2020-11-11

最新評論