SpringCloud篇四之Feign

/ FeignSpringCloudJava / 没有评论 / 69浏览

alt

Feign是什么?

Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可

Feign能干什么?

    // RestTemplate 调用方法
    private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-USER";
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/add")
    public String add(User user){
        return restTemplate.postForObject(REST_URL_PREFIX + "/user/add",user,String.class);
    }

使用Feign调用微服务

构建工程

延续前面的User的例子,模仿microservice-cloud-consumer-user-8002构建工程microservice-cloud-consumer-user-feign-8003

依赖引入

    <!-- feign相关 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

配置文件

server:
  port: 8003
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#注意这里使用ribbon实现负载均衡使用的是服务的名字,在eureka管理界面可以看到,Feign在定义接口的时候也会指定服务
MICROSERVICECLOUD-USER:
  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

Feign定义接口

/**
 * @version Version: 1.0
 * @date DateTime: 2018/09/12 19:47:00<br/>
 */
//向哪个微服务进行面向接口feign的编码
@FeignClient(value = "MICROSERVICECLOUD-USER")
public interface UserService {

    @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    String add(User user);

    @RequestMapping(value="/user/get/{name}",method=RequestMethod.GET)
    User get(@PathVariable("name") String name);

    @RequestMapping(value="/user/list",method=RequestMethod.GET)
    List<User> list();

    @RequestMapping(value = "/user/discovery",method = RequestMethod.GET)
    List<ServiceInstance> discover();
}

启动类配置@EnableFeignClients

启动类不要忘记配置@EnableFeignClients注解,否则启动会报错。

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

创建Controller调用Feign服务

可以看到定义好接口后我们就能调用,而不用使用RestTemplate还需要各种拼接,Feign调用也非常简洁明了。


/**
 * @version Version: 1.0
 * @date DateTime: 2018/08/15 20:57:00<br/>
 */
@RestController
@RequestMapping("/consumer/user")
public class UserControllerConsumer {
    @Autowired
    private UserService userService;

    @RequestMapping("/add")
    public String add(User user){
        return userService.add(user);
    }
    @RequestMapping("/get/{name}")
    public User get(@PathVariable("name") String name){
        return userService.get(name);
    }
    @RequestMapping("/list")
    public List<User> list(){
        return userService.list();
    }
}

ribbon负载均衡

这里需要注意的是Ribbon负载均衡可以直接在配置文件中配置,可以使用系统提供的7中负载均衡算法,也可以自定义。自定义负载均衡规则可参考上篇。

#注意这里使用ribbon实现负载均衡使用的是服务的名字,在eureka管理界面可以看到,Feign在定义接口的时候也会指定服务
MICROSERVICECLOUD-USER:
  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

完成以上代码后成功运行后就能正常访问接口了。