当前位置: 首页 > news >正文

Spring Cloud OpenFeign 配置

最少的配置(使用默认配置)

最少/默认配置示例如下(使用Nacos作为服务的注册与发现中心):

  • application.properties
server.port=8082
spring.application.name=nacos-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.enabled=true

spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

#开启热部署
spring.devtools.restart.enabled=true

  • 主启动类
package com.xl.projects;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApplication {
	public static void main(String[] args) {
		SpringApplication.run(NacosConsumerApplication.class, args);
	}
	
}

注意! 以上需添加注解@EnableFeignClients

  • @FeignClient接口
package com.xl.projects.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "nacos-provider")
public interface TestConsumerFeign {
	
	/**
	 * 注意!!!,这里需要显示的指定@RquestParam,否者调用的时候会报错!
	 * @param param
	 * @return
	 */
	@GetMapping("/provider/test")
	String invokeProvider(@RequestParam String param);
	
}

说明 :
在这里插入图片描述
在这里插入图片描述

  • 编写测试Controller,调用@FeignClient接口,从而调用服务提供者nacos-provider的服务
package com.xl.projects.controller;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.xl.projects.feign.TestConsumerFeign;

@RestController
public class TestConsumerController {
	
	@Resource
	private TestConsumerFeign testConsumerFeign;
	
	@GetMapping("/consumer/invoke")
	public String testInovke() {
		return testConsumerFeign.invokeProvider("cosuming now!!!");
	}
	
}

说明 :
在这里插入图片描述

  • 测试,访问http://localhost:8082/consumer/invoke

    使用OpenFeign调用成功:
    在这里插入图片描述

如何自定义配置,或者叫重写默认配置

见官网 : https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-overriding-defaults
在这里插入图片描述
可以通过@EnableFeignClients的属性defaultConfiguration 来指定使用哪一种配置方式:java代码配置还是配置文件配置

第一种方式,使用Java代码完成自定义/重写

  • 示例说明,重写编写一个@FeignClient客户端JustForTestFeign 以及配置类FooConfiguration

JustForTestFeign

package com.xl.projects.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(contextId = "sameNameDifferentId",name="nacos-provider",configuration=FooConfiguration.class)
public interface JustForTestFeign {
	
	@GetMapping("/provider/test")
	public String justTest(@RequestParam String param);
	
}

FooConfiguration

package com.xl.projects.feign;

import org.springframework.context.annotation.Bean;

import feign.Contract;

public class FooConfiguration {
	@Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }
}

配置类FooConfiguration 上可以不加@Configuration注解,只要保证在FooConfiguration 在@ComponentScan路径之下 或者 @SpringBootApplication的子包下,参见:

FooConfiguration does not need to be annotated with @Configuration. However, if it is, then take
 care to exclude it from any @ComponentScan that would otherwise include this configuration as it 
 will become the default source for feign.Decoder, feign.Encoder, feign.Contract, etc., when 
 specified. This can be avoided by putting it in a separate, non-overlapping package from any 
 @ComponentScan or @SpringBootApplication, or it can be explicitly excluded in @ComponentScan.

第二种方式,使用配置文件

形如:

spring:
    cloud:
        openfeign:
            client:
                config:
                    feignName:
                        url: http://remote-service.com
                        connectTimeout: 5000
                        readTimeout: 5000
                        loggerLevel: full
                        errorDecoder: com.example.SimpleErrorDecoder
                        retryer: com.example.SimpleRetryer
                        defaultQueryParameters:
                            query: queryValue
                        defaultRequestHeaders:
                            header: headerValue
                        requestInterceptors:
                            - com.example.FooRequestInterceptor
                            - com.example.BarRequestInterceptor
                        responseInterceptor: com.example.BazResponseInterceptor
                        dismiss404: false
                        encoder: com.example.SimpleEncoder
                        decoder: com.example.SimpleDecoder
                        contract: com.example.SimpleContract
                        capabilities:
                            - com.example.FooCapability
                            - com.example.BarCapability
                        queryMapEncoder: com.example.SimpleQueryMapEncoder
                        micrometer.enabled: false

两种方式的比较

前提知识:

  • 一个项目中可以使用多个@FeignClient(name值不一样)接口调用不同的服务提供者
  • 如下
一个项目中也可以有多个带@FeignClient注解的接口调用同一个服务提供者,即是
@FeignClient的名字name可以相同,但是必须要有contextId。如果没有配置
contextId,项目启动时会报错!

在这里插入图片描述
官方解释:

If we want to create multiple feign clients with the same name or url so 
that they would point to the same server but each with a different custom 
configuration then we have to use contextId attribute of the @FeignClient 
in order to avoid name collision of these configuration beans.
@FeignClient(contextId = "fooClient", name = "stores", configuration = FooConfiguration.class)
public interface FooClient {
    //..
}
@FeignClient(contextId = "barClient", name = "stores", configuration = BarConfiguration.class)
public interface BarClient {
    //..
}

java代码方式:可以针对每一个@FeignClient接口作定制化配置,只需要编写不同的配置类,然后配置到@FeignClien的属性configuration中即可

配置文件的方式:针对所有的@FeignClient接口。

同时使用,默认情况下,配置文件方式会覆盖java代码方式,当然,也可以更改这种优先级。

相关文章:

  • 地方门户网站模版/产品推广计划怎么写
  • 信息最全的网站/上海牛巨仁seo
  • 中国建设教育协会bim考点网站/百度学术官网入口
  • 易书网上书城网站建设方案/最新推广注册app拿佣金
  • 临海市网站建设/市场宣传推广方案
  • 淘宝买网站开发不行吗/泾县网站seo优化排名
  • 语义分割——FCN模型pytorch实现
  • 规划之路:SLAM学习经验分享
  • InfluxDB + Grafana计算成功率
  • 数组常用方法总结 (6) :includes / indexOf / lastIndexOf / valueOf / toString / isArray
  • 代码随想录算法训练营第十八天二叉树 java : .106 从中序与后序遍历序列构造二叉树113. 路径总和ii 112 路径总和 513.找树左下角的值
  • MySQL进阶——存储引擎
  • npm的相关知识
  • 【MySQL】运算符及相关函数详解
  • ESP32 FreeRTOS-事件组(10)
  • 长安汽车推动新伙伴变革重塑供应链模式发布长安智电iDD技术
  • 价值创造链路及经营计划
  • Qt样式(qss)应用到QMdiArea不生效的解决