下面介绍在SpringCloud中如何使用openfeign实现远程服务调用
1.在字典服务中有这么2个接口
@Api(tags = "数据字典接口")
@RestController
@RequestMapping("/admin/cmn/dict/")
@CrossOrigin
public class DictController {
@Autowired
private DictService dictService;
//根据dictCode和value获取字典名称
@GetMapping("/geDictName/{dictCode}/{value}")
public String getDictName(@PathVariable String dictCode,
@PathVariable String value){
return dictService.getDictName(dictCode,value);
}
//根据value获取字典名称
@GetMapping("/geDictName/{value}")
public String getDictName(@PathVariable String value){
return dictService.getDictName("",value);
}
}
2.其他微服务需要调用字典服务上面2个接口以实现将字典值转变为可识别的中文名称。下面说下实现的步骤:
2.1)在需要远程调用的微服务pom文件中引入依赖:
<!-- 服务调用feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 服务注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.2)写一个interface,远程调用字典服务的2个接口
@FeignClient("service-cmn")
@Repository
public interface DictFeignClient {
@GetMapping("/admin/cmn/dict/geDictName/{dictCode}/{value}")
public String getDictName(@PathVariable("dictCode") String dictCode,
@PathVariable("value") String value);
@GetMapping("/admin/cmn/dict/geDictName/{value}")
public String getDictName(@PathVariable("value") String value);
}
这里需要注意,注解@PathVariable后面需要指明变量名,如@PathVaribale("value")否则会导致找不到(原接口中可不用写)。先用注解@FeignClient("service-cmn")指定要远程调用的微服务名,其次使用@Repository注解防止引用时红线警告,不写不影响正常使用。
2.3)在启动类上加上注解@EnableFeignClients(basePackages = "com.www"),开启远程调用,并指明扫描的包类
@SpringBootApplication
@MapperScan(basePackages = "com.www.hosp.mapper")
@ComponentScan(basePackages = "com.www")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.www")
public class ServiceHospApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHospApplication.class,args);
}
}
保障能实现远程调用的前提条件:这2个服务在注册中心完成注册,并且服务能正常访问。
如此并可实现远程调用其他微服务。