欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-24 11:12:04
一、feign简介 feign是netflix开发的声明式、模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们更加优雅的调用服务提供者的a...

一、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

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