SpringCloud使用Feign进行服务调用

- Spring Cloud Feign简介
Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能以外,它还提供了一种声明式的Web服务客户端定义方式。使用它可以进行服务的消费,但是它的客户端负载平衡仍是通过Ribbon实现的

*- 使用Spring Cloud Feign
创建一个SpringBoot工程,作为服务调用方

  • 1.pom.xml

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    

    spring-cloud-starter-feign加入了feign的依赖

  • 2.启动类

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

    @EnableFeignClients:开启Spring Cloud Feign的支持功能

  • 3.服务层

    @FeignClient("hello-service")
        public interface HelloService {
    
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        String hello();
    }
    

    @FeignClient(“hello-service”):制定服务名来绑定服务、
    注:服务名不区分大小写
    @RequestMapping:指定调用服务中的具体方法

  • 4.Controller层

    @Controller
    public class ConsumerController {
    
        @Autowired
        private HelloService helloService;
    
        @RequestMapping(value = "/feign-consumer", method = RequestMethod.GET)
        @ResponseBody
        public String helloConsumer() {
            return helloService.hello();
        }
    }
    

    在方法中调用这个绑定了hello-service服务接口的客户端向该服务发起/hello接口的调用

  • 5.配置类

    server.port=9001
    
    spring.application.name=feign-consumer
    eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
    

    启动程序以后,在浏览器中输入http://localhost:9001/feign-consumer出现下图:

    这里写图片描述

- 提升使用,带参数的请求
在具体业务中的接口会比之前程序的复杂得多,这里介绍一下Feign对集中不同形式参数的绑定方法。有@RequestParam、@RequestHeader、@RequestBody

  • 1.改造服务提供类的Service层,添加几个方法

    @RequestMapping(value = "/hello1", method = RequestMethod.GET)
    @ResponseBody
    public String hello(@RequestParam String name) {
        return "hello " + name;
    }
    
    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    @ResponseBody
    public User hello(@RequestHeader String name, @RequestHeader Integer age) {
        return new User(name, age);
    }
    
    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    @ResponseBody
    public String hello(@RequestBody User user) {
        return "Hello " + user.getName() + ", " + user.getAge();
    }
    
  • 2.添加一个javabean

    public class User {
        private String name;
        private Integer age;
    
        public User() {
        }
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  • 3.修改服务调用类的接口

    @RequestMapping(value = "/hello1", method = RequestMethod.GET)
    String hello(@RequestParam("name") String name);
    
    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);
    
    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    String hello(@RequestBody User user);
    

    这里在定义各参数绑定时@RequestParam、@RequestHeader等可以指定参数名称的注解,但它们的value不能少,否则会报错,这和SpringMVC中有一点不同

  • 4.在服务调用类Controller层添加一个测试的接口

     @RequestMapping(value = "/feign-consumer2", method = RequestMethod.GET)
        @ResponseBody
        public String helloConsumer2() {
            String s2 = helloService.hello("dayday");
            return s2;
        }
    

    启动以后访问浏览器:

    这里写图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值