IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring cloud alibaba--Feign微服务调用组件 -> 正文阅读

[Java知识库]Spring cloud alibaba--Feign微服务调用组件

目录

1.什么是Feign

1.1Feign优势

2.spring cloud alibaba整合Feign

3.Spring Cloud Feign日志配置

?4.Feign契约配置

?5.Feign超时时间配置

6.Open Feign自定义拦截器


1.什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign支持多种注解,例如JAX-RS注解。

spring cloud openfeign对feign进行了增强,使其支持spring mvc注解,另外还整合了Ribbon和Nacos,从而使得feign的使用更加方便。

1.1Feign优势

Feign可以做到使用http请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程调用,更感知不到这是http请求。它像dubbo一样,consumer直接调用接口调用provider,而不需要通过常规的Http client构造请求再解析返回数据。它解决了让开发者调用远程接口跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

2.spring cloud alibaba整合Feign

(1)pom.xml中引入依赖

       <!-- 添加springcloud 的openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
           <!-- 排除冲突的jar包文件-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-commons</artifactId>
                </exclusion>
            </exclusions>

        </dependency>

(2)application.properties中配置链接nacos的信息

server.port=8084
#应用名称,nacos会将该名称当做服务名称
spring.application.name=order-service
#nacos服务连接地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
#nacos discovery连接用户名
spring.cloud.nacos.discovery.username=nacos
#nacos discovery连接密码
spring.cloud.nacos.discovery.password=nacos
#nacos discovery工作空间
spring.cloud.nacos.discovery.workspace=public

(3)编写Feign调用接口

使用@FeignClient来定义feign的调用方式,value为调用的服务名,path对应被调用服务处理的controller层,按相同的写法把提供者的方法在此接口中实现,使用spring mvc注解请求的方式定义。
/**
 * 使用@FeignClient来定义feign的调用方式,value为调用的服务名,path对应被调用服务处理的controller层
 */
@FeignClient(value = "stock-service",path ="/stock" )
public interface StockOpenFeign {

    @RequestMapping("/reduct")
    String reduct();
}

/**
 * @RequestMapping("/stock")
 * public class StockController {
 *
 *     @Value("${server.port}")
 *     String port;
 *
 *     @RequestMapping("/reduct")
 *     public String reduct(){
 *         System.out.println("扣减库存");
 *         return "扣减库存成功,端口号为:"+port+"的服务提供调用";
 *     }
 * }
 */

(4)调用类在启动类代码中添加@EnableFeignClients注解

/**
 * 程序启动类
 */
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

(5)像调用本地一样发起远程调用,使用接口调用

之前使用spring boot 的RestTemplate调用方式:

①先创建RestTemplate

    //程序启动时创建RestTemplate
    //使用注解LoadBalanced标识负载均衡,默认轮询的方式
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate build = builder.build();
        return build;
    }

②程序中使用RestTemplate调用

    //注入RestTemplate
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
       // String forObject = restTemplate.getForObject("http://localhost:8083/stock/reduct", String.class);
        String forObject = restTemplate.getForObject("http://stock-service/stock/reduct", String.class);
        return "add order "+forObject;
    }

现在使用OpenFeign调用:直接使用刚才创建的接口定义的方法

    @Autowired
    StockOpenFeign stockOpenFeign;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        String reduct = stockOpenFeign.reduct();
        return "add order "+reduct;
    }

3.Spring Cloud Feign日志配置

当我们遇到Bug,比如接口调用失败,参数没收到等问题,或者想看看调用性能问题,就需要配置Feign的性能日志,以此让Feign把请求信息输出来。

(1)Feign的日志级别有四种

①NONE【性能最佳,适用于生产】:不记录任何日志(默认)

②BASIC【适用于生产环境追踪问题】:仅记录请求方法,URL,响应状态代码及执行时间

③HEADERS:记录BASIC的基础上,记录请求和响应的header、

④FULL【比较适用于开发和测试环境定位问题】:记录请求和响应的header、body和元数据

(2)定义一个配置类,指定日志级别

/**
 * Feign配置类
 */
public class FeignConfig {

    //指定日志级别
    @Bean
    public Logger.Level feignLoggerLever(){
        return Logger.Level.FULL;
    }
}

(3)application中配置日志级别

spring boot默认级别是info,feign需要配置为debug,所以默认级别情况下不输出feign日志,debug模式,日志太多,可以指定某个包下的日志配置成dubug。

?(4)系统中再创建一个项目ProductNacos(商品管理系统),提供一个带参数@PathVariable 方式的访问服务。为了后面配置整体日志、指定某个日志方式做准备。

(5)使用Feign访问订单OrderNacos和商品ProductNacos项目的配置接口

/**
 * 使用@FeignClient来定义feign的调用方式,value为调用的服务名,path对应被调用服务处理的controller层
 */
@FeignClient(value = "stock-service",path ="/stock" )
public interface StockOpenFeign {

    @RequestMapping("/reduct")
    String reduct();


}
/**
 * 使用feign方式访问ProductNacos项目
 */
@FeignClient(value = "product-service",path = "product")
public interface ProductOpenFeign {

     @RequestMapping("/{id}")
     String get(@PathVariable("id") Integer id);

}

******当我们有参数时,使用@PathVariable时,需要把具体的参数名带上@PathVariable("id"),否则feign会报错,spring mvc请求时可以不带上具体的参数名。

(6)配置Feign的日志级别为全局方式,所有的服务都使用这个日志级别,在Feign日志配置类中加注解@Configuration

?(7)我们的订单控制层,使用Feign的方式,调用库存Stock和商品Product的方式

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    StockOpenFeign stockOpenFeign;

    @Autowired
    ProductOpenFeign productOpenFeign;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        String reduct = stockOpenFeign.reduct();
        String s = productOpenFeign.get(1);
        return "add order "+reduct+s;
    }
}

(8)访问服务,查看使用@Configuration全局配置日志的方式,控制台的输出情况:两个服务的feign调用日志都输出来了。

(9)feign日志指定某个服务调用时使用配置方式

需要先去除@Configuration配置

?方式一:在Feign的配置接口中添加configuration指定

只有商品的日志信息打印出来了

方式二:在application.properties配置文件中指定

#feign日志局部配置:feign.client.config.服务名.logger-level=日志级别
feign.client.config.stock-service.logger-level=BASIC

此时只有stock服务调用有日志

?4.Feign契约配置

Spring cloud在Feign的基础上做了扩展,使用Spring MVC注解的方式来完成Feign的功能。原生的Feign是不支持Spring mvc的,如果想在spring cloud客户端中使用原生的注解方式定义客户端也是可以的,通过配置契约来改变这个配置。

(1)修改契约配置,支持Feign原生的注解

  //修改契约配置,支持Feign原生的注解
    @Bean
    public Contract feignContract(){
        return new Contract.Default();
    }

注意:修改Feign的契约后,使用Feign连接的接口不在支持spring mvc的注解,需要使用Feign原生的注解

(2)Feign连接的接口使用原生的注解

RequestMapping需要改成RequestLine;@PathVariable需要改成@Param
@FeignClient(value = "product-service",path = "/product")
public interface ProductOpenFeign {

     @RequestLine("GET /{id}")
     String get(@Param("id") Integer id);

}

(3)可以在application.properties配置文件中配置,局部指定某个服务使用原生feign配置

#feign契约局部配置:feign.client.config.服务名.contract=feign.Contract.Default
feign.client.config.product-service.contract=feign.Contract.Default

此时只是product-service这个配置了原生的feign,stock-service还是使用spring mvc的注解

?

?

?5.Feign超时时间配置

通过Options可以设置连接超时时间和读取超时时间,Options的第一个参数是连接的超时时间(ms),模式2s;第二个参数是请求处理的超时时间(ms),默认5s。

(1)全局配置

    @Bean
    public Request.Options options(){
        return new Request.Options(5000,10000);
    }

(2)application.properties配置文件中进行局部配置

#feign连接超时时间局部配置:feign.client.config.服务名.connect-timeout=
feign.client.config.product-service.connect-timeout=5000

#feign请求处理超时时间局部配置:feign.client.config.服务名.connect-timeout=
feign.client.config.product-service.read-timeout=10000

6.Open Feign自定义拦截器

(1)定义一个拦截器来,实现RequestInterceptor接口

/**
 * 自定义feign拦截器
 */
public class FeignAuthRequestInterceptor implements RequestInterceptor {

    //重写拦截方法
    @Override
    public void apply(RequestTemplate requestTemplate) {
        System.out.println("Feign拦截器拦截到信息");
        requestTemplate.uri("/8"); //改变请求的结尾链接

    }
}

(2)在配置类中使用@Configuration全局配置

    //配置自定义拦截器
    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
        return new FeignAuthRequestInterceptor();
    }

(3)可以在application.properties配置文件中配置,局部配置

#feign请求处理超时时间局部配置:feign.client.config.服务名.request-interceptors[数组长度,支持多个拦截器]=自定义拦截器目录
feign.client.config.product-service.request-interceptors[0]=com.qingyun.inter.FeignAuthRequestInterceptor

(4)Feign发送请求前拦截控制台打印数据,修改uri的参数成功

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:31:22  更:2021-07-25 11:32:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 4:54:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计