微服务-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请求和响应。

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

相关推荐
小安运维日记3 分钟前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
politeboy1 小时前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197382 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
问道飞鱼11 小时前
【微服务知识】开源RPC框架Dubbo入门介绍
微服务·rpc·开源·dubbo
白总Server12 小时前
JVM解说
网络·jvm·物联网·安全·web安全·架构·数据库架构
ggaofeng12 小时前
通过命令学习k8s
云原生·容器·kubernetes
CodingBrother12 小时前
软考之面向服务架构SOA
微服务·架构
qq_道可道15 小时前
K8S升级到1.24后,切换运行时导致 dind 构建镜像慢根因定位与解决
云原生·容器·kubernetes
郝同学的测开笔记18 小时前
云原生探索系列(十二):Go 语言接口详解
后端·云原生·go
mit6.82419 小时前
[Docker#5] 镜像仓库 | 命令 | 实验:搭建Nginx | 创建私有仓库
linux·后端·docker·云原生