介绍
微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢?
答案是肯定的,feign就提供了轻便的方式!
如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,** feign + nacos **会帮你做剩余的事.
如果没有注册中心, 也无需担心, feign一样可以以传统的
ip:port
方式进行调用~
下面,我们来实践下吧
springboot整合feign
引入依赖, 这里注意, spring-cloud.version记得要和spring-boot版本匹配, 我这里spring-boot版本是2.1.3, 所以spring-cloud选择Greenwich.SR2版本.
大致的版本对应关系如下
更详细的请去https://start.spring.io/actuator/info
查询!
然后我们去项目的启动类上加上注解
@EnableFeignClients
最后, 加上Feign的配置
application.properties
spring-boot整合feign完成, 接下来我们编写测试代码
测试代码
两个服务
sb-alibaba-nacos (被调用方服务, 127.0.0.1:8081), 提供 getInfoById接口 sb-feign (调用方服务, 127.0.0.1:9999), 提供 getInfoById 测试接口sb-alibaba-nacos提供的测试接口
@GetMapping ( value = "getInfoById" ) public String getInfoById ( @RequestParam ( value = "id" ) Long Id ) { return "example-service return :" + Id ; }sb-feign相关代码
我们新建个包 feign,用来放所有涉及跨服务调用的类
ExampleControllerFeignClient.java:
package com . mrcoder . sbfeign . feign ; import feign . hystrix . FallbackFactory ; import org . slf4j . Logger ; import org . slf4j . LoggerFactory ; import org . springframework . cloud . openfeign . FeignClient ; import org . springframework . stereotype . Component ; import org . springframework . web . bind . annotation . GetMapping ; import org . springframework . web . bind . annotation . RequestParam ; @FeignClient ( name = "sb-alibaba-nacos" , url = "http://127.0.0.1:8081/" , fallbackFactory = ExampleControllerFeignClient . ExampleControllerFeignClientFallbackFactory . class ) public interface ExampleControllerFeignClient { @GetMapping ( value = "getInfoById" ) String getInfoById ( @RequestParam ( value = "id" ) Long Id ); /** * 服务降级内部类 */ @Component class ExampleControllerFeignClientFallbackFactory implements FallbackFactory < ExampleControllerFeignClient > { private Logger logger = LoggerFactory . getLogger ( ExampleControllerFeignClientFallbackFactory . class ); @Override public ExampleControllerFeignClient create ( Throwable cause ) { return new ExampleControllerFeignClient () { @Override public String getInfoById ( Long signingLogId ) { logger . error ( "跨服务调用失败, 原因是:" + cause . getMessage ()); return "失败, 原因是:" + cause . getMessage (); } }; } } }关键代码就是
@FeignClient ( name = "sb-alibaba-nacos" , url = "http://127.0.0.1:8081/" , fallbackFactory = ExampleControllerFeignClient . ExampleControllerFeignClientFallbackFactory . class ) name 就是被调用方的服务名称 ( 这里如果你没有配置服务注册中心的化,其实可以随便写 ) url 就是被调用方的地址( 如果配置了服务注册中心, 可以不写!, 不过两个服务必须都注册!,这样才能找到! ) fallbackFactory 就是调用失败时指定的处理类最后, 我们写个测试方法
package com . mrcoder . sbfeign . controller ; import com . mrcoder . sbfeign . feign . ExampleControllerFeignClient ; import org . springframework . beans . factory . annotation . Autowired ; import org . springframework . web . bind . annotation .*; @CrossOrigin @RestController public class TestController { @Autowired private ExampleControllerFeignClient exampleControllerFeignClient ; @RequestMapping ( value = "getInfoById" , method = RequestMethod . GET ) public String test ( @RequestParam ( value = "id" ) Long Id ) { return exampleControllerFeignClient . getInfoById ( Id ); } }开启两个服务sb-alibaba-nacos, sb-feign
而后访问sb-feign的测试方法
http://localhost:9999/getInfoById?id=22
出现
sb-alibaba-nacos return :22
跨服务调用成功~
到此这篇关于从零开始学springboot整合feign跨服务调用的文章就介绍到这了,更多相关springboot整合feign跨服务调用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://blog.csdn.net/mrcoderstack/article/details/109443790
查看更多关于从零开始学springboot整合feign跨服务调用的方法的详细内容...