案例:

假设某电商平台日常订单业务中,为保证每一笔订单不会超卖,在创建订单前订单服务(order-service)首先去仓储服务(warehouse-service)检查对应商品 skuId(品类编号)的库存数量是否足够,库存充足创建订单,不存不足 App 前端提示“库存不足”

思考分析:

需要创建服务提供者(仓储服务warehouse-service),然后创建服务消费者(订单服务 order-service),考虑代码的复用性,将openFeign api的接口抽取到一个公共模块,由消费者按需引入,这里订单服务需要引入(openfeign-api模块),openfeign的集成配置尽量按照实际生成的场景配置(大概模拟),实际生产环境中,根据真实的业务需求进行配置调整,这里给的只是大部分实际用到相关配置的,因业务不同而自行调整

show-me-code

父类的maven依赖

    <properties><java.version>1.8</java.version><spring-boot.version>2.4.4</spring-boot.version><spring-cloud.version>2020.0.2</spring-cloud.version><spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build><dependencyManagement><dependencies><!-- spring boot 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

1、仓储服务的创建

​ maven依赖配置

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

引入application.yml配置文件:

server:port: 8786spring:application:name: warehouse-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
feign:compression:request:# 压缩支持的MIME类型mime-types: text/xml,application/xml,application/json# 开启请求数据的压缩功能enabled: true# 数据压缩下限  1024标识传输数据大于1024 才会进行数据压缩(最小压缩值标准)min-request-size: 1024# 开启响应数据的压缩功能response:enabled: trueokhttp:enabled: true

备注:因为该服务提供者没有用到feign调用,相关的feign配置可以去掉,若需要,则按需引入并启用Feign

仓储服务的业务代码:

微服务的启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class WarehouseServiceApplication {public static void main(String[] args) {SpringApplication.run(WarehouseServiceApplication.class, args);}
}

实体类设计:

public class Stock {private Long skuId; //商品品类编号private String title; //商品与品类名称private Integer quantity; //库存数量private String unit; //单位private String description; //描述信息//带参构造函数public Stock(Long skuId, String title, Integer quantity, String unit) {this.skuId = skuId;this.title = title;this.quantity = quantity;this.unit = unit;}public Stock() {}// 省略getter、setter}

业务实体类设计:

@RestController
@RequestMapping("/warehouse")
public class WarehouseController {/*** 查询对应 skuId 的库存状况* @param skuId skuId* @return Stock 库存对象*/@GetMapping("/stock")public Stock getStock(Long skuId){Map result = new HashMap();Stock stock = null;if(skuId == 1101L){//模拟有库存商品stock = new Stock(1101L, "Apple iPhone 11 128GB 紫色", 32, "台");stock.setDescription("Apple 11 紫色版对应商品描述");}else if(skuId == 1102L){//模拟无库存商品stock = new Stock(1101L, "Apple iPhone 11 256GB 白色", 0, "台");stock.setDescription("Apple 11 白色版对应商品描述");}else{//演示案例,暂不考虑无对应 skuId 的情况}return stock;}
}

2、订单服务的创建(在openfeign-api模块后创建)

maven依赖配置

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.springcloud</groupId><artifactId>openfeign-api</artifactId><version>1.1.0</version></dependency></dependencies>

引入application.yml配置文件:

server:port: 8788
warehouse-service: #服务提供者的微服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置对应的负载均衡类spring:application:name: order-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
feign:compression:request:# 压缩支持的MIME类型mime-types: text/xml,application/xml,application/json# 开启请求数据的压缩功能enabled: true# 数据压缩下限  1024标识传输数据大于1024 才会进行数据压缩(最小压缩值标准)min-request-size: 1024# 开启响应数据的压缩功能response:enabled: trueokhttp:enabled: true

openfeign的配置分析:

​ 开启了在创建http请求中对请求数据的压缩功能:feign.request.enabled: true

​ 设置启用数据压缩的最小下限: feign.request.min-request-size: 1024

​ 别忘了开启响应数据的压缩功能:feign.response.enabled: true

​ 启用okhttp作为专用通信组件:feign.okhttp.enabled: true

订单服务的业务代码:

微服务的启动类:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //启用OpenFeign
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

备注:订单服务作为消费者,需要引入openfeign-api模块,并启用OpenFeign ---》 @EnableFeignClients

业务实体类设计:

@RestController
@RequestMapping("/order")
public class OrderController {//利用@Resource将IOC容器中自动实例化的实现类对象进行注入@Resourceprivate WarehouseServiceFeignClient warehouseServiceFeignClient;/*** 创建订单业务逻辑** @param skuId         商品类别编号* @param salesQuantity 销售数量* @return*/@GetMapping("/create_order")public Map createOrder(Long skuId, Long salesQuantity) {Map result = new LinkedHashMap();//查询商品库存,像调用本地方法一样完成业务逻辑。Stock stock = warehouseServiceFeignClient.getStock(skuId);System.out.println(stock);if (salesQuantity <= stock.getQuantity()) {//创建订单相关代码,此处省略//CODE=SUCCESS代表订单创建成功result.put("code", "SUCCESS");result.put("skuId", skuId);result.put("message", "订单创建成功");} else {//code=NOT_ENOUGN_STOCK代表库存不足result.put("code", "NOT_ENOUGH_STOCK");result.put("skuId", skuId);result.put("message", "商品库存数量不足");}return result;}
}

3、openfeign-api模块的创建

maven依赖配置

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.5.RELEASE</version></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId><version>11.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>

openfeign的配置类:

@Configuration
public class OpenfeignConfig {@Beanpublic okhttp3.OkHttpClient okHttpClient() {return new okhttp3.OkHttpClient.Builder()// 读取超时时间.readTimeout(10, TimeUnit.SECONDS)// 连接超时时间.connectTimeout(10, TimeUnit.SECONDS)// 写超时时间.writeTimeout(10, TimeUnit.SECONDS)// 设置连接池.connectionPool(new ConnectionPool()).build();}
}

feign调用的业务参数实体:

public class Stock {private Long skuId; //商品品类编号private String title; //商品与品类名称private Integer quantity; //库存数量private String unit; //单位private String description; //描述信息//带参构造函数public Stock(Long skuId, String title, Integer quantity, String unit) {this.skuId = skuId;this.title = title;this.quantity = quantity;this.unit = unit;}public Stock() {}// 省略getter、setter}

openfeign调用的接口定义:

@FeignClient("warehouse-service")
public interface WarehouseServiceFeignClient {@GetMapping("/warehouse/stock")public Stock getStock(@RequestParam("skuId") Long skuId);
}

ps: 因为是抽取出来的公共模块,需要注册springboot自动配置类

​         在resources目录下,新增 META-INF 目录,然后新增 spring.factories配置文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.springcloud.config.OpenfeignConfig

4、测试结果

库存充足的测试:http://localhost:8788/order/create_order?skuId=1101&salesQuantity=1

库存不足的测试:http://localhost:8788/order/create_order?skuId=1102&salesQuantity=1

5、总结

该项目整合案例,只是基于订单平台的订单业务的模拟,和真实的生产环境还是有一定的差距,openfeign的熔断配置和一些安全限制会更加复杂,这里只是展示了某些重要的配置信息

项目的代码地址:

springcloud-learn: 自建springcloud项目(练习) - Gitee.com

微服务集成OpenFeign(案例分析 -- 实例业务的模拟)相关推荐

  1. rest接口案例_REST和平:微服务与现实案例中的整体

    rest接口案例 by RDX 由RDX REST和平:微服务与现实案例中的整体 (REST in Peace: Microservices vs monoliths in real-life exa ...

  2. 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享

    2019独角兽企业重金招聘Python工程师标准>>> 转载本文需注明出处:EAWorld,违者必究. 引言: 根据保险行业发展趋势,目前保险交易已经呈现高频化.碎片化.场景化等特点 ...

  3. 2021/04/25 SpringBoot + SpringCloud微服务项⽬交付案例

    第1章 SpringBoot + SpringCloud微服务项⽬交付案例 1.1 微服务概念 传统的是用户通过终端链接到应用里 现在服务往越来越小的方向做,把每个服务做成一个独立的功能,每个服务完成 ...

  4. 基于JBoss Fuse 6.2的JBoss BPM微服务集成指南

    今年年初,我们宣布了JBoss BPM Suite令人兴奋的示例项目,该项目围绕一个正在运行的在线Travel Agency项目展开. 最初是利用Web服务,后来我们在JBoss Fuse的帮助下迁移 ...

  5. 微服务集成SkyWalking

    title: 微服务集成SkyWalking date: 2019-11-24 09:59:21 categories: 微服务 tags: SkyWalking 最近做的一个项目使用了Spring ...

  6. 微服务架构设计实践之七:业务架构

    微服务架构设计实践之七:业务架构 原文:微服务架构设计实践之七:业务架构 版权声明: https://blog.csdn.net/beyondself_77/article/details/79842 ...

  7. 微服务架构学习与思考(05):微服务架构适用场景分析

    一.简述 在实际开发中,需要考虑多种因素,来决定采取哪种架构模式才适合当前业务发展情况. 毕竟微服务也不能"包治百病",不要把它当做万能药.企业研发哪里得病了,觉得只要把" ...

  8. SpringCloud学习一(微服务远程调用案例:入门)

    SpringCloud学习一(微服务远程调用案例:入门) 前提:准备两个数据库,并创建数据库表 项目代码路径:ZhongChunle/cloud-demo: 微服务远程调用接口案例 (github.c ...

  9. seata的部署与微服务集成(包含多集群异地容灾配置)

    seata的部署与微服务集成 一.部署Seata的tc-server 1.下载与安装 2.配置文件详细讲解 3.创建数据库表 4.启动 二.微服务集成seata 1.引入依赖 2.修改配置文件 3.启 ...

最新文章

  1. [题解]UVA10054 The Necklace
  2. 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
  3. dsp-asic-fpga
  4. Spring MVC POST中文乱码解决方案
  5. MFC显示位图 from http://blog.csdn.net/liuzhuomju/article/details/7299458
  6. mysql memory_MySQL MEMORY 引擎及性能比对
  7. “李子柒”们的商业模式,到底需不需要微念
  8. yii不能没有提示验证错误信息_安装Mac系统时提示”应用程序副本不能验证 它在下载过程...”的解决方法...
  9. C语言 二叉树顺序存储结构的先序遍历算法
  10. 每日记载内容总结39
  11. codeforce438D The Child and Sequence
  12. 配置多个git账号或多个SSH账号
  13. 阿里星专访丨星罡:因为期待,你需要更出色!
  14. JavaScriptJQ 004_JS闭包
  15. B9 Concurrent 重入锁(ReentrantLock)
  16. SSD 寿命- 三星 Magician 及 CrystalDiskInfo
  17. 视频相似度检测算法软件,视频相似度检测算法图
  18. Android SDK的级别
  19. 处理文档用计算机配置文件,计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的修复方案...
  20. 当年也是翩翩少年,如今落得秃顶大叔,程序员秃顶算工伤吗?

热门文章

  1. SpringCloud之Eureka的常见问题及配置优化
  2. ChatGPT突遭大面积封号,网友应急出解封教程
  3. 如何在Linux环境下实现定时执行PHP的计划任务
  4. jquery 获取客户端ip地址 和 地区位置
  5. 简述外观专利如何申请?
  6. smali语言详解之字段的声明(变量、常量)
  7. [小O地图-数据] - 多条件查询及展示地图POI数据
  8. springboot整合shiro实现权限控制
  9. 九月发布鸿蒙系统吗,华为智慧屏来了:将使用鸿蒙系统和自研芯片 9月发布
  10. vs2008没有64位编译器,不用卸载直接安装X64编译器和工具