微服务精通之Feign原理解析

2022-11-09 09:53:28 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

前言

经过微服务精通之Ribbon原理解析的学习,我们了解到了服务消费者获取服务提供者实例的过程,都是通过RestTemplate来实现的,而且,都是模板化操作。那spring cloud是否有哪个组件可以通过注解或者配置的方式,来简化这个过程?答案是有的,就是Feign。


一、Feign是什么?

Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。

二、Feign原理解析

1.总体流程

2.Hystrix支持

Feign是自带Hystrix熔断器的,不过在D版本之后,熔断器默认是关闭的,需要通过如下配置进行开启。

代码语言:javascript复制
feign.hystrix.enabled=true

Feign启动熔断器后,可以在@FeignClient中指定熔断器类的方式,实现熔断器。每个接口的fallback方法为熔断器类中相同方法名的方法。

3.请求压缩

Feign支持通过配置的方式,开启请求和返回的GZIP压缩,减少请求的网络消耗。


三、Feign实战

1.Feign服务提供者

沿用微服务精通之Ribbon原理解析中的service-hi服务。

2.创建Feign消费者

(1)创建名为service-feign的maven工程

(2)引入Eureka-client和Feign依赖

代码语言:javascript复制
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hxq</groupId>
<artifactId>spring-cloud-hxq</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>service-feign</artifactId>
<name>service-feign</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
</dependencies>
</project>

(1)Eureka-client依赖:spring-cloud-starter-netflix-eureka-client; (2)Feign依赖:spring-cloud-starter-openfeign。

(3)创建启动类

代码语言:javascript复制
package com.hxq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/** * 服务消费者 * * @author Administrator * */
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceFeignApplication { 

public static void main(String[] args) { 

SpringApplication.run(ServiceFeignApplication.class, args);
}
}

(1)启动类要加上@EnableEurekaClient注解和@EnableDiscoveryClient注解,使程序注册到Eureka。 (2)启动类要加上@EnableFeignClients注解,是程序支持Feign操作。

(4)创建一个测试接口

代码语言:javascript复制
package com.hxq.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.hxq.service.HelloService;
@RestController
public class HelloController { 

@Resource
private HelloService helloService;
@RequestMapping("/hi")
public String hi(@RequestParam(value="name", defaultValue="hxq")String name) { 

return helloService.hiService(name);
}
}
代码语言:javascript复制
package com.hxq.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "service-hi", fallback = HelloServiceHystrix.class)
public interface HelloService { 

@RequestMapping("/hi")
String hiService(@RequestParam("name") String name);
}

(5)创建熔断器Fallback类

代码语言:javascript复制
package com.hxq.service.hystrix;
import org.springframework.stereotype.Component;
import com.hxq.service.HelloService;
@Component("helloServiceHystrix")
public class HelloServiceHystrix implements HelloService { 

@Override
public String hiService(String name) { 

return "hi,"   name   ",sorry,error!";
}
}

(6)创建application.yml配置文件

代码语言:javascript复制
server:
port: 9700
spring:
application:
name: service-feign
eureka:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
compression:
request:
enabled: true
response:
enabled: true

配置说明: server.port:Feign消费者服务端口 eureka.serviceUrl.defaultZone:Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka。如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。 spring.application.name:应用名称,将会显示在Eureka界面的应用名称列。 feign.hystrix.enabled:Hystrix开关。 feign.compression.request.enabled:请求GZIP压缩开关。 feign.compression.response.enabled:返回GZIP压缩开关。

3.服务验证

(1)启动service-hi服务

(2)启动service-feign服务

(3)调用测试接口

在浏览器中输入http://localhost:9700/hi,运行结果如下图,可以看到接口返回service-hi服务的数据。

四、微服务精通系列文章

  • 微服务精通之Eureka原理解析
  • 微服务精通之Ribbon原理解析
  • 微服务精通之Hystrix原理解析
  • 微服务精通之Feign原理解析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185986.html原文链接:https://javaforall.cn

0 人点赞