微服务-OpenFeign基本使用

一、前言

二、OpenFeign基本使用

1、OpenFeign简介

OpenFeign是一种声明式、模板化的HTTP客户端,它使得调用RESTful网络服务变得简单。在Spring Cloud中使用OpenFeign,可以做到像调用本地方法一样使用HTTP请求访问远程服务,开发者无需关注远程HTTP请求的细节。

OpenFeign的Spring应用架构一般分为三部分,分别是注册中心、服务提供者和服务消费者。服务提供者向服务注册中心注册自己,然后服务消费者通过OpenFeign发送请求时,OpenFeign会向服务注册中心获取关于服务提供者的信息,然后再向服务提供者发送网络请求。

使用OpenFeign,只需要创建一个接口并添加注解,就可以实现远程服务调用。它简化了RestTemplate的代码,实现了Ribbon的负载均衡,使代码变得更加简洁。OpenFeign支持Spring MVC的注解,如@RequestMapping、@PathVariable等,这使得它在与Spring Cloud集成时更加方便。

2、Feign和OpenFeign

Feign和OpenFeign的区别在于,Feign是Spring Cloud的一部分,而OpenFeign是对Feign的封装,提供了更多的功能和更好的集成。OpenFeign不仅支持Spring MVC的注解,还支持JAX-RS注解和JPA注解等。此外,OpenFeign还支持自定义注解和编码器,使得它能够更好地满足不同的需求。

OpenFeign 组件的前身是 Netflix Feign 项目,它最早是作为 Netflix OSS 项目的一部分,由 Netflix 公司开发。后来 Feign 项目被贡献给了开源组织,于是才有了我们今天使用的 Spring Cloud OpenFeign 组件。

Feign 和 OpenFeign 有很多大同小异之处,不同的是 OpenFeign 支持 MVC 注解。

可以认为 OpenFeign 为 Feign 的增强版。

简单总结下 OpenFeign 能用来做什么:

OpenFeign 是声明式的 HTTP 客户端,让远程调用更简单。

提供了HTTP请求的模板,编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息

整合了Ribbon(负载均衡组件)和 Hystix(服务熔断组件),不需要显示使用这两个组件

Spring Cloud Feign 在 Netflix Feign的基础上扩展了对SpringMVC注解的支持

3、OpenFegin通讯优化

3.1、GZIP简介

(1)gzip介绍:gzip是一种数据格式,采用用deflate算法压缩数据;gzip是一种流行的数据压缩算法,应用十分广泛,尤其是在Linux平台。

(2)gzip能力:当Gzip压缩到一个纯文本数据时,效果是非常明显的,大约可以减少70%以上的数据大小。

(3)gzip作用:网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取gzip文件来比普通手工抓取更快地检索网页。

3.2、HTTP协议中关于压缩传输的规定(原理)

第一:客户端向服务器请求头中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip或者deflate),如果不发送该消息头,服务器是不会压缩的。

第二:服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的。

第三:客户端接收到响应之后,先判断是否有Content-Encoding消息头,如果有,按该格式解压报文。否则按正常报文处理。

3.3、在OpenFeign技术中应用GZIP压缩

在Spring Cloud微服务体系中,一次请求的完整流程如下:

在整体流程中,如果使用GZIP压缩来传输数据,涉及到两次请求-应答。而这两次请求-应答的连接点是Application Client,那么我们需要在Application Client中配置开启GZIP压缩,来实现压缩数据传输。

3.4、只配置OpenFeign请求-应答的GZIP压缩

在交互数据量级不够的时候,看不到压缩内容。

这里只开启Feign请求-应答过程中的GZIP,也就是浏览器-Application Client之间的请求应答不开启GZIP压缩。

在全局配置文件中,使用下述配置来实现OpenFeign请求-应答的GZIP压缩

4、OpenFegin示例

模块说明:

user模块调用product模块的接口

4.1、依赖准备

xml 复制代码
<!--nacos-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--openfegin-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

4.2、启动类添加EnableFeginClients

启动类上添加@EnableFeignClients注解,才能把使用@FeginClient标记的类识别的fegin接口。

java 复制代码
@EnableSwagger2
@SpringBootApplication
@EnableDiscoveryClient
@Slf4j
@EnableFeignClients
public class UserApplication {
    public static void main(String[] args) throws UnknownHostException {
        ConfigurableApplicationContext application = SpringApplication.run(UserApplication.class, args);

        Environment env = application.getEnvironment();
        String ip = InetAddress.getLocalHost().getHostAddress();
        String port = env.getProperty("server.port");
        String path = env.getProperty("server.servlet.context-path");
        // 未配置默认空白
        if (path == null) {
            path = "";
        }
        // 未配置默认空白
        if (port == null) {
            port = "8080";
        }
        log.info("\n----------------------------------------------------------\n\t" +
                "项目启动成功,访问路径如下:\n\t" +
                "本地路径: http://localhost:" + port + path + "/\n\t" +
                "网络地址: http://" + ip + ":" + port + path + "/\n\t" +
                "接口地址: http://" + ip + ":" + port + path + "/swagger-ui.html\n\t"  +
                "API文档: http://" + ip + ":" + port + path + "/doc.html\n" +
                "----------------------------------------------------------");
    }
}

4.3、编写fegin接口

注意:@FeignClient中的value传入的是product模块在nacos上注册的服务名称。

java 复制代码
@FeignClient(value = "product-demo",path = "")
@Service
public interface ProductService {
    @RequestMapping(value = "/test/hello",method = RequestMethod.GET)
    String hello();
}

4.4、调用fegin接口

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private ProductService productService;

    @GetMapping("/test")
    public String test(){
        return productService.hello();
    }
}

三、总结

使用OpenFeign可以让你更轻松地编写HTTP客户端代码,并且无需手动处理底层的HTTP请求和响应。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

相关推荐
mghio8 小时前
Dubbo 中的集群容错
java·微服务·dubbo
uhakadotcom10 小时前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
沉登c13 小时前
第 3 章 事务处理
架构
阿里云云原生13 小时前
LLM 不断提升智能下限,MCP 不断提升创意上限
云原生
阿里云云原生13 小时前
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
云原生
数据智能老司机16 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机16 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
云上艺旅16 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
c无序16 小时前
【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
docker·容器·架构
数据智能老司机17 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构