[Spring Cloud] OpenFeign 模块化实战

由于 feign 客户端和服务提供者的 controller 代码非常相似 ; 以下分为两种简化方式

分为继承和抽取两种方式

feign 继承方式

① 创建一个 product-api module

接口放在一个公共的 jar 包中 , 供服务提供方和服务消费方使用

注意 : 一定要删除 新创建 modle 的启动类和 properties 配置文件 ; 否则服务注册中心(nacos) 会使用 product-api 的服务 , 导致无法正常使用

② 引入依赖

product-api 引入依赖

java 复制代码
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>

父工程中引入依赖

<module> product-api </module>

③ 将 ProductAPI 复制到 模块中

④ 打 jar 包

为了让别的子项目使用公共代码

⑤ 在需要使用公共模块的项目中引入依赖

需要替换掉 systemPath

java 复制代码
<dependency>
    <groupId>com.boop</groupId>
    <artifactId>product-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>system</scope>            
    <systemPath>C:\Users\22374\.m2\repository\com\boop\product-api\0.0.1-SNAPSHOT\product-api-0.0.1-SNAPSHOT.jar</systemPath>  
</dependency>

如果报错就用

java 复制代码
<dependency>
    <groupId>com.boop</groupId>
    <artifactId>product-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

⑥ 微调代码

  1. 服务提供方(ProductController )继承 ProductInterface
  2. 服务消费方(ProductAPI) 继承继承 ProductInterface
  3. 然后处理 关于 models 的报错信息

⑦ 测试

http://127.0.0.1:9096/feign/o2

Feign 抽取方式

① 同样是创建一个 product-api module 并导入依赖

<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-openfeignartifactId> dependency>

注意 : 一定要删除 新创建 modle 的启动类和 properties 配置文件 ; 否则服务注册中心(nacos) 会使用 product-api 的服务 , 导致无法正常使用

② 复制 ProductAPI 和 ProductInfo 到product-api 并打包(install)

③ 在需要使用共同代码的项目中导入依赖(刚刚打好的包)

并且删除 ProductAPI 和两个 ProductInfo

<dependency> <groupId>org.examplegroupId> <artifactId>product-apiartifactId> <version>1.0-SNAPSHOTversion> dependency>

④ 微调代码

导入并使用我们添加依赖的包

⑤ (bug)无法找到 ProductAPI 的 bean

这与扫描路径有关 , 需要指定扫描路径

解决方法 1

在 EnableFeignClients 添加 basePackages 属性为 api 的路径

@EnableFeignClients(basePackages = {"com.boop.productapi.api"})

解决方法 2

添加 clients 属性为类名.class

@EnableFeignClients(clients = {ProductAPI.class})

⑥ 测试

http://127.0.0.1:9096/feign/o2

服务部署

修改配置为 prod 并打包

由于包含第三方的 jar 包 , 需要服务从本地读取

清理 nacos 数据
启动服务
测试