小工具      在线工具  汉语词典  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

. . .

相关推荐

额外说明

rabbitmq学习-centos7卸载删除rabbitmq和erlang

一、卸载rabbitmq --卸载 --停止服务 rabbitmqctl app_stop yum list | grep rabbitmq yum -y remove rabbitmq-server.noarch 二、删除erlang yum lis

额外说明

将 charCodeA() 与 toLowerCase() 和 toUpperCase() 结合起来实现一个将字符串从小写转换为大写的函数,即 ‘aBc’ => ‘AbC’

在实现大小写互换这个涵数之前先介绍一下几个api的含义 String.prototype.charCodeAt() charCodeAt() 方法返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元 String.prototy

额外说明

MySQL索引的基本语法

1、 索引创建 CREATE [UNIQUE ] INDEX [indexName] ON table_name(column)) 2、 索引删除 DROP INDEX [indexName] ON mytable; 3、 索引查看 SHOW

额外说明

MySQL数据库,从入门到精通:第十六篇——MySQL变量、流程控制和游标详解

MySQL数据库,从入门到精通:第十六篇——MySQL变量、流程控制和游标详解 第 16 篇_变量、流程控制与游标 1. 变量 1. 1 系统变量 1. 1. 1 系统变量分类 1. 1. 2 查看系统变量 1. 2 用户变量 1. 2. 1 用户变量分

额外说明

Python 第八节 第十七课

[toc] 设计模式_单例模式实现     单例模式 ( Singleton Pattern ) 的核心作用是确保一个类只有一个实例, 并且提供一个访问该实例的全局访问点.     单例模式只生成一个实例对象, 减少了对系统资源的开销. 当一个对象的产生

额外说明

统一windowx和linux系统的时间

timedatectl set-local-rtc 1 --adjust-system-clock sudo hwclock -w

额外说明

如果你也能认识并使用这个低代码平台,那真的是泰酷辣——iVX低代码平台

低代码技术起源是比较悠久的了,尤其是在近些年,随着技术的演进,低代码平台逐渐成为热门趋势。这些平台通过简化应用程序开发流程,减少手动编码,使非专业开发人员也能快速构建复杂应用。为我们的敏捷开发和高效生产贡献了,如今已成为企业数字化转型和创新的重要工具。

额外说明

Google云平台构建数据ETL任务的最佳实践

在数据处理中,我们经常需要构建ETL的任务,对数据进行加载,转换处理后再写入到数据存储中。Google的云平台提供了多种方案来构建ETL任务,我也研究了一下这些方案,比较方案之间的优缺点,从而找到一个最适合我业务场景的方案。 假设我们的业务场景需要定期从

额外说明

wordpress社交系统_如何将您的WordPress网站变成社交网络

WordPress 社交系统 您知道可以将 WordPress 网站变成社交网络吗? WordPress 社交网络允许用户注册、相互联系、发布消息等。在本文中,我们将向您展示如何将 WordPress 网站变成社交网络。 您知道可以将 WordPress

额外说明

金牌主播成长,一周从直播小白入门带货主播,让直播更简单

新书名:金牌主播的成长之路,从直播新手到优秀带货主播的一周体验。 文本: 近年来,直播电商行业蓬勃发展,越来越多的卖家和消费者加入到这种新颖的购物方式中。作为一名直播新手,我决定通过一周的学习和实践,探索成为一名优秀直播主的成长之路。在这篇文章中,我将分

ads via 小工具