使用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调用服务接口内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!