zoukankan      html  css  js  c++  java
  • 注解式HTTP请求Feign (F版)

    Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态)。使用Spring Cloud开发人员可以快速地完成实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作

    Feign

    注解式的 Feign 使得 Java HTTP 客户端编写更方便。Feign 灵感来源于安卓网络编程框架 RetrofitJAXRS-2.0 和 WebSocket,支持可插拔编码器和解码器,降低 HTTP API 的复杂度,通过最少的资源和代码来实现和 HTTP API 的连接。通过可定制的解码器和错误处理,可以编写任意的HTTP API。Spring Cloud Feign 封装了 Ribbon 这一组件,所以在使用 Feign 同时还能提供负载均衡的功能,这一切只需要一个 @FeignClient 即可完成。

    早期版本的 Feign 被 Spring Cloud 团队集成在 spring-cloud-netflix 子项目下,但如今 Spring Cloud 团队将 Spring Cloud Feign独立成一个单独的 spring-cloud-openfeign 项目

    Try

    准备三个工程,分别是 eureka-serverorder-serverproduct-server

    Eureka Server

    详情参考第一章,或从文末的 GITHUB 链接获取对应篇幅的完整代码

    Product Server

    一个普通的 Eureka Client 即可,详情参考上一章,或从文末的 GITHUB 链接获取对应篇幅的完整代码

    Order Server

    这个例子也是在上一章的基础之上做了扩展

    依赖

    对比上一章,此处多了一个 spring-cloud-starter-openfeign 的依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    </dependencies>

    配置文件

    在 src/main/resources 目录下创建一个 bootstrap.yml 的文件,写上 eureka 相关配置信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    server:
    port: 7072
    spring:
    application:
    name: order-server
    eureka:
    instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
    client:
    service-url:
    defaultZone: http://localhost:7071/eureka/

    ProductClient 接口

    创建一个 ProductClient ,是不是感觉和 XxxxService 看起来类似(用法都类似),都是接口文件只不过在这个文件的上方多了一个 @FeignClient 注解,多种写法,总有一款适合你

    • name:指定 FeignClient 的名称,该属性会作为微服务的名称,用于服务发现
    • value:同 name 字段互通
    • serviceId:指定服务ID,每个注册到注册中心上的客户端都会有对应的 serviceId 一般是 spring.application.name,与 name 和 value 互通
    • url: 一般用于调试,可以指定一个详细地址(http://localhost:8080/products)
    • path: 请求统一路径,可以看成 @RequestMapping("/products")
    • decode404:404 错误时,调用 decoder 进行解码,否则抛出 FeignException
    • fallback:发生错误时,回调 hystrix 类/方法(后面会详细介绍)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.battcn.api;

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

    /**
    * @author Levin
    * @since 2018/9/26 0026
    */
    @FeignClient(name = "product-server/products", decode404 = true)
    //@FeignClient(name = "products", url = "http://localhost:7073/products")
    //@FeignClient(value = "product", serviceId = "product-server", path = "/products", decode404 = true)
    public interface ProductClient {

    /**
    * 根据产品ID查询产品信息
    *
    * @param productId ID
    * @return 查询结果
    */
    @GetMapping("/{product_id}")
    String selectProductById(@PathVariable("product_id") Long productId);
    }

    OrderController

    直接使用 @Autowired 注入进去即可,然后调用就好了,对比较 Ribbon 这里我们看不到 RestTemplate 的代码了,也无需自己做解码映射,Spring Cloud Feign 默认都替我们实现好了,我们只需要遵循既定的标准即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.battcn.controller;

    import com.battcn.api.ProductClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    /**
    * @author Levin
    * @since 2018/9/26 0026
    */
    @RestController
    @RequestMapping("/orders")
    public class OrderController {

    @Autowired
    private ProductClient productClient;


    @GetMapping
    public String query() {
    return this.productClient.selectProductById(10L);
    }
    }

    主函数

    通过 @EnableFeignClients 注解开启对 Feign 的支持,用习惯 Dubbo 的朋友喜欢将 API 打包成独立的 JAR ,这个时候需要指定 basePackage 属性。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.battcn;

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

    /**
    * @author Levin
    */
    @EnableFeignClients
    @EnableDiscoveryClient
    @SpringBootApplication
    public class OrderApplication {

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

    }
  • 相关阅读:
    Qt: 自动调整到最合适的大小(不是很明白)
    Qt: 读写二进制文件(写对象, 原始数据等)
    Qt: 把内容写进字符串中与C++很相似(使用QTextStream包装QString)
    2008技术内幕:T-SQL语言基础
    bootstrap + angularjs + seajs构建Web Form前端2
    SignalR 2.0 系列: SignalR简介
    Amazon前技术副总裁解剖完美技术面试
    MongoDB数据文件内部结构
    SQL Server三种表连接原理
    了解mongoDB存储结构
  • 原文地址:https://www.cnblogs.com/lywJ/p/10715654.html
Copyright © 2011-2022 走看看