zoukankan      html  css  js  c++  java
  • Spring Cloud (六):声明式 REST 请求 Feign

    调用 Rest 接口可以使用 RestTemplate 比如

        @Autowired
        private RestTemplate restTemplate;
    
        @RequestMapping("/query/{id}")
        public String qurey(@PathVariable Long id) {
            String forObject = restTemplate.getForObject("http://consul-service-1/product/" + id, String.class);
            return forObject;
        }
    

    可以看到需要拼接 URL,而 Feign 则提供了便捷优雅的方式

    Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端

    Feign 需要使用服务发现 Eureka 或 Consul,以及负载均衡 Robbin,这里使用 Consul

    因为 Consul 已经包含了 Robbin 依赖,所以不用再添加 Robbin 依赖

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    

    需要配置 Consul 信息

    server:
      port: 9000
    
    spring:
      application:
        name: spring-cloud-feign-example
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            # 设置不需要注册到 consul 中
            register: false
    

    主程序通过 @EnableFeignClients 注解开启 Spring Cloud Feign 功能

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

    Feign 接口

    @FeignClient(name="consul-service-1")
    public interface DemoFeignClient {
        // 这个函数会自动从 Consul 获取 producer consul-service-1 的信息,然后发送请求到相应的 URL
        @RequestMapping(value="/product/{id}", method = RequestMethod.GET)
        public String findProductById(@PathVariable("id") Long id);
    }
    

    在 consul producer 项目加入

        @GetMapping("/product/{id}")
        public String product(@PathVariable("id") String id) {
            return "price of product " + id + " is 100";
        }
    

    添加 consumer 的 controller

    @RestController
    public class Controller {
        @Autowired
        private DemoFeignClient demoFeignClient;
        
        @RequestMapping("/query/{id}")
        public String qurey(@PathVariable Long id) {
            // 调用 Feign Client,本质上还是调用 RestTemplate 的方式,Feign 会进行转化
            return demoFeignClient.findProductById(id);
        }
    }
    

    访问 http://localhost:9000/query/123
    返回 price of product 123 is 100


    Feign 的一些配置

    feign:
      client:
        config:
          feignName:      ## 定义 FeginClient 的名称,可以是任意名字
            connectTimeout: 5000
            readTimeout: 5000
            loggerLevel: full
      compression:
        request:
          enabled: true      ## 开启请求压缩
        response:
          enabled: true      ## 开启响应压缩
    

    也可以通过代码的方式配置



  • 相关阅读:
    C# 两个窗体中相互切换的方法
    Linq对DataTable数据的分组统计
    如何让窗体大小随着控件的大小变化而变化
    两张表解决用户自定义数据库之思路
    picturebox显示用字符串代表图片名称的(已导入资源的)图片
    如何将access高版本数据库保存为低版本的?
    Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别
    条件编译解决AutoCAD多版本问题
    一个爬取股票信息的爬虫程序
    Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
  • 原文地址:https://www.cnblogs.com/moonlight-lin/p/14221457.html
Copyright © 2011-2022 走看看