spring cloud feign配置

本文介绍了如何在Spring Cloud项目中配置Feign客户端,并结合Alibaba Sentinel实现服务的熔断和异常兜底策略。通过在pom.xml中引入相关依赖,配置Feign和Sentinel的相关属性,然后在代码层面创建Feign接口和异常返回处理类,实现了当服务调用失败时返回自定义错误信息的功能。同时,定义了自定义异常`FeignException`以提供详细的错误状态和消息。
  1. 配置pom文件
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
   <version>1.3.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 添加配置
    我这边只配置了一个哨兵,用于兜底返回报错信息
feign:
  sentinel:
    enabled: true
  1. 代码层面
    3.1 在启动类上添加@EnableFeignClients注解
    3.2 添加feign调用类
// 接口调用
@FeignClient(value = "other-feign-project", path = "/v1", fallbackFactory = FeignFallbackFactory.class)
public interface BasicFeignClient {

    @ApiOperation(value = "feign测试")
    @PostMapping("/test/check")
    ResponseEntity<SimpleResponse<String>> selectCodeDetailByCodeId(  @ApiParam(value = "测试数据") @RequestBody TestModel  model);
}
// 异常返回
@Component
public class BasicFeignFallbackFactory implements FallbackFactory<BasicFeignClient> {
    public static final Logger logger = LoggerFactory.getLogger(BasicFeignFallbackFactory.class);

    @Override
    public BasicFeignClient create(Throwable cause) {
        return new BasicFeignClient() {
            @Override
            public ResponseEntity<SimpleResponse<String>> selectTest(TestModel  model) {
               throw new (FeignException) cause).getmsg();
            }
        };
    }
}
// 自定义异常
public class FeignException extends RuntimeException {
    private static final long serialVersionUID = 5609431427024976611L;
    private String msg;
    private final String code;
    private HttpStatus httpStatus;

    public FeignException(HttpStatus httpStatus, String code) {
        super(code);
        this.httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        this.code = code;
        this.httpStatus = httpStatus;
    }

    public FeignException(HttpStatus httpStatus, String code, String msg) {
        super(code);
        this.httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        this.code = code;
        this.msg = msg;
        this.httpStatus = httpStatus;
    }

    public FeignException(String code, Throwable cause) {
        super(code, cause);
        this.httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        this.code = code;
    }

    public FeignException(String code, String msg) {
        this.httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return this.code;
    }

    public String getmsg() {
        return this.msg;
    }

    public HttpStatus getHttpStatus() {
        return this.httpStatus;
    }
}
// 使用
  private String getTest() {
  TestModel  model=new TestModel();
        ResponseEntity<SimpleResponse<String>> simpleResponseResponseEntity = basicFeignClient.selectTest(model);
        JSONObject responseBody = JSONUtil.parseObj(simpleResponseResponseEntity.getBody());
        return (String) responseBody.get("data");
    }
要在Spring Cloud Feign配置FastJson序列化,您需要完成以下步骤: 1. 添加FastJson依赖 在项目的pom.xml文件中,添加FastJson依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> ``` 2. 创建FastJson转换器 创建一个FastJson转换器类,继承自Spring的HttpMessageConverter接口,并实现其方法。代码如下: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; public class FastJsonHttpMessageConverter implements HttpMessageConverter<Object> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private SerializerFeature[] serializerFeatures = new SerializerFeature[0]; private Feature[] parserFeatures = new Feature[0]; @Override public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) { return true; } @Override public boolean canWrite(Type type, Class<?> aClass, MediaType mediaType) { return true; } @Override public List<MediaType> getSupportedMediaTypes() { List<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); mediaTypes.add(MediaType.APPLICATION_JSON); mediaTypes.add(MediaType.TEXT_PLAIN); return mediaTypes; } @Override public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException { InputStream inputStream = inputMessage.getBody(); return JSON.parseObject(inputStream, DEFAULT_CHARSET, type, parserFeatures); } @Override public void write(Object o, Type type, MediaType mediaType, HttpOutputMessage outputMessage) throws IOException { HttpHeaders headers = outputMessage.getHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); String jsonString = JSON.toJSONString(o, serializerFeatures); OutputStream outputStream = outputMessage.getBody(); outputStream.write(jsonString.getBytes(DEFAULT_CHARSET)); outputStream.flush(); } public SerializerFeature[] getSerializerFeatures() { return serializerFeatures; } public void setSerializerFeatures(SerializerFeature[] serializerFeatures) { this.serializerFeatures = serializerFeatures; } public Feature[] getParserFeatures() { return parserFeatures; } public void setParserFeatures(Feature[] parserFeatures) { this.parserFeatures = parserFeatures; } } ``` 3. 配置FastJson转换器 在Spring配置类中,创建一个FastJson转换器的bean,并将其注册到Spring的HttpMessageConverters中。代码如下: ```java import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.List; @Configuration public class FeignConfiguration { @Bean public HttpMessageConverter fastJsonHttpMessageConverter() { return new FastJsonHttpMessageConverter(); } @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(new ObjectMapper()); messageConverters.add(converter); messageConverters.add(fastJsonHttpMessageConverter()); restTemplate.setMessageConverters(messageConverters); return restTemplate; } } ``` 4. 配置Feign Client 在Feign Client的配置类中,使用@FeignClient注解的configuration属性,将FastJson转换器的bean引入到Feign Client中。代码如下: ```java import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableFeignClients(defaultConfiguration = {FeignConfiguration.class}) public class FeignClientConfiguration { } ``` 完成以上步骤之后,您就可以在Spring Cloud Feign中使用FastJson作为序列化工具了。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值