小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Fegin简介

Fegin 是一个声明式 HTTP 客户端,这使得编写 HTTP 客户端变得更加容易。使用Fegin只需要创建一个接口并对其进行注释即可。它具有可插入的注释功能。 Nacos 与 Fegin 非常兼容,并且默认实现。为了达到负载均衡的效果,底层使用HttpClient作为服务框架。

在Spring Cloud集群中,各个角色的通信都是基于REST服务的,所以在调用服务的时候,不可避免的会用到REST服务的请求客户端。我一直在使用Spring自带的RestTemplate,RestTemplate使用HttpClient来发送请求。接下来我们将介绍另一个REST客户端:Feign。 Feign框架已经集成到Spring Cloud Netflix项目中,使用该框架可以更方便地调用Spring Cloud集群中的REST服务。

在这里插入图片描述

在这里插入图片描述

Web Service

使用 CXF 调用 REST 服务

CXF是目前流行的Web Service框架,也是Apache开源项目。使用CXF,您可以使用各种协议发布和调用服务,包括SOAP协议、XML/HTTP等。目前CXF已经支持REST风格的Web Services,可以发布或调用REST风格的Web Services。由于CXF可以与Spring集成并且易于配置,因此受到许多开发人员的青睐。使用的CXF在Maven中需要以下依赖:

在这里插入图片描述
编写代码请求/person/{persionid}服务:

在这里插入图片描述
客户端中使用了WebClient类发送了请求,获取响应后读取数据流,获取服务返回json字符串。

使用Restlet调用REST服务

Restlet 是一个轻量级的 REST 框架,可用于发布和调用 REST 风格的 Web 服务。

在这里插入图片描述
在这里插入图片描述
使用Restlet的api比较简单,但是Maven中央仓库没有Restlet包,需要在pom.xml中添加以下配置:

在这里插入图片描述

RestTemplate 调用 REST 服务

RestTemplate位于org.springframework.web.client.RestTemplate包spring mvc框架的类,也具有调用http协议的功能。

Spring Cloud Netflix Feign框架

Feign 框架是一个类似的框架,它简化了 Web Service 客户端的开发。使用Feign时,可以使用注解来修改接口。通过注解修饰的接口具有访问Web Service的能力。

Spring Cloud 将 Feign 集成到 Netflix 项目中。 Feign与Eureka、Ribbon集成时具有负载均衡功能。与 Spring 的集成大大提高了简单性。

在这里插入图片描述

Feign组件的使用

对于Feign的调用和之前使用RestTemplate完全不一致,首先对于微服务的调用一定都是基于服务治理的,Feign也遵守,使用RestTemplate对象时是基于@RestController控制器进行,而Feign基于自生注解@FeignClient实现,不再仅仅是调用API接口实现服务调用,而是整个客户端都由Feign提供。

在服务调用者中实现:

  1. 导入依赖项
<!--feign实现微服务的调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.3</version>
        </dependency>

注意是openfeign而不是netflix-feign

  1. 配置呼叫接口
/** * 声明微服务名称 */
@FeignClient(name = "bill-service")
public interface BillClient {
    
    //配置微服务调用接口
    @GetMapping(value = "/bill/{id}")
    BillMessage getBuId(@PathVariable("id") Integer id);
}


  1. 在启动类上注释activation feign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class TestModuleApplication {
    

    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate(){
     return new RestTemplate(); }

    public static void main(String[] args) {
    
        SpringApplication.run(TestModuleApplication.class, args);
    }

}

//核心是@EnableFeignClients

  1. 通过自动接口调用远程服务
/** * 基于feign实现微服务 */
@RestController
@RequestMapping(value = "/test1")
public class Test2Controller {
    

    @Autowired
    private BillClient billClient;

    @GetMapping(value = "/feign/{id}")
    public BillMessage method1(@PathVariable("id") Integer id){
    
        BillMessage buId = billClient.getBuId(id);
        return buId;
    }
}

该服务仍然可以被调用:

在这里插入图片描述

还遇到了一个错误就是Could not find class [org.springframework.cloud.client.loadbalancer.LoadBalancerProperties]

出现该错误的原因是spring-cloud-starter-openfeign版本过低,升级版本即可。

工作原理解析

在这里插入图片描述
在这里插入图片描述

对比之前的调用方式:

@RestController
@RequestMapping(value = "/test")
public class TestController {
    


    //获取服务中心实例
    @Autowired
    private DiscoveryClient discoveryClient;

    //java代码访问api接口的实例对象


    @Autowired
    private RestTemplate restTemplate;

    //bill_service的调用
    @GetMapping(value = "/bill/{id}")
    public BillMessage testMethod1(@PathVariable Integer id){
    
        List<ServiceInstance> bill_service = discoveryClient.getInstances("bill_service");
        //该服务只有一个
        ServiceInstance instance = bill_service.get(0);

        BillMessage billMessage = restTemplate.getForObject(instance.getUri() + "/bill/" + id, BillMessage.class);
        System.out.println(instance.getUri());
        return billMessage;
    }


    //使用Ribbon获取服务
    @GetMapping(value = "/bill1/{id}")
    public BillMessage testMethod2(@PathVariable Integer id){
    
        BillMessage billMessage = restTemplate.getForObject("http://bill-service/bill/"+id,BillMessage.class);
        return billMessage;
    }


}

通过服务实例ServiceInstance获取服务信息,在通过RestTemplate访问接口,步骤比较繁琐;第二种通过Ribbon获取,封装了服务实例的获取,直接通过服务名调比较方便。对于feigin呢?

/** * 基于feign实现微服务 */
@RestController
@RequestMapping(value = "/test1")
public class Test2Controller {
    

    @Autowired
    private BillClient billClient;

    @GetMapping(value = "/feign/{id}")
    public BillMessage method1(@PathVariable("id") Integer id){
    
        BillMessage buId = billClient.getBuId(id);
        return buId;
    }
}
/** * 声明微服务名称 */
@FeignClient(name = "bill-service")
public interface BillClient {
    
    //配置微服务调用接口
    @GetMapping(value = "/bill/{id}")
    BillMessage getBuId(@PathVariable("id") Integer id);
}

Feign设置了代理服务,调用先通过Proxy也兼顾负载均衡功能,还可以用服务名调用,在Rest接口调用时直接通过代理服务获取
甚至省去了url的拼接,极其方便。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

feign的设计原则
在这里插入图片描述

Feign的代理可以帮助我们解决很多问题。由于我们的服务调用都是基于Http协议,所以代码中必须使用对应的Http客户端来实现服务之间的通信。 RestTemplate是Spring Web提供的Http客户端。但使用RestTemplate时,代码可读性较差,参数url复杂,难以维护。 Feign是一个声明式的http客户端,它的作用就是帮助我们优雅地实现http请求的发送,解决上面提到的问题。

总结

使用feign框架有四个步骤:

  1. 导入spring-cloud集成feign的依赖;
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 添加feign的配置启动类
@SpringBootApplication
//@EnableDiscoveryClient
@EnableFeignClients
public class TestModuleApplication {
    
	/* @LoadBalanced @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } */
    public static void main(String[] args) {
    
        SpringApplication.run(TestModuleApplication.class, args);
    }

}
  1. 创建feign接口代理类并解析服务实例
@FeignClient(name = "bill-service")
public interface BillClient {
    
    //配置微服务调用接口
    @GetMapping(value = "/bill/{id}")
    BillMessage getBuId(@PathVariable("id") Integer id);
}

//FeignClinet代理根据配置名称,通过GetMapping接口获取服务实例信息并解析,其方法返回值为接口返回Bean对象,无需解析赋值过程。
  1. 获取feign代理服务类并获取返回的实例
/** * 基于feign实现微服务 */
@RestController
@RequestMapping(value = "/test1")
public class Test2Controller {
    
	
	//获取feign代理实例
    @Autowired
    private BillClient billClient;


    @GetMapping(value = "/feign/{id}")
    public BillMessage method1(@PathVariable("id") Integer id){
    
    	//feign代理实例获取的服务实例对象的接口返回值信息赋值,在调用接口赋值。
        BillMessage buId = billClient.getBuId(id);
        return buId;
    }
}

feign的配置

feign的默认配置可以通过一些自定义配置来覆盖。可以修改的配置如下:

在这里插入图片描述
配置Feign日志有两种方式:1.配置文件方式、2.java代码方式

  • 配置文件
#全局生效
feign:
  client:
    config:
      default:   # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL  # 日志级别
#局部生效
feign:
  client:
    config:
      userservice:   # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL  # 日志级别
  • 通过Java代码自定义配置
public class FeignClientConfiguration {
    
    @Bean
    public Logger.Level feignLogLevel(){
    
        return Logger.Level.BASIC;
    }
}

那么如果是全局配置的话,放在@EnableFeignClients注解中:

@SpringBootApplication
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
public class OrderServiceApplication {
    
    public static void main(String[] args) {
    
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

如果是本地配置,则放在@FeignClient注解中:

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
public interface UserClient {
    
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

更多配置信息参考假装自定义配置感谢作者@wenxuehai

. . .

相关推荐

额外说明

centos7 - 查询文件位置

一、从根目录查看文件 find / -name xxxx 二、从当前目录查看文件 find . -name xxx 注意:从根目录是 / ;从当前目录是 . 三、模糊查询文件 find / -name '*xxx*' 例如:find / -name

额外说明

公司里个人关心的三件事

个人成长: 在一个人刚入职的时候,因为是一个人闯天下,一个人吃饱全家不饿,在意的是个人在公司的成长情况,每天是不是都在进步。 薪资待遇 当到了恋爱买房成家的阶段,开销就要大一些了,每个月的账目流水就真如流水,这个阶段就会对薪资待遇更加敏感。 个人成就(干

额外说明

seata 官网

        http://seata.io/   中文首页 http://seata.io/zh-cn/index.html     文档 http://seata.io/zh-cn/docs/overview/what-is-seata.html

额外说明

QT在QLabel上实现超链接

QT 实现QLabel上的超链接 方法一: 一个简单的例子: Widget::Widget(QWidget *parent)     : QWidget(parent) {     QLabel* label = new QLabel("<a href 

额外说明

【算法系列篇】分治-归并

文章目录 前言 什么是归并算法 1. 排序数组 1.1 题目要求 1.2 做题思路 1.3 Java代码实现 2. 数组中逆序对 2.1 题目要求 2.2 做题思路 2.3 Java代码实现 3. 计算右侧小于当前元素的个数 3.1 题目要求 3.2 做

额外说明

YoloV8改进策略:Intel面向参数高效动态卷积KernelWarehouse,YoloV8的上分显眼包

文章目录 摘要 论文:面向参数高效动态卷积——KernelWarehouse 1、简介 2、相关工作 3、方法 3.1、KernelWarehouse的表述 3.2、KernelWarehouse的注意力模块 4、实验 4.1、ImageNet上的图像分

额外说明

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)

目录 0 专栏介绍 1 栅格地图与邻域 2 贪婪最佳优先搜索 3 Dijkstra算法 4 启发式A*搜索 5 A*、Dijkstra、GBFS算法的异同 6 算法仿真与实现 6.1 算法流程 6.2 ROS C++实现 6.3 Python实现 6.4

额外说明

在GIn框架中使用JWT

在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。 什么是JWT? JWT全称JSON Web Token是一

额外说明

【Python】报错:调用浏览器出现错误 “selenium.common.exceptions.SessionNotCreatedException”

目录 一、报错情况 二、报错解读 三、解决报错 一、报错情况 E:\Python\python.exe D:/PythonWorkSpace/PythonTest/Common/ChromeWebDriver.py Traceback (most rec

ads via 小工具