--- 使用OpenFeign来优雅的对服务进行调用 ---
微服务之间的调用方法通常是俩种:RPC和http
在spring cloud中使用的是http,通常的实现方法有
RestTemplate OpenFeign
RestTemplate在调用的时候,需要把url写死,还要自己拼接url,还是太麻烦了
而OpenFeign就更方便了,他提供了类似于Controller的服务之间的调用方式,能通过直接在代码代码中使用类来调用方法来进行服务之间的交流
OpenFeign 的使用
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
在启动类上加上@EnableFeignClients注解
在调用类中写调用服务api接口类
对于api类,value表示的的是服务的名字,path是接口的固定路径
他最终的调用提供者的请求url就是这样
完整 URL: http://[240e:398:5dab:d050:562c:179f:4f04:efaa]:8081/product/o4?msg=ro
[240e:398:5dab:d050:562c:179f:4f04:efaa]:8081 这一段是消费者从nacos中获取到的value对应的消费者的ip地址和端口号
而path就对应了 /product
RequestMapping对应的是 /o4
?msg=ro这一段就是通过注解@RequestParam来拼接上的参数msg,若有多个参数也是相同的写法
对应的服务接口
使用openfeign传递多个参数
RequestBody只能有一个而RequestParam可以有多个
消费者接口
openfeign的最佳实践
一 将接口单独提到一个模块中,并将这个模块作为jar下载到本地maven仓库,要使用时添加maven依赖,服务提供者重写接口方法,服务消费者继承这个接口并调用方法
创建一个maven项目,需要导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>
将接口写好之后,点maven工具中的install将这个项目作为jar包储存到本地maven仓库中,出现success就成功了,success上的时这个jar包的位置
服务消费者
导入这个jar包的依赖 直接输入jar包类名字他能自动补全 这个version就对应了pom中的
<version>1.0-SNAPSHOT</version> 标签
<dependency><groupId>org.example</groupId><artifactId>bestUse1</artifactId><version>1.0-SNAPSHOT</version> </dependency>
继承接口
使用接口
服务提供者
引入依赖
<dependency><groupId>org.example</groupId><artifactId>bestUse1</artifactId><version>1.0-SNAPSHOT</version> </dependency>
实现接口ServerApi
再启动项目调用就行了
二 也可以将
@FeignClient(value = "product-server", path = "/product")
也可以将这段也在接口类中,要导入 openfeign依赖
这样再服务消费者使用时,可以直接使用这个接口,
这段就不需要写了
修改接口 添加上了
@FeignClient(value = "hadage-product",path = "b2") 和依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
服务提供者
服务消费者
启动就行
如果再注入的时候发现爆红线了,那说明时
@EnableFeignClients()
默认的扫描路径没有扫到这个FeignClient类,那么可以修改他的扫描方式
@EnableFeignClients(clients = {ServerApi1.class, Api.class, ServerApi1.class, BestUse1.class})
这样就是指定扫描那几个类,还可以使用basePackages来指定包路径
这个路径值得是src.java包下的
再对项目中的本地依赖打包时是,要吧<scope> 修改为system 表示这个依赖不需要从中央仓库中下载,而是再本地搜索 并添加上对应的位置
end~~~ (*´∀`)~♥