SpringBoot使用Feign调用其他服务接口

使用SpringCloud的Feign组件能够为服务间的调用节省编码时间并提高开发效率,当服务本身不复杂时可以单独将该组件拿出使用。

引入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-openfeign</artifactId>
 <version>2.0.4.RELEASE</version>
</dependency>

引入SpringBoot打包的Feign依赖,需要注意的是Feign的版本与SpringBoot版本的对应关系,老版本的Feign并不叫openfeign。由于我是用的SpringBoot版本是2.0x,所以openfeign使用了2.0x版本,若使用诸如2.1x或其他高版本的openfeign,在项目启动时会报“抽象方法错误”这类的异常。

编写接口作为服务调用入口

import com.bhz.demo.client.domain.req.ProductReceiveReq;
import com.bhz.demo.client.domain.resp.MemberPointBaseResp;
import com.bhz.demo.client.domain.resp.UserPointResp;
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;

/**
 * @Author guomz
 * @create 2021/3/15 14:50
 */
@FeignClient(url = "www.123.com", name = "demoClient")
public interface DemoClient {

  @RequestMapping(value = "/demo/user/{uuid}/{name}", method = RequestMethod.GET)
  DemoBaseResp<DemoUserResp> getUser(@PathVariable("uuid") String uuid, @PathVariable("name") String name);

  @RequestMapping(value = "/demo/buy", method = RequestMethod.POST)
  DemoBaseResp buyProduct(DemoBuyReq req);
}

Feign的服务调用编写类似mybatis的dao接口,接口上方需要标注@FeignClient注解,该注解有url、name、value三个重要参数。其中name与value等效,必须填写一个。在微服务环境下name或value填写用于被注册中心发现的服务名,例如调用的用户服务叫userService则此处填写userService,此使url可以不填写,因为已经指定了调用方。url则是直接指定服务的全路径,若同时填写url与name,则以url为准,name便被当作当前客户端的名称。

上面的示例并不属于复杂的微服务环境,所以采用直接指定url来调用其他服务。

方法定义上与controller基本一致,需要注意post方法不能传递多个参数,需要用map或对象进行封装。

调用服务

@Service
@Slf4j
public class DemoService {
 @Autowired
 private DemoClient demoClient;
 public void getUser(Long id){
    demoClient.getUser("123", "abc");
 }
}

在需要调用其他服务的模块中引入之前定义的接口即可。

关于调用https接口

调用https接口时会进行证书校验,若没有证书则会抛出No subject alternative names present异常,可以使用以下代码来绕过证书校验:

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon -->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
 <version>2.0.4.RELEASE</version>
</dependency>

首先需要引入Ribbon依赖,在绕过证书的代码中存在一些需要被注入的类属于Ribbon。Ribbon的引入同样需要注意版本问题。

import feign.Client;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
/**feign client配置
 * @Author guomz
 * @create 2021/3/16 9:52
 */
 @Configuration
public class FeignConfiguration {

/**
 * 调用https接口时绕过ssl证书验证
 * @param cachingFactory
 * @param clientFactory
 * @return
 * @throws NoSuchAlgorithmException
 * @throws KeyManagementException
 */
 @Bean
 @ConditionalOnMissingBean public Client feignClient(@Qualifier("cachingLBClientFactory") CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
    SSLContext ctx = SSLContext.getInstance("TLSv1.2");
    X509TrustManager tm = new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
          }
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
          }
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
         }
    };
    ctx.init(null, new TrustManager[]{tm}, null);
    return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(), new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession sslSession) {
            return true;
    }
        }),
    cachingFactory, clientFactory);
   }
}

之后是Feign的配置类,用来绕过https证书校验。

到此这篇关于SpringBoot使用Feign调用其他服务接口的文章就介绍到这了,更多相关SpringBoot Feign调用服务接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot如何使用feign实现远程接口调用和错误熔断

    这篇文章主要介绍了SpringBoot如何使用feign实现远程接口调用和错误熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.第一步,新建两个简单的springboot项目并创建rest接口 demo系统的rest接口 plus系统的调用接口 2.在项目pom文件里导入feign和hystrix的pom依赖包 <properties> <java.version>1.8</java.version> <s

  • SpringBoot使用Feign调用其他服务接口

    使用SpringCloud的Feign组件能够为服务间的调用节省编码时间并提高开发效率,当服务本身不复杂时可以单独将该组件拿出使用. 引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId>

  • 使用Feign调用第三方http接口

    目录 Feign调用第三方http接口 下面就来演示一下 原生Feign调用第三方接口 引入依赖 写接口 使用 深入理解 Feign调用第三方http接口 我们平常在开发的时候,经常会碰到调用第三方的接口,这个时候我们可以使用httpClient或者restTemplate,但是这两种方式相比较与Feign调用,都会麻烦一点儿. Feign是声明式服务调用客户端,既规范又简洁,帮我们屏蔽了http调用的复杂性,而且完美切入springcloud技术体系. 下面就来演示一下 使用Feign来调用第

  • Springboot HTTP如何调用其他服务

    目录 HTTP如何调用其他服务 1.GET请求 2.POST请求 springboot请求其他服务器的http接口 使用Get方式,携带headers请求数据 使用Post方式,携带body请求数据 HTTP如何调用其他服务 1.GET请求 1.1Client代码 import com.alibaba.fastjson.JSON; import org.springframework.stereotype.Service; import org.springframework.web.clien

  • feign 调用第三方服务中部分特殊符号未转义问题

    目录 调用第三方部分特殊符号未转义 1.问题发现过程 2.解决办法 3.疑问 @RequestParams&符号未转义 feign-core版本 源码分析 测试 解决方案 调用第三方部分特殊符号未转义 开发过程中,发现+(加号)这个符号没有转义,导致再调用服务的时候把加号转义成空格了.导致后台获取到的数据会不正确. 1. 问题发现过程 feign 解析参数的时候,使用的标准是 RFC 3986,这个标准的加号是不需要被转义的.其具体的实现是 feign.template.UriUtils#enc

  • 基于springboot服务间Feign调用超时的解决方案

    解决springboot服务间Feign调用超时问题概述 1.起因 在完成项目功能需求的开发,经过自己测试以及通过测试组测试通过后,昨晚正式部署到线上环境进行正式运行前的最后一次的测试.但是在测试中,由A服务调用B服务接口时,***通过Feign调用(其实就是http请求,当A服务调用B服务时,如果不配置超时时间,那么A发出请求后,B应该立即响应,否则A服务会认为B已经断开连接)出现***连接超时的错误,错误信息:Read timed out- 2.原因 用idea开发debug模式调试代码时,

  • SpringCloud超详细讲解Feign声明式服务调用

    目录 入门案例 @FeignClient注解详解 Feign Client的配置 Feign请求添加headers 负载均衡 (Ribbon) 容错机制 Hystrix支持 Sentinel支持 Feign开启容错机制支持后的使用方式 请求压缩feign.compression 日志级别 入门案例 在服务消费者导入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>

  • Feign调用全局异常处理解决方案

    异常信息形如: TestService#addRecord(ParamVO) failed and no fallback available.: 对于failed and no fallback available.这种异常信息,是因为项目开启了熔断: feign.hystrix.enabled: true 当调用服务时抛出了异常,却没有定义fallback方法,就会抛出上述异常.由此引出了第一个解决方式. 解决方案: 自定义Feign解析器: import com.alibaba.fastj

  • Feign调用中的两种Header传参方式小结

    目录 Feign调用中的两种Header传参方式 在请求拦截器中统一配置 通过@RequestHeader注解 调用feign接口时,如何往header中添加参数 总结 Feign调用中的两种Header传参方式 在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端. 我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spri

  • Spring-cloud-eureka使用feign调用服务接口

    Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下 基于spring-boot 2.0以上版本完成的微服务架构 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE<

  • 从零开始学springboot整合feign跨服务调用的方法

    介绍 微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢? 答案是肯定的,feign就提供了轻便的方式! 如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,**feign + nacos**会帮你做剩余的事. 如果没有注册中心, 也无需担心, feign一样可以以传统的 ip:port 方式进行调用~ 下面,我们来实践下吧 springboot整合feign 引入依

随机推荐