• fegin服务调用


    使用

    1.加入依赖

    
    
      org.springframework.cloud
      spring-cloud-starter-openfeign
    

     2.在启动类上添加注解@EnableFeignClients

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. @EnableFeignClients
    4. public class OrderApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(OrderApplication.class, args);
    7. }
    8. @Bean
    9. @LoadBalanced
    10. public RestTemplate getRestTemplate() {
    11. return new RestTemplate();
    12. }
    13. }

    3.定义接口,并写上注解@FeignClient,value写上服务名称

    1. @FeignClient(
    2. value = "service-product",
    3. //fallback = ProductServiceFallBack.class,
    4. fallbackFactory = ProductServiceFallBackFactory.class)
    5. public interface ProductService {
    6. //指定调用提供者的哪个方法
    7. //@FeignClient+@GetMapping 就是一个完整的请求路径 http://serviceproduct/product/{pid}
    8. @GetMapping(value = "/product/{pid}")
    9. Product findByPid(@PathVariable("pid") Integer pid);
    10. }

    4.在任意bean中注入即可使用

    注解参数

    参数说明
    name指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
    url url一般用于调试,可以手动指定@FeignClient调用的地址
    decode404当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
    configurationFeign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
    fallback定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
    fallbackFactory工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
    path定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用

    fallbackFactory使用,定义容错处理,统一处理错误,需要实现 FallbackFactory接口

    1. @Component
    2. public class ProductServiceFallBackFactory implements FallbackFactory {
    3. @Override
    4. public ProductService create(Throwable throwable) {
    5. return pid -> {
    6. throwable.printStackTrace();
    7. Product product = new Product();
    8. product.setPid(-1);
    9. return product;
    10. };
    11. }
    12. }

    请求中加入头部信息

    1.在定义的fegin接口中的RequestMapping注解加上headers 参数

    1. @FeignClient(name="custorm",fallback=Hysitx.class)
    2. public interface IRemoteCallService {
    3. @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST,
    4. headers = {"Content-Type=application/json;charset=UTF-8"})
    5. List test(@RequestParam("names") String[] names);
    6. }

    2.在方法参数前面添加@RequestHeader注解,设置多个参数可以使用Map

    1. @FeignClient(name="custorm",fallback=Hysitx.class)
    2. public interface IRemoteCallService {
    3. @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
    4. List test(@RequestParam("names")
    5. @RequestHeader("Authorization")
    6. String[] names);
    7. }

    3.使用@Header注解

    1. @FeignClient(name="custorm",fallback=Hysitx.class)
    2. public interface IRemoteCallService {
    3. @RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
    4. @Headers({"Content-Type: application/json;charset=UTF-8"})
    5. List test(@RequestParam("names") String[] names);
    6. }

    4.实现RequestInterceptor接口

    1. @Configuration
    2. public class FeignRequestInterceptor implements RequestInterceptor {
    3. @Override
    4. public void apply(RequestTemplate temp) {
    5. temp.header(HttpHeaders.AUTHORIZATION, "XXXXX");
    6. }
    7. }

  • 相关阅读:
    ImageView的八种ScaleType
    Layui数据表格table排序(后端PHP)
    双端队列(Deque)
    RMarkdown进阶操作
    JDK源码级别彻底剖析JVM类加载机制
    京东大型API网关实践之路
    66从零开始学Java之集合中的Collection体系
    全志R528代码编译和烧录以及测试
    C++知识精讲15 | 三类基于贪心思想的区间覆盖问题【配套资源详解】
    【2022蓝帽杯】file_session && 浅入opcode
  • 原文地址:https://blog.csdn.net/yanjianpeng_2018/article/details/126719345