当前位置: 移动技术网 > IT编程>开发语言>Java > java使用Feign实现声明式Restful风格调用

java使用Feign实现声明式Restful风格调用

2019年07月19日  | 移动技术网IT编程  | 我要评论

一、feign简介

feign是netflix开发的声明式、模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们更加优雅的调用服务提供者的api。feign自身支持springmvc,还整合了eureka、ribbon,极大的简化了feign的使用。就整合euraka而言,只需和普通的服务配置eureka server的信息即可。整合ribbon,就意味着不再需要通过标注@loadbalanced的实例化后的resttemplate去调用服务提供者方法了。feign只需通过简单的定义一个接口即可实现负载均衡。

二、在服务消费者中使用feign

1、添加feign依赖

<dependency>
  <groupid>org.springframework.cloud</groupid>
  <artifactid>spring-cloud-starter-feign</artifactid>
</dependency>

2、创建一个feign接口,并在头部加上@feignclient注解

import com.simons.cn.util.commonresult;
import org.springframework.cloud.netflix.feign.feignclient;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
import org.springframework.web.bind.annotation.requestparam;
 
@feignclient(name = "user-provider")
public interface userfeignservice {
 
  @requestmapping(value = "/getuserinfo",method = requestmethod.get)
  commonresult getuserbyname(@requestparam(required = false,value = "name") string name);
 
}

这里的name="user-provider" 会被解析为注册到eureka server上的其中一个客户端,换句话说就是注册到eureka中的其中一个服务,利用它可以实现负载均衡。也可以结合value来指定@feignclient(name="user-provider",value = "http://localhost:8000/")

3、修改controller,不再调用@loadbalanced标注的resttemplate,而是通过标注@feignclient的自定义接口

import com.simons.cn.userfeignservice;
import com.simons.cn.util.commonresult;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.restcontroller;
 
@slf4j
@restcontroller
public class ticketfeigncontroller {
 
  @autowired
  private userfeignservice userfeignservice;
 
  @getmapping("/ticketpurchase")
  public commonresult purchaseticket(@requestparam(required = false,value = "name") string name){
    commonresult result = userfeignservice.getuserbyname(name);
    return result;
  }
 
}

4、修改启动类,头部添加@enablefeignclients注解

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.client.discovery.enablediscoveryclient;
import org.springframework.cloud.netflix.feign.enablefeignclients;
 
@enablefeignclients
@enablediscoveryclient
@springbootapplication
public class ticketconsumerfeignapplication {
 
  public static void main(string[] args) {
    springapplication.run(ticketconsumerfeignapplication.class, args);
  }
}

测试:

启动多个user-provider-eureka服务实例,其配置文件中的application.name=user-provider;

启动discovery-eureka服务实例;

启动ticket-consumer-feign服务实例

如上测试结果可以看到ticket-consumer-feign消费者顺利调用user-provider-eureka服务提供者的方法,并且实现了负载均衡。

三、使用feign构造多参数请求

1、get请求:多个参数就用多个@requestparam标注几个

@feignclient(name = "user-provider")
public interface userfeignservice {
 
  @requestmapping(value = "/getuserinfo",method = requestmethod.get)
  commonresult getuserbyname(@requestparam(required = false,value = "name") string name);
 
}

或者用map来封装参数

@feignclient(name="user-provider")
public interface userservicefeign {
  @requestmapping(value = "/getuserinfo",method = requestmethod.get)
  public commonresult getuserbyname(@requestparam map<string,object> map);
}
@restcontroller
public class ticketcontroller {
  @autowired
  private userservicefeign userservicefeign;
 
  @getmapping("ticketpurchase")
  public commonresult (long id, string actid) {
    map map = new hashmap<string, object>();
    map.put("id", id);
    map.put("actid", actid);
    return this.userservicefeign.getuserbyname(map);
  }
}

2、post请求就相对简单的多

// 服务消费者方
@feignclient(name="user-provider")
public interface userservicefeign {
 
  @requestmapping(value="/getuserbyname",method = requestmethod.post)
  public commonresult getuserbyname(@requestbody user user);
 
}
//服务提供者
@slf4j
@restcontroller
public class usercontroller {
 
  @autowired
  private userserviceimpl userservice;
 
  @getmapping(value = "/getuserinfo")
  public commonresult getuserinfo(@ruquestbody user user){
    list<user> userlist = userservice.getuserbyname(user.getname());
    return commonresult.success(commonenum.sucess.getcode(), commonenum.sucess.getmessage(),userlist);
  }
}

项目的github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网