springcloud----负载均衡--Feign与OpenFeign

什么是 Feign

Feign是声明性Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并对其进行注释。它具有可插入注释支持,包括Feign注释JAX-RS注释。Feign还支持可插拔编码器解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web默认使用的注释。Spring Cloud集成了RibbonEureka以及Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端


GitHub地址: https://github.com/spring-cloud/spring-cloud-openfeign


Feign 能干什么

Feign 旨在使编写 Java HTTP 客户端变得更加容易。

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

Feign 集成了 Ribbon

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

Feign 与 OpenFeign 的区别

Feign

feign 是 spring cloud 组件中的一个轻量级 RESTful的HTTP 服务客户端 Reign 内置了 Ribbon, 用来做客户端服务在均衡,去调用服务注册中心的服务,Feign 的使用方式是:使用Feign 注解自定义接口,调用这个接口,就可以低哦啊用服务注册中心的服务。

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

OpenFeign

openfeign 是 spring cloudfeign 的基础上支持 spring mvc注解 ,如 @RequestMapping 等等,OpenFeign 的@FeignClient 可以解析Spring MVC 的 @RequestMapping注解下的接口,并通过动态代理的方式生产实现类 ,实现类中做负载均衡并且 低耦合调用其他服务。

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

使用

1、模块名 cloud-consumer-feign-order80
2、pml.xml (web、actuator以及其他的java自行导入)
<!--openfeign  也整合了ribbon-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3、yml 配置文件
server:
  port: 80
spring:
  application:
    name: cloud-order-consumer
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
4、主启动
@SpringBootApplication
@EnableFeignClients  // 开启使用Fegin
public class OrderFeignMain80 {
    public static void main(String[] args){
        SpringApplication.run(OrderFeignMain80.class,args) ;
    }
}

服务接口

@FeignClient(value = "CLOUD-PAYMENT-SERVICE")   // 微服务名
@Component
public interface PaymentFeignService {
    @GetMapping("/payment/get/{id}")
    CommonResult getPaymentById(@PathVariable("id") Long id) ;

    @GetMapping("/payment/feign/timeout")
    String paymentFeignTimeout();
}

本服务接口

@RestController
public class PaymentFeignController {
    @Autowired
    private PaymentFeignService paymentFeignService ;

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
        System.out.println("feign-------"+id);
        return paymentFeignService.getPaymentById(id) ;
    }

    @GetMapping("/consumer/payment/feign/timeout")
    public String paymentFeignTimeout(){
        return paymentFeignService.paymentFeignTimeout() ;
    }
}
5、测试

OpenFeign 的超时控制

在配置文件中进行配置

ribbon: 
  ReadTimeout: 5000
  ConnectTimeout: 5000

参数说明

ribbon.ReadTimeout: 指建立连接所用时间,适用于网络状况正常情况下,两端连接所有时间(毫秒)
ribbon.ConnectTimeout: 指建立连接后从服务器读到可用资源所用时间

OpenFeign 日志打印

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Fegin 中 HTTP 请求的细节。说白了就是对Feign 接口的调用情况进行监控和输出

日志级别

日志级别 内容
NONE 默认,不显示任何日志 ;
BASIC 仅记录请求方法、URL、响应状态码和执行时间
HEADERS BASIC + 请求头和响应头
FULL HEADERS+ 请求和响应的正文及元数据

1、yml配置

logging:
  level:
#    feign 日志以什么级别监控那个接口
    com.aqiang9.springcloud.service.PaymentFeignService: debug

2、配置类

@Configuration
public class FeignConfig {
    /**
     * 配置日志级别
     * @return
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
发布了131 篇原创文章 · 获赞 9 · 访问量 1万+
展开阅读全文

SpringCloud Feign配置负载均衡报错

03-24

使用Feign做负载均衡的时候,本来用的SpringBoot版本是1.5.3,没有问题。可是当我换成2.1.3,发现请求报错,错误提示: ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553424786_789616.png) 代码如下: POM.XML ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>feign</artifactId> <version>0.0.1-SNAPSHOT</version> <name>feign</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-javanica</artifactId> <version>1.5.12</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project> ``` FeignApplication ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553424989_413786.png) Service ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553425021_824461.png) application.yml ```yml eureka: client: serviceUrl: defaultZone: http://m103:8761/eureka/ server: port: 8901 spring: application: name: service-feign feign: httpclient: enabled: true hystrix: enabled: true management: endpoints: web: exposure: include: "*" exclude: env ``` 有没有人看一下问题出在哪里? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览