服务消费者整合Feign

  使用Eureka 和 Ribbon的时候是怎么调用注册在Eureka Server上的微服务的地址呢?

  有多个参数呢?

  @GetMapping("/searchUser")
  public User searchUser(String name ,String age ,String username) {
      Map<String, Object> paraMap = new HashMap<String ,Object>() {
          {
              put("name",name);
              put("age",age);
              put("username",username);
          }  
      };
 return  this.restTemplate.getForObject("http://microservice-provider-user/search?name={name}&age={age}&username={username}", User.class, paraMap);
  }

  feign是Netflix开发的声明模板化的HTTP客户端。 在Spring Cloud中使用Feign,只需要创建一个接口,并在接口上添加一些注解即可。 Spring Cloud对Feign进行增强,使Feign支持SpringMVC的总结,并整合Ribbon和Eureka。

  依赖

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

  创建一个Feign接口,并添加@FeignClient注解

package com.smart.feignclient;

import com.smart.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient("provider-user")
public interface UserFeignClient {

    @RequestMapping(method= RequestMethod.GET,value="/user/{id}")
    User findUserById(@PathVariable("id") Long id);
}

  FeignClient中的provider-user是要调用的微服务的名称,用于创建Ribbon负载均衡器。使用Eureka,所以Ribbon会把provider-user解析成Eureka Server中注册的服务。

  修改Controller层,将RestTemplate改为调用Feign接口

package com.smart.controller;

import com.smart.feignclient.UserFeignClient;
import com.smart.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MovieController {
    @Autowired
    private UserFeignClient userFeignClient;

    @GetMapping("/movie/{id}")
    public User findById(@PathVariable("id") Long id){
        return userFeignClient.findUserById(id);
    }
}

  启动类增加@EnableFeiginClients注解

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class ConsumerMovieFeginApplication {

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

  构造多参数GET/POST请求

  当浏览器或者外部其他请求请求到MovieController,MovieController需要调用UserController服务提供者提供的服务,MovieController会通过接口UserFeignClient来实现调用。在UserFeignClient接口方法里,通过映射UserController的REST API实现调用对端服务。

  

     

  

  

posted on 2019-05-06 21:36  溪水静幽  阅读(186)  评论(0)    收藏  举报