文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloud OpenFeign如何实现

2023-07-05 04:39

关注

这篇文章主要介绍“SpringCloud OpenFeign如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud OpenFeign如何实现”文章能帮助大家解决问题。

常用注解

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: /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;@Datapublic class Person {    private Integer height;    private String skin;}

服务调用方,

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@SpringBootApplicationpublic 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;@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;@Datapublic 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: 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;@Componentpublic 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如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯