广告位联系
返回顶部
分享到

SpringCloud OpenFeign基本介绍与实现示例

java 来源:互联网 作者:佚名 发布时间:2023-02-23 21:19:27 人浏览
摘要

介绍 在上面一篇介绍Nacos的文章最后,两个服务的相互调用是用的RestTemplate类完成的。但这种方式不是很推荐,更佳的方式是用OpenFeign组件去调用。OpenFeign是官方推出的服务调用和负载

介绍

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

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

  引入依赖:

1

2

3

4

5

6

7

8

9

10

11

12

<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>

  服务方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@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();

    }

}

1

2

3

4

5

6

import lombok.Data;

@Data

public 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

  引入依赖:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<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>

  启动类上添加注解:

1

2

3

4

5

6

7

8

9

10

11

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修饰的接口:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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类(服务调用方再创建一个,不是同一个):

1

2

3

4

5

6

import lombok.Data;

@Data

public class Person {

    private Integer height;

    private String skin;

}

  编写控制器,使用接口请求提供方的服务:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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

  接口修改为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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指定的类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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("抛异常");来触发降级(抛出未捕获的异常也能触发)。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/gs2436/article/details/127938265
相关文章
  • idea配置检查XML中SQL语法及书写sql语句智能提示的

    idea配置检查XML中SQL语法及书写sql语句智能提示的
    idea怎么像Navicat一样写MySQL语句? 题主今天被告知一个问题,因为XML中的表别名改了,但是字段名还是用的原先的表别名,导致生产上查询报
  • SpringCloud OpenFeign基本介绍与实现示例
    介绍 在上面一篇介绍Nacos的文章最后,两个服务的相互调用是用的RestTemplate类完成的。但这种方式不是很推荐,更佳的方式是用OpenFeign组件
  • 微信公众号开发消息推送功能介绍

    微信公众号开发消息推送功能介绍
    微信公众号开发 运行效果 微信公众号简介 微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质
  • SpringBoot多controller添加URL前缀的实现方法

    SpringBoot多controller添加URL前缀的实现方法
    前言 在某些情况下,服务的controller中前缀是一致的,例如所有URL的前缀都为/context-path/api/v1,需要为某些URL添加统一的前缀。 能想到的处理
  • Java synchronized重量级锁实现过程浅析

    Java synchronized重量级锁实现过程浅析
    一、什么是重量级锁 当有大量的线程都在竞争同一把锁的时候,这个时候加的锁,就是重量级锁。 这个重量级锁其实指的就是JVM内部的Ob
  • Java synchronized轻量级锁实现过程浅析

    Java synchronized轻量级锁实现过程浅析
    一、什么是轻量级锁 轻量级锁是JDK 6之中加入的新型锁机制,它名字中的轻量级是相对于使用monitor的传统锁而言的。轻量级锁指的是存在多
  • Java两大工具库Commons和Guava使用介绍

    Java两大工具库Commons和Guava使用介绍
    除了操作集合、限流和缓存,Guava还有另一个隐秘的功能:事件总线EventBus机制是发布-订阅模式的实现,不需要显式地注册回调比观察者模式
  • Java中List集合数据修改方式

    Java中List集合数据修改方式
    Java中List集合数据修改 先说写这篇文章的原因 我被提供了一个需求,Excel表格数据导入数据库,按照常理而言是很简单的,但是这个需求不
  • Java实现解析.xlsb文件的教程

    Java实现解析.xlsb文件的教程
    Java解析.Xlsb文件 pom.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version3.17/version /dependency dependency groupI
  • Java实现国产加密算法SM4的介绍

    Java实现国产加密算法SM4的介绍
    国产SM4加密解密算法概念 SMS4算法是在国内广泛使用的WAPI无线网络标准中使用的加密算法,是一种32轮的迭代非平衡Feistel结构的分组加密算
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计