SpringCloudAlibaba快速整合OpenFeign

第一步:

<!--1. 添加openfeign依赖 -->
 <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 

第二步:

 

package com.order.service;

import com.order.config.feign.FeignConfig;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author vans on 2022/2/20 12:23
 */

/**
 *  name 指定调用接口所对应的服务名
 *  path 指定调用接口所在的ProductController指定的@RequestMapping
 */
@FeignClient(name = "product-service",path = "/vn/product"/*,configuration = FeignConfig.class*/)
public interface ProductService {


    @ApiOperation(value = "获取所有库存列表",notes = "不需要任何参数")
    @ApiImplicitParam(name = "",value = "",required = false,dataType = "")
    @GetMapping("/{id}")
    String  getProduct(@PathVariable("id") String id);

}

 

第三步:

package com.order.controller;

import com.order.service.ProductService;
import com.order.service.StockService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author vans on 2022/2/16 18:13
 */

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

    @Autowired
    private StockService stockService;
    @Autowired
    private ProductService productService;


    @ApiOperation(value = "获取所有用户列表", notes = "不需要任何参数")
    @ApiImplicitParam(name = "运单号", value = "mailNo", required = false, dataType = "String")
    @RequestMapping(value="/{mailNo}",method = RequestMethod.GET)
    public String getOrder(@PathVariable("mailNo") String mailNo) {

        String stock = stockService.getStock();

        String product = productService.getProduct(mailNo);

        return stock + "---" + product;
    }


}

 

第四步:

package com.order;

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

/**
 * @author vans on 2022/2/16 18:32
 */

/**
 * 此配 scanBasePackages={"com.netflix.client.config.IClientConfig"} 解决:
 *  Consider defining a bean of type 'com.netflix.client.config.IClientConfig' in your configuration.
 */

@SpringBootApplication(scanBasePackages={"com.netflix.client.config.IClientConfig","com.order"})
@EnableFeignClients
public class VnOrderApplication {


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


}

 

Spring Cloud Feign的自定义配置及使用
package com.order.config.feign;

import com.order.interceptor.FeignAuthInterceptor;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author vans on 2022/2/20 12:30
 */

/**
 *
 *  全局配置: 当使用@Configuration 会将配置作用所有的服务提供方
 *  局部配置: 1. 通过配置类:如果只想针对某一个服务进行配置, 就不要加@Configuration
 *           2. 通过配置文件
 *
 */

//@Configuration
public class FeignConfig {


//    @Bean
//    public Logger.Level feignLoggerLevel(){
//        return Logger.Level.FULL;
//    }

    /**
     * 修改契约配置,支持Feign原生的注解
     * 注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解
     * @return
     */

//     @Bean
//     public Contract feignContract() {
//     return new Contract.Default();
//     }

    /**
     * 超时时间配置
     */

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


    /**
     * 自定义拦截器
     * @return
     */

    @Bean
     public FeignAuthInterceptor feignAuthRequestInterceptor(){
     return new FeignAuthInterceptor();
     }

}

 

自定义拦截器:

package com.order.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;

/**
 * @author vans on 2022/2/20 14:06
 */
@Slf4j
public class FeignAuthInterceptor implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate requestTemplate) {

        requestTemplate.header("xxx","xxx");
        requestTemplate.query("id","111");
        requestTemplate.uri("/9");

        log.info("feign拦截器!");

    }

}

 

配置文件对日志、拦截器等进行配置:

 

server:
  port: 82

spring:
  application:
    name: order-service   # 应用名称  nacos 会将名称作为服务名称
  cloud:
    nacos:
      server-addr: 192.168.43.66:8848     # nacos 服务器地址
      discovery:
        username: nacos
        password: nacos
        namespace: public
# springboot默认的日志级别是info ,feign的dubug日志级别就不会输入
logging:
  level:
    com.order.service: debug
# feign日志局部配置
feign:
  client:
    config:
      product-service:  #对应微服务
        loggerLevel: FULL
#        指定Feign原生注解契约配置
#        注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解
#        contract: feign.Contract.Default
        # 连接超时时间,默认2s
        connectTimeout: 5000
        # 请求处理超时时间,默认5s
        readTimeout: 10000
        requestInterceptors[0]:
          com.order.interceptor.FeignAuthInterceptor
ribbon:
  eager-load:
    enabled: true
    clients: product-service,stock-service

 

posted @ 2022-02-20 14:34  VNone  阅读(213)  评论(0)    收藏  举报