本文已参与「新人创作礼」活动,一起开启掘金创作之路。
为什么使用feign
背景:公司开发新项目的初期将用户、公告、banner图、行业、计费、产品、订单等等模块都放到了一个工程中。当然这种规划不会影响使用,但是所有模块放到一起看着总会有些许的混乱。考虑到后期订单模块要和其他模块进行解耦,因此项目领导建议将订单模块独立出来单独起一个服务,服务间使用feign远程调用的方式交互.....x
于是准备写demo简单的使用一下
gitee源代码仓库: https://gitee.com/qlglg123/test-feign.git
1.feign客户端服务
该服务是服务的调用方,将远程调用服务提供方的api接口
导入feign的pom依赖
<!-- feign调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
导入nacos及web等相关依赖
<!--SpringMVC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- nacos注册中心依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 监控检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- nacos配置中心依赖支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
启动类上添加开启Fein的注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 开启远程调用
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
创建Feign的客户端接口
@FeignClient(value = "feign-provider",fallback = UserHystrix.class)
public interface UserFegin {
@GetMapping("user/get")
String findAll();
}
说明:
1.@FeignClient
注解,声明这是一个feign客户端,value属性值是调用远程服务提供方的服务名称。
2.接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果。
3.fallback
属性: 指定Feign 客户端接口的后备类,可以理解为当服务调用失败时走的熔断处理类。
熔断处理类
@Component
public class UserHystrix implements UserFegin {
@Override
public String findAll() {
return "服务调用失败!!!";
}
}
远程调用处理controller (引入Feign的客户端接口Feign会通过动态代理,帮我们生成实现类。)
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserFegin userFegin;
@PostMapping("feign")
public String getDeviceListByPage() {
return userFegin.findAll();
}
}
到此feign客户端demo写完
2.feign服务端服务
添加nacos的pom依赖
<!-- nacos注册中心依赖包 -->
<!--SpringMVC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- nacos注册中心依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos配置中心依赖支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
编写controller接口
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/get")
public String findAll() {
return "服务调用成功";
}
}
3.启动两个服务
查看nacos服务注册情况
测试调用feign客户端服务接口
停止服务提供方服务:
简单的feign远程调用整完。