本篇文章主要是记录了Feign的使用方式,并且重点讲述了使用Maven构建多模块项目,从而更好地适应微服务架构的软件开发模式。在服务调用的场景中,我们经常调用基于HTTP协议的服务,Feign封装了Http调用流程,更适合面向接口化的变成习惯。Feign底层使用了Ribbon作为负载均衡的客户端,而有关Ribbon的负载均衡的实现请见《RestTemplate与负载均衡器》。
一、Feign基本使用
1、引入依赖
1 | <dependency> |
2、启动类注解
1 |
3、声明伪RPC调用接口(因为本质还是HTTP)
1 | "SHOP-CLIENT") (name = |
4、注入接口对象并使用
1 |
|
使用Feign可以让调用者无感知这是一个远程调用,获得与本地方法一致的体验
二、项目多模块改造
其实多模块改造主要就是为了复用,毕竟让调用者去声明Client端是不合理的,Client应该由服务端声明,也就是我自己知道自己提供了哪些服务,别人来使用这些服务即可,而不是别人看我的源代码才知道我提供哪些接口。另外像接口输入参数,输出参数也都是需要为调用者提供的。
商品服务有两个功能:查看所有商品、新增商品,商品在数据库中的定义如下:
1 |
|
分别是商品ID、商品名称、商品库存等字段,我们需要给外界展示的是ID和名称,库存多少是没有必要展示费消费者的。同样的对于商城的管理系统来说,如果要添加新的商品,那么主键ID是没有必要让用户手动传入的,所以对于这两种情况分别就是此服务模块的输入参数和输出参数,分别定义对应的JavaBean:
1 |
|
并且将这两个类放到shop-common模块中,作为商品服务的通用模块。接下来是逻辑的编写,应该放到shop-serivce模块中,shop-service和我们平时的SpringBoot工程无区别,实现的都是主体业务逻辑:
1 |
|
同时配置好Eureka,在application.yml中:
1 | server: |
最后需要把服务提供暴露给外界使用,所以直接使用Feign来完成shop-client模块的编写:
1 | "SHOP-CLIENT") (name = |
通过上面的代码我们不难发现,项目被分成了三个模块,分别是shop-common、shop-service和shop-client,他们之间的依赖关系如下图所示:
所以,接下来介绍一下1个大工程的pom文件和3个小模块的pom文件,首先是父工程的pom文件:
1 |
|
父工程的还是基于SpringBoot,另外包含了一些公用配置,包含SpringCloud的版本等信息,还包含了公用模块的依赖。接下来看看shop-service模块:
1 |
|
这个模块和我们之前写的工程一致,各种必要的依赖(不要忘记公用模块shop-common),编译插件、SpringBoot插件。最后需要看的是shop-client模块,因为这个模块相当于是整个系统的使用手册:
1 |
|
因为这个模块用到了@FeignClient(name = “SHOP-CLIENT”)、@GetMapping(“/shop/show”)、@PostMapping(“/shop/create”)等注解,所以需要引入spring-web、spring-cloud-openfeign-core等依赖,同样的公用模块需要引入,所以加上了shop-common这个模块的依赖。最后是shop-common的pom文件 :
1 |
|
其实就是引入了一个lombok,没啥其他的东西。
那么别的模块如何使用shop-server这个工程提供的服务呢?下面是一个order-server即订单服务。它也是一个多模块的项目,分为order-common、order-client、order-service。只是为了测试所以,order-common与order-client模块都是空的,我们直接使用order-service模块测试一下即可:
1、引入依赖
1 |
|
2、添加注解,其实就是为了把FeignClient给添加到IOC容器中
1 |
|
3、使用其他(shop-client)模块的FeignClient
1 |
|
完整的代码请见:
https://github.com/zouchanglin/practic_code/tree/master/maven_test
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/2020/06/16/3179346459.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!