微服务间接口调用 feign

短命女 2023-10-08 22:03 88阅读 0赞

Feign说明

Feign是一种声明式、模板化的HTTP客户端。在spring cloud中使用Feign,可以做到类似于普通的接口的请求调用,可以发现对应的服务的接口,进而直接调用对应服务中的接口。

引入依赖,启动类开启客户端

首先需要在各个微服务中引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

然后在启动类中加入注解@EnableFeignClients ,开启Feign客户端。

在各自的启动类中添加注释:@EnableDiscoveryClient 和 @EnableFeignClients ,并在配置文件中添加各自的服务名,以及配置Nacos的服务地址

  1. //服务A的启动类
  2. @EnableDiscoveryClient //nacos注册
  3. @EnableFeignClients //Feign 服务调用
  4. @SpringBootApplication
  5. public class ApplicationA {
  6. public static void main(String[] args){
  7. SpringApplication.run(ApplicationA.class,args);
  8. }
  9. }
  10. //服务B的启动类
  11. @EnableDiscoveryClient //nacos注册
  12. @EnableFeignClients //Feign 服务调用
  13. @SpringBootApplication
  14. public class ApplicationB {
  15. public static void main(String[] args){
  16. SpringApplication.run(ApplicationB.class,args);
  17. }
  18. }

application.properties

  1. 服务A配置
  2. # 服务端口
  3. server.port=8001
  4. # 服务名
  5. spring.application.name=serviceA
  6. # nacos服务地址
  7. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  8. --------------------------服务B配置-------------------------------
  9. # 服务端口
  10. server.port=8003
  11. # 服务名
  12. spring.application.name=serviceB
  13. # nacos服务地址
  14. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3.在微服务A中创建client包和接口

然后在当前服务内编写Feign接口,接口与普通的controller层类似,只是在类上不需要写@Controller等注解,只需要加上@Component 、 @FeignClient注解即可,下面的请求方法需要写上请求方式(根据提供服务的接口适配)@PostMapping(“/findList”)注解。如下:

  1. @Component
  2. @FeignClient(value = "sso", path = "/api/user", fallback = UserClientHystrix.class)//value是需要调用的服务名称,path是sso服务内的请求路径
  3. //value必选是服务名(就是yaml中server.name)
  4. //path是前缀(就是yaml中server.contentPath)
  5. //fallback是服务熔断的类
  6. public interface UserClient {
  7. /**
  8. * 获取对象集合
  9. * @param object
  10. * @return
  11. */
  12. @PostMapping("/findList")//根据服务适配添加注解
  13. Result<UserDO> findList(@CustomJSONBody Object object);
  14. }
  15. //@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。

在微服务A中创建client包和接口

  1. @Component
  2. @FeignClient("serviceB")
  3. public interface ServiceBClient {
  4. @PostMapping("serviceB/test")
  5. public Result test(@RequestParam String args);
  6. }

注意微服务A(调用者)中ServiceBClient接口中编写的是微服务B中被调用的接口,参数类型方法名要一致。以下时微服务B中被调用的接口(Controller)

  1. 服务B中接口的示例
  2. @RestController
  3. @RequestMapping("serviceB")
  4. @CrossOrigin
  5. public class VodController {
  6. @PostMapping("test")
  7. public void test(@RequestParam String args){
  8. System.out.println(args);
  9. }
  10. }

4.在微服务A中调用服务B的接口

  1. @Autowired
  2. private ServiceBClient serviceBClient ; //首先使用Autowired注解进行Client的自动装配
  3. serviceBClient.test("陈杰");// 对服务B中的额接口进行调用

方法总结

在微服务A中调用服务B中的接口

1.初始化操作:添加依赖,配置等等。。。

2.创建Client接口,使用@GetMapping注解对被调用的微服务进行地址映射。

3.在微服务A中调用Client接口中的方法。

:① 接口层添加注解@FeignClient,并在注解中指明属性value=”服务提供方的实例名”;

② 在方法上添加映射的URL要与服务提供方接口的URL一致;

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读