目录
1.OpenFeign最佳实践
@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {
@RequestMapping("/{productId}")
ProductInfo getProductById(@PathVariable("productId") Integer productId);
}
服务提供方Controller:
@RequestMapping("/product")
@RestController
public class ProductController {
@RequestMapping("/{productId}")
public ProductInfo getProductById(@PathVariable("productId") Integer productId){
//...
}
}
有没有一种方法可以简化这种写法呢?
1.1Feign继承方式
Feign支持继承的方式,我们可以把一些常见的操作封装到接口里
我们定义好一个接口,由服务提供方实现,消费方编写Feign接口时,直接继承这个接口
具体参考:Spring Cloud OpenFeign Features :: Spring Cloud Openfeign
1.1.1创建一个Module
接口可以放在一个公共的Jar包里,供服务提供方和服务消费方使用
1.1.2引入依赖
<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>
1.1.3编写接口
复制ProductApi,ProductInfo到product-api模块中
import com.example.productapi.model.ProductInfo;
import org.springframework.web.bind.annotation.*;
public interface ProductInterface {
@RequestMapping("/{productId}")
ProductInfo getProductById(@PathVariable("productId") Integer productId);
}
目录结构如下:
1.1.4打Jar包
通过Maven的install打包
观察本地Maven仓库,Jar包是否打包成功
1.1.5服务提供方实现接口
@RequestMapping("/product")
@RestController
public class ProductController implements ProductInterface {
@Autowired
private ProductService productService;
@RequestMapping("/{productId}")
public ProductInfo getProductById(@PathVariable("productId") Integer productId){
return productService.selectProductById(productId);
}
}
1.1.6服务消费方继承接口
服务消费方继承ProductInterface
@FeignClient(value = "product-service",path = "/product")
public interface ProductApi extends ProductInterface {
}
1.1.7测试
测试远程调用:http://127.0.0.1:8080/feign/1001
1.2Feign抽取方式
官方推荐Feign的使用方式为继承的方式,但在企业开发中,更多的是把Feign接口抽取作为一个独立的模块,其做法与继承类似,但是理念不同
操作方法:
将Feign的Client抽取作为一个独立的模块,并把涉及到的实体类等都放在这个模块中,打成一个Jar包,服务消费方只需要依赖该Jar包即可,Jar包通常由服务提供方实现
1.2.1创建一个Module
1.2.2引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2.3编写API
复制ProductApi,ProductInfo到product-api模块中
1.2.4打Jar包
通过Maven打包
1.2.5服务消费方使用product-api
1.删除ProductApi、ProductInfo
2.引入依赖
<dependency>
<groupId>org.example</groupId>
<artifactId>product-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
修改项目中ProductApi、ProductInfo的路径为product-api的路径
3.指定扫描类:ProductApi
在启动类添加扫描路径
@EnableFeignClients(basePackages = {"com.bite.api"})
完整代码如下
@EnableFeignClients(basePackages = {"com.productapi.api"})
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
也可以指定需要加载的Feign客户端
@EnableFeignClients(clients = {ProductApi.class})
1.2.6测试
测试远程调用: http://127.0.0.1:8080/order/1
2.服务部署
1.修改数据库,Nacos等相关配置
2.对两个服务进行打包
Maven打包默认是从远程仓库下载的,product-api这个包在本地,有以下解决方案:
- 上传到Maven中央仓库
- 搭建Maven私服,上传Jar包到私服
- 从本地读取Jar包(推荐)
这里咱们使用第三种方式
修改pom文件
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>product-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>D:/JavaWebSource/mvn_repository/com/example/product-api/0.0.1-SNAPSHOT/product-api-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
其中systemPath是本地的Jar包路径