在最近做的项目中,由于之前做的各个服务都是相互独立的,但是业务要求调用其他已做好的服务的功能,于是就有了正在做的项目调用已经上线的服务的需求。
一、背景描述
新开发的大脑管理平台(微服务A),由于需要调用控制引擎中心(微服务B)的接口,也就是服务A写个接口调用服务B,不需要做任务业务逻辑,即透传给服务B,服务B的接口为机器人测试对话聊天功能。由于这两个是独立的服务,相互之前没有关联性,所以会牵出一个问题?这服务A怎么调用服务B。
微服务A、微服务B,两个服务的项目结构如下:
二、配置方法
2.1 添加maven依赖
对于spring boot 2.0.0版本以上的,引用openfeign
1. <!--引入feign--> 2. <dependency> 3. <groupId>org.springframework.cloud</groupId> 4. <artifactId>spring-cloud-starter-openfeign</artifactId> 5. <version>2.0.2.RELEASE</version> 6. </dependency>
在infrasture 目录中的 pom.xml 文件中添加 对微服务B的引用
1. <!-- 控制引擎服务 --> 2. <dependency> 3. <groupId>com.iot</groupId> 4. <artifactId>back-control-engine-api</artifactId> 5. <version>1.0-SNAPSHOT</version> 6. </dependency>
2.2 启动类上添加@EnableFeignClients注解
在服务A的启动类上添加@EnableFeignClients注解,使得该服务支持FeignClients功能。
@Slf4j @SpringBootApplication(scanBasePackages = {"com.iot"}) @EnableDiscoveryClient @EnableFeignClients(basePackages = "com.iot") @MapperScan("com.iot.back.brain.platform.tunnel.database") public class MainServer implements ApplicationRunner { public static void main(String[] args) { try { SpringApplication.run(MainServer.class, args); } catch (Exception e) { log.error("大脑管理平台项目启动失败!报错原因 ============== ", e); } } @Override public void run(ApplicationArguments args) throws Exception { log.info("恭喜你,大脑管理平台成功启动啦..."); } }
2.3 配置文件application-local.yml中添加路径
配置文件中添加如下配置,然后在类中通过 @FeignClient 注解获取
以下是 application-local.yml 配置文件中的配置内容(application-dev.yml、application-chk.yml、application-prod.yml 文件中也需要配置上):
##################### 其他微服务 ##################### feign: services: controlEngine: back-control-engine #控制引擎服务
2.4 微服务A中添加微服务B的接口
建一个包用于存放 feign 接口,放哪个目录下,没有强制规定
2.5 调用此接口
把这个接口当成本项目中的一个接口类正常注入调用即可。如图所示:
拓展:另外一种调用方式也可供参考
【Java用法】微服务之间的相互调用方式之一,通过FeignClient客户端调用其他微服务的方法
完结!