SpringCloud - Spring Cloud Netflix 之 Feign;Spring Cloud 之 OpenFeign声明式服务调用组件(六)

阅读本文前可先参考

SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客

一、Feign 与 OpenFeign

1、Feign

Feign 是 Netflix 公司开发的一个声明式的 REST 调用客户端,是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。

调用远程的restful风格的http接口 的组件,如:

1、Httpclient(apache)

2、Httpurlconnection (jdk)

3、restTemplate(spring)

4、OkHttp(android)

5、Feign (Netflix)

Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign。

Feign 支持多种注解,但 Feign 本身并不支持 Spring MVC 注解,2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。

2、OpenFeign

OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。

OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。

3、Feign与OpenFeign的区别

Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。

Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。

Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。

1、Feign

Feign是Netflix公司开发的,是 Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务

Feign的依赖

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-feign</artifactId>
 </dependency>

2、OpenFeign

OpenFeign 是 Spring 官方推出的,是SpringCloud自己研发的。是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中

OpenFeign的依赖

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>  

注:

springcloud F 及F版本以上 springboot 2.0 以上基本上使用openfeign,openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用openfeign ,2018年以前的项目在使用feign

使用OpenFeign实现服务消费者调用服务

1、新建一个springboot Module(springcloud-2-service-common),继承自统一的父项目,存放通用的接口层、常量类、model

2、在 springcloud-2-service-common 中 添加 openfeign 依赖 spring-cloud-starter-openfeign

<!--继承统一的父项目-->
    <parent>
        <groupId>com.company</groupId>
        <artifactId>springcloud-demo</artifactId>
        <version>1.0.0</version>
<!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    </parent>

    <groupId>com.company</groupId>
    <artifactId>springcloud-2-service-common</artifactId>
    <version>1.0.0</version>

    <name>springcloud-2-service-common</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- spring-cloud-starter-openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

 3、在 服务消费者 application.properties配置文件中指定服务注册中心、端口号等信息

server.port=8081

#设置应用名称,对应Eureka控制台下 DS Replicas 的 Application
spring.application.name=springcloud-5-service-eureka-openfeign-consumer

#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然“存活”
eureka.instance.lease-renewal-interval-in-seconds=30
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=60
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false

#注册服务实例ID,,服务ID必须唯一
eureka.instance.instance-id=springcloud-5-service-eureka-openfeign-consumer
#注册中心的链接地址  http://localhost:8761/eureka
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka

在 服务提供者 springcloud-5-service-eureka-openfeign-provider application.properties配置文件中指定服务注册中心、端口号等信息 

server.port=9001

#设置应用名称,对应Eureka控制台下 DS Replicas 的 Application(集群部署服务提供者,Application一致,对应多个eureka.instance.instance-id)
spring.application.name=springcloud-5-service-eureka-openfeign-provider

#设置mysql数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin123456

#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然“存活”
eureka.instance.lease-renewal-interval-in-seconds=5
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=10
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false

#注册服务实例ID,,服务ID必须唯一
eureka.instance.instance-id=springcloud-5-service-eureka-openfeign-provider
#注册中心的链接地址  http://localhost:8761/eureka
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka

4、在 springcloud-2-service-common 中定义一个远程服务提供者接口ProviderGoodsRemoteClient

通过@FeignClient 注解来指定服务名称,进而绑定服务,然后再通过 SpringMVC 中提供的注解来绑定服务提供者提供的接口

@Component
@FeignClient("springcloud-5-service-eureka-openfeign-provider")
public interface ProviderGoodsRemoteClient {

    /**
     * 声明一个feign的接口,它的实现是服务提供者的controller实现
     */
    @GetMapping(value = "/eureka/openfeign/service/goodList")
    public List<Goods> goods();
}

 服务提供者 springcloud-5-service-eureka-openfeign-provider

@RestController
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    @GetMapping(value = "/eureka/openfeign/service/goodList")
    public List<Goods> goodList(){

        List<Goods> goodsList = goodsService.getAllGoods();

        System.out.println("查询商品列表成功:");
        for (Goods good:goodsList) {
            System.out.println("查询商品:"+ good);
        }
        return goodsList;
    }
}

 5、在服务消费者项目(springcloud-5-service-eureka-openfeign-consumer)springboot启动类添加 @EnableFeignClients 注解表示开启 Spring Cloud openFeign的支持功能

@EnableFeignClients  //表示开启 Spring Cloud OpenFeign的支持功能
@EnableEurekaClient  //开启 Eureka client服务
@SpringBootApplication
public class EurekaOpenFeign5ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaOpenFeign5ConsumerApplication.class, args);
    }

}

6、服务消费者springcloud-5-service-eureka-openfeign-consumer使用 Controller 调用服务

@RestController
public class GoodsController {

    @Autowired
    private ProviderGoodsRemoteClient providerGoodsRemoteClient;

    @GetMapping(value = "/springcloud/eureka/openfeign/goodList")
    public @ResponseBody Object getGoodList(){
        // 调用远程的一个controller, restful的调用,通过openfeign这种声明式的远程调用,providerGoodsRemoteClient就像dubbo里面的接口层一样
        return  providerGoodsRemoteClient.goods();
    }
}

7、启动服务测试;启动 eureka(springcloud-3-service-eureka),服务提供者springcloud-5-service-eureka-openfeign-provider,服务消费者springcloud-5-service-eureka-openfeign-consumer

浏览器输入:http://localhost:8081/springcloud/eureka/openfeign/goodList

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值