OpenFeign是什么?

OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。

OpenFeign能干啥?

  • OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
  • OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。

OpenFeign使用

使用OpenFeign之前,我们首先将之前的工程还原,为了操作简单,我们只采用单节点的eureka。

API服务模块搭建

由于我们使用openfeign之后,需要暴露相关接口给外部服务,所以我们需要写一个api服务。

我这里为了方便所以直接在外部创建了一个ms-service-api服务,实际开发过程中我们基本都是将其写在对应的模块中。

整体模块创建完成后,我们便可以定义相关接口供外部调用了,每个服务一一对应即可。

这里只演示一个goods-service-api项目的搭建,项目代码在文末会给出。

引入依赖

引入 open feign的相关依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建接口

这里对应的是goods-service项目中的GoodsService类,这里定义了其中的方法。

public interface IGoodsService {
    @GetMapping("/goods")
    String getGoodsById();
}

这个时候还需要将goods-service项目的类继承该接口:

首先需要将我们创建的api服务依赖添加到项目中:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>goods-service-api</artifactId>
</dependency>

然后开始修改:

@Slf4j
@RestController
public class GoodsService implements IGoodsService  {

    @Value("${server.port}")
    private String port;

    /**
     * 根据ID查询商品信息
     *
     * @return
     */
    @GetMapping("/goods")
    public String getGoodsById() {
        log.info("收到请求,端口为:{}", port);
        return "返回商品信息";
    }
}

这里为了区分职责,类似我们写mapper和service这种,又额外写了一个对外暴露的接口。

FeignClient中的name不能随意写,它对应各个服务在eureka中注册的名字。如果不写该接口的话,可以将该注解加在IGoodsService上。

@FeignClient(name = "goods-service")
public interface IGoodsServiceFeignClient extends IGoodsService {
}

以上便是一个api服务的搭建过程。

外部调用

当我们的API服务调用完成之后,如何在聚合服务中调用呢?

首先我们需要在聚合服务中引入openfeign以及各api服务的依赖:

<!--        open fiegn-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>goods-service-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>marking-service-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>order-service-api</artifactId>
        </dependency>

引入相关依赖后,我们就可以不需要之前的代码了,全面采用面向接口的形式来开发。

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {

    // 代理对象
    @Autowired
    private IGoodsService goodsService;

    @Autowired
    private IPromotionService promotionService;

    @Autowired
    private IOrderService orderService;

    @GetMapping
    public String order() {
        log.info("begin do order");
//        使用openfiegn
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }
}

这个时候还没有完全结束,我们还需要在启动类上配置扫码相关的feign类。

@EnableFeignClients(basePackages = "com.example.feignclient")
@SpringBootApplication
public class MallProtalApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProtalApplication.class, args);
    }
}

以上便是我们集成openfeign的全部步骤。

项目代码

cloud-demo

OpenFeign相关特性

  • Gzip压缩
  • Looger
  • 底层通信框架:(sun.net.www.protocol.http.HttpURLConnection)
  • 也可以自定义替换为OKHttp

Logger 日志使用

使用OpenFeign的日志功能,我们需要进行如下几个操作:

创建配置类

@Configuration
public class FeignClientLogConfiguration {

    /**
     * NONE
     * BASIC
     * HEAD
     * FULL
     * @return
     */
    @Bean
    Logger.Level feignLogger(){
        return Logger.Level.FULL;
    }
}

指定配置类

@FeignClient(name = "goods-service",configuration = FeignClientLogConfiguration.class)
public interface IGoodsServiceFeignClient extends IGoodsService {

}

最后还需要在聚合服务出添加相关日志配置

feignclient所在的路径

# openfeign 日志
logging.level.[com.example.feignclient]=DEBUG

使用OKHttp通信

引入依赖

<!--        ophttp-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>

修改配置

# openfeign替换底层通信框架
feign.httpclient.enabled=false
feign.okhttp.enabled=true

到此这篇关于Spring Cloud OpenFeign模版化客户端的文章就介绍到这了,更多相关Spring Cloud OpenFeign客户端内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Spring Cloud OpenFeign模版化客户端搭建过程的更多相关文章

  1. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

  2. Spring Batch批处理框架操作指南

    Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作,这篇文章主要介绍了Spring Batch批处理框架操作指南,需要的朋友可以参考下

  3. Spring详细讲解@Autowired注解

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入

  4. 使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. PHP获取真实客户端的真实IP

    本文主要介绍了PHP获取真实客户端的真实IP(REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR)的方法,具有很好的参考价值。下面跟着小编一起来看下吧

  6. Spring Security认证器实现过程详解

    一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制,这篇文章主要介绍了Spring Security认证器实现过程,需要的朋友可以参考下

  7. spring学习JdbcTemplate数据库事务管理

    这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. Spring Boot 集成Redisson实现分布式锁详细案例

    这篇文章主要介绍了Spring Boot 集成Redisson实现分布式锁详细案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

  9. 详解OpenFeign服务调用(微服务)

    OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等,这篇文章主要介绍了OpenFeign服务调用的相关知识,需要的朋友可以参考下

  10. Spring Security实现接口放通的方法详解

    在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦。本文将通过一个注解的方式快速实现接口放通,感兴趣的可以了解一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部