微服务精通之Feign原理解析[通俗易懂]

微服务精通之Feign原理解析[通俗易懂]前言       经过微服务精通之Ribbon原理解析的学习,我们了解到了服务消费者获取服务提供者实例的过程,都是通过RestTemplate来实现的,而且,都是模板化操作。那springcloud是否有哪个组件可以通过注解或者配置的方式,来简化这个过程?答案是有的,就是Feign。一、Feign是什么?       Feign是一个声明式的伪HTTP客户端,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

前言

       经过微服务精通之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版本之后,熔断器默认是关闭的,需要通过如下配置进行开启。

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依赖

<?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)创建启动类

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)创建一个测试接口

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);
    }
}

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类

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配置文件

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服务的数据。
在这里插入图片描述

四、微服务精通系列文章

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Windows 打开和关闭默认共享方法汇总

    [原文]在使用xcopy上传文件至远程windows服务器时,出现“Invaliddriverspecification”(无效驱动器规格),经过各种排查,最终发现是服务器“关闭默认共享”导致的。Windows启动时都会默认打开admin$ipc$和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢。经过自己的验证,汇总出一下方法。一:查看window共享资源运行–>cmd–>输入netshare二:彻底关闭

  • 聊聊LuaJIT「建议收藏」

    聊聊LuaJIT「建议收藏」JIT什么是JITJIT=JustInTime即时编译,是动态编译的一种形式,是一种优化虚拟机运行的技术。程序运行通常有两种方式,一种是静态编译,一种是动态解释,即时编译混合了这二者。Ja

  • threadlocal底层实现_hashset底层实现原理

    threadlocal底层实现_hashset底层实现原理ThreadLocal作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂性。package com.mupack;public class App{ private String content; public void setContent(String content) { this.content = content; } public Stri

  • GG修改器修改钻石_gg是啥意思

    GG修改器修改钻石_gg是啥意思图就不上了,金钱、钻石和基因等修改,孤单亲测。工具:方法:一.打开GG修改器后选择六号特工二.内存范围:Ca1.钻石修改:进入角色—-选择草帽特工搜索:2500搜索类型:Q全选–修改–更多–增量填1切换下角色你会发现值变了返回搜索找到对应的值修改即可!改成-9999999992.金钱修改:进入关卡打死一个怪后搜索金钱的值搜索类型:Q直接修改即可!改成9999999993.基因修…

  • C语言实现学生成绩管理系统(EasyX图形界面)

    C语言实现学生成绩管理系统(EasyX图形界面)我的小站——半生瓜のblog代码文件下载链接——链接学生成绩管理系统学生成绩管理系统效果图流程&注意要点代码实现学生成绩管理系统效果图流程&注意要点核心部分——EasyX显示图形界面,结构体数组和文件操作负责对数据进行各种操作。只要一进去程序就对存储数据的文件进行读取,如果有数据直接读到学生结构体数组里面,得到当前结构体数组中的数据数量(几个人),并将所有数据打印到屏幕上。管理员用户输入密码验证——读取文件——验证用户输入是否正确。显示所有数据——如果通过文件.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号