03.Spring Cloud 之 Feign

标签: Spring Cloud

1. 概述

1.1 Feign 是什么
  • Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写 Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持 JAX-RS 标准的注解。Feign 也支持可插拔式的编码器和解码器。SpringCloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。
1.2 Feign 能干什么
  • Feign 旨在使编写 Java Http 客户端变得更容易

  • 前面在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign 在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是 Dao 接口上面标注 Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解即可),即可完成对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。

3. Feign 集成了 Ribbon
  • 利用 Ribbon 维护了 microservicecloud-Dept 的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与 Ribbon 不同的是,通过 feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

2. Feign 使用

  • 项目已上传至 https://github.com/masteryourself/study-spring-cloud.git
2.1 配置文件
1. pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- eureka 已经集成了 ribbon,这里不需要再单独引入-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. application.properties
# 此实例注册到eureka服务端的 name
spring.application.name=masteryourself-user
# 端口号
server.port=5001

# 与 eureka server 交互的地址
eureka.client.service-url.defaultZone=http://masteryourself-eureka-7001.com:7001/eureka
# 此实例注册到 eureka 服务端的唯一的实例 ID
eureka.instance.instance-id=masteryourself-user-5001
# 是否显示 IP 地址
eureka.instance.prefer-ip-address=true
# eureka 客户需要多长时间发送心跳给 eureka 服务器,表明它仍然活着,默认为 30 秒
eureka.instance.lease-renewal-interval-in-seconds=10
# eureka 服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为 90 秒
eureka.instance.lease-expiration-duration-in-seconds=30

# 请求连接的超时时间,默认的时间为 1000 ms
ribbon.ConnectTimeout=3000
# 请求处理的超时时间
ribbon.ReadTimeout=3000
2.2 代码
1. OrderService
@FeignClient(value = "MASTERYOURSELF-ORDER")
public interface OrderService {

    @RequestMapping(value = "doOrder")
    Map<String, String> doOrder();

}
2. WalletService
@FeignClient("MASTERYOURSELF-WALLET")
public interface WalletService {

    @RequestMapping(value = "doDeduct")
    Map<String, String> doDeduct();

}
3. UserControllerWithFeign
@RestController
public class UserControllerWithFeign {

    @Autowired
    private OrderService orderService;

    @Autowired
    private WalletService walletService;

    @RequestMapping(value = "buyByFeign")
    public Map buyByFeign() {
        Map orderMap = orderService.doOrder();
        Map deductMap = walletService.doDeduct();
        Map<Object, Object> result = new HashMap<>(10);
        result.put("order-msg", orderMap);
        result.put("deduct-msg", deductMap);
        return result;
    }

}
4. UserApplication5001
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserApplication5001 {

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

}
2.3 效果展示
  • 多次请求 http://192.168.20.1:5001/buyByFeign ,可以看到每次的返回值都是不同的服务器返回,同 Ribbon

3. Feign 使用自定义负载均衡

  • 项目已上传至 https://github.com/masteryourself/study-spring-cloud.git
3.1 代码
1. CustomRule
public class CustomRule extends AbstractLoadBalancerRule {

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        System.out.println("自定义生效了");
        return lb.getAllServers().get(0);
    }

    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

}
2. OrderRuleConfig
  • 注意:此类不能被 Spring 的 ComponentScan 扫描到,否则会被当成全局的负载均衡策略使用
@Configuration
public class OrderRuleConfig {

    @Bean
    public IRule rule() {
        return new RandomRule();
    }

}
3. WalletRuleConfig
  • 注意:此类不能被 Spring 的 ComponentScan 扫描到,否则会被当成全局的负载均衡策略使用
@Configuration
public class WalletRuleConfig {

    @Bean
    public IRule rule() {
        return new CustomRule();
    }

}
4. UserApplication5001
  • 每个微服务可以使用自己的负载均衡策略
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RibbonClients({
        @RibbonClient(name = "MASTERYOURSELF-ORDER", configuration = OrderRuleConfig.class),
        @RibbonClient(name = "MASTERYOURSELF-WALLET", configuration = WalletRuleConfig.class)
})
public class UserApplication5001 {

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

}
3.2 效果展示
  • 多次请求 http://192.168.20.1:5001/buyByFeign,wallet 微服务的结果总是返回第一台,而 order 微服务的结果是随机的

在这里插入图片描述
在这里插入图片描述

版权声明:本文为masteryourself原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/masteryourself/article/details/103101762

智能推荐

Spring Cloud Feign

通过启动类中增加@EnableFeignClients注解引入Feign 在EnableFeignClients中通过导入FeignClientsRegistrar创建Feign代理 FeignClientsRegistrar 继承自ImportBeanDefinitionRegistrar,在Spring启动时会调用registerBeanDefinitions方法,在registerBeanD...

Spring Cloud Feign使用

###背景 Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们...

spring cloud feign - RPC

相关文章: Spring cloud - 概述 Spring cloud eureka - 注册中心 Spring cloud feign - RPC Spring cloud ribbon - 负载均衡 Spring cloud hystrix - 断路器 Spring cloud hystrix dashboard - 断路器dashboard Spring cloud zuul- 网关 1....

Spring Cloud Feign组件

Feign简介 Feign是一个声明式的Web服务客户端,使得它写Web服务变得简单。使用Feign,只需要创建一个接口并注解,它具有可插拔的注解特性。Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon与Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。下面我们来看一下如何使用。 前期准备...

【Spring Cloud】Feign

【Spring Cloud】Feign 1. Feign简介 2. 基本使用 2.1 导入依赖 2.2 开启Feign功能 2.3 Feign的客户端 3. 负载均衡 4. Hystrix支持 5. 请求压缩 6. 日志级别 1. Feign简介 Feign(伪装),为什么叫伪装? Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接ur...

猜你喜欢

Android 炫酷的横向和环形进度条的实例

一、概述 最近需要用进度条,秉着不重复造轮子的原则,上github上搜索了一番,看了几个觉得比较好看的ProgressBar,比如:daimajia的等。简单看了下代码,基本都是继承自View,彻彻底底的自定义了一个进度条。盯着那绚丽滚动条,忽然觉得,为什么要通过View去写一个滚动条,系统已经提供了ProgressBar以及属于它的特性,我们没必要重新去构建一个,但是系统的又比较丑,不同版本变现...

pcap包结构&SNI字段的解析

    pcap文件格式是常用的数据报存储格式,包括wireshark在内的主流抓包软件都可以生成这种格式的数据包。     文件格式:     Pcap文件头(24字节)+数据包头(wireshark增加的)+数据包(网络中抓取的)+…… 1.pcap文件头结构 各字段说明: Magic:4B:0×...

MC9S12XEP100的IIC模块(IICV3)

最近在写DS3231时钟芯片的驱动,这个芯片使用IIC进行通讯,以前没有用过IIC模块,照着教材和示例程序写程序后发现各种问题。没办法,还是官方数据手册靠谱,遂把相应部分又翻译了一遍。果然发现示例程序纯粹就是个玩具,一点用都没有。。。 第15章 集成电路总线(IICV3) 译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为 MC9S12XEP1...

Eureka服务注册与发现

文章目录 二、SpringCLoud中遇到的技术 (一)、Eureka 1、功能: 2、什么是服务治理. 3、什么是服务注册与发现 4、Eureka包含两个组件: Eureka Server和Eureka Client 5、单机Eureka构建步骤 5.1 建model:cloud-eureka-server7001 5.2 写pom 5.3 写yml 5.4 主启动类 5.5 测试 5.6 将消...

Hard Problem【HDU-3551】【一般图最大匹配 带花树】

题目链接   题意:有N个点,M条边,给出每个点的度限制,问能不能用M条边中的几条达成这个目的?   很明显的就是一个建图的问题,很明显的,少于等于度为1的,是可以直接连的,不用限制增广,而大于度为1的,需要限制增广,就可以用这样的限流的方法:  ...