【SpringCloudNetflix-OpenFeign客户端负载均衡】


前言

接着上章【SpringCloudNetflix-Ribbon客户端负载均衡】,继续学习OpenFeign客户端负载均衡


一、什么是Feign?

Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。同时Feign整合了Hystrix,可以很容易的实现服务熔断和降级(关于Hystrix我们后面再讲)

二、为什么要使用Feign?

在前一章节,我们使用Ribbon作为客户端负载均衡完成了订单服务和用户服务的通信,其实我们可以发现,当我们通过RestTemplate调用其它服务时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻。而Feign的服务调用方式对于程序员来说更为友好,它基于Ribbon进行了封装,把一些负责的url和参数处理细节屏蔽起来,我们只需要简单编写Fiegn的客户端接口就可以像调用本地service去调用远程微服务。

三、代码实战

在这里插入图片描述
为了不和前面的案例混淆代码,我们搭建新工程“支付服务”来演示Feign。那在这里支付服务和订单服务充当的角色一样,都是服务消费者,通过调用用户服务来获取数据。

那么支付服务需要做什么事情?

  • 1.搭建基础项目结构,
  • 2.注册到Eureka,
  • 3.集成Feign向用户服务发起调用。

1.创建工程

创建新的工程模块 springcloud-pay-server,端口号为1040,用来集成Feign

2 .导入依赖

导入Feign,Eureka Client和web的依赖包,同时依赖user-common模块 ,具体的 pom.xml如下:

 <!--1.导入EurekaClient的包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
		 <!--2.导入Feign的包-->
         <dependency>
		  	<groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
        <!--web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--user-common-->
        <dependency>
            <groupId>cn.itsource.springboot</groupId>
            <artifactId>springcloud-user-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

3. 启动类配置如下

代码如下(示例):

@SpringBootApplication
// 开启feign的客户端
// 该注解会去扫描当前包及其自包中,有注解@FeignClient的接口,并为其创建代理对象,交给spring去管理
// Feign会为每个方法生成一个RequestTemplate同时封装好http信息,如:url,请求参数等等
// 当有请求来的时候,RequestTemplate生成request请求,交给Http客户端(UrlConnection ,HttpClient,OkHttp)。
// 然后Http客户端会交给LoadBalancerClient,使用Ribbon的负载均衡发起调用。
@EnableFeignClients
public class PayApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(PayApplication.class, args);
    }
}

4.yml配置如下:

server:
  port: 1040
eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:1010/eureka/,http://peer2:1011/eureka/,http://peer3:1012/eureka/
  instance:
    instance-id: pay-server:1040 #实例ID
    prefer-ip-address: true #使用ip注册到注册中心
spring:
  application:
    name: pay-server

5.编写Feign的客户端接口

// @FeignClient("user-server") : user-server是用户服务的服务名字,Feign根据服务名能够在注册中心找到目标服务的通信地址
@FeignClient("user-service")
public interface UserFeignClient {
    @GetMapping("/user/{id}")
    User getUserById(@PathVariable("id") Long id);  // 直接复制user服务controller方法
}

Feign可以根据@FeignClient(“user-server”)找到用户服务,根据方法上的 @RequestMapping(value = “/user/{id}”,method = RequestMethod.GET)找到目标服务的controller的方法 ,我们在使用Feign接口时传入的参数就会作为目标服务controller方法的参数,而返回值就是目标服务controller方法的返回值。

注意:服务名要一致 , url路径要一致 , 参数要一致 , 返回值类型要一致。

5.编写Controller使用Feign接口

@RestController
public class PayController {
    @Autowired
    private UserFeignClient userFeignClient;
    @GetMapping("/pay/{id}")
    public User gebUserById(@PathVariable("id") Long id) {
        //使用Feign调用用户服务获取User
        return userFeignClient.getUserById(id);
    }
}

这里调用UserFeignClient.getById方法,看起来是像在调用本地方法,其实该接口已经被Feign代理,我们发起调用时其实在像Feign接口配置的目标服务发起调用。

5.Feign的工作原理的理解

要使用Feign,我们除了导入依赖之外,需要在启动类通过@EnableFeignClients(value=“”)注解开启Feign,也可以通过value属性指定了Feign的扫描包。同时我们需要为Feign编写客户端接口,接口上需要注解@FeignClient标签。 当程序启动,注解@EnableFeignClients会去扫描当前包及其子包下的打的注解@FeignClient的接口,然后交给Spring管理。

当请求发起,会使用jdk的动态代理方式代理接口,生成相应的RequestTemplate,Feign会为每个方法生成一个RequestTemplate同时封装好http信息,如:url,请求参数等等

最终RequestTemplate生成request请求,交给Http客户端(UrlConnection ,HttpClient,OkHttp)。然后Http客户端会交给LoadBalancerClient,使用Ribbon的负载均衡发起调用。

6.Feign的参数配置

6.1负载均衡配置

Feign已经集成了Ribbon,所以它的负载均衡配置基于Ribbon配置即可,这里使用xml简单配置负载均衡策略如下:

user-server:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

6.2 Feign的超时配置

如果在服务调用时出现了 “feign.RetryableException : Read timed out…”错误日志,说明Ribbon处理超时 ,我们可以配置Ribbon的超时时间:

ribbon:
	ConnectTimeout: 3000
    ReadTimeout: 6000

如果服务调用出现“com.netflix.hystrix.exception.HystrixRuntimeException:… timed - out and no fallback available” 错误日志,是因为Hystrix超时,默认Feign集成了Hystrix,但是高版本是关闭了Hystrix,我们可以配置Hystrix超时时间:

feign:
   hystrix:
       enabled: true #开启熔断支持
hystrix:
  command:
      default:
        execution:
          isolation:
            thread:
              timeoutInMilliseconds: 6000   #hystrix超时时间

7.Feign开启日志调试

7.1 配置Feign日志打印内容

有的时候我们需要看到Feign的调用过程中的参数及相应,我们可以对Feign的日志进行配置,Feign支持如下几种日志模式来决定日志记录内容多少:

  • NONE,不记录(DEFAULT)。
  • BASIC,仅记录请求方法和URL以及响应状态代码和执行时间。
  • HEADERS,记录基本信息以及请求和响应标头。
  • FULL,记录请求和响应的标题,正文和元数据。

创建Feign配置类

@Configuration
public class FeignConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;	//打印Feign的所有日志
    }
}

7.2 配置日志打印级别

配置UserFeignClient的日志打印级别,上面的配置打印Feign的那些内容,下面这个是配置日志框架打印日志的级别,不修改可能打印不出来日志,DEBUG打印日志调试信息。

8.Feign开启GZIP

可以通过开启Feign的数据压缩传输来节省网络开销,但是压缩数据会增加CPU的开销,所以太小的数据没必要压缩,可以通过压缩大小阈值来控制,配置如下:

feign:
  compression:
    request:
      enabled: true
      min-request-size: 1024 #最小阈值,小于这个不压缩
      mime-types: text/xml,application/xml,application/json #压缩哪些类型的数据
    response:
      enabled: true

总结

对OpenFeign客户端负载均衡的基础知识学习和掌握基本使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值