1 OpenFeign简介
1.1 Feign与OpenFeign的区别
1.2 OpenFeign的优点
2 整合OpenFeign
2.1 添加依赖
2.2 启用Feign客户端
2.3 配置Nacos
2.4. 创建Feign客户端接口
2.5. 调用远程服务
2.6.启动服务调用接口
1 OpenFeign简介
1)Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务。
Feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2)OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中.
OpenFeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
说明:
1、springcloud F 及F版本以上 springboot 2.0 以上基本上使用openfeign。
2、openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用
openfeign,2018年以前的项目在使用feign。
1.2 OpenFeign的优点
声明式调用:通过注解定义 HTTP 请求,代码更简洁。
集成 Ribbon:支持客户端负载均衡。
支持服务发现:与 Eureka、Consul 等服务发现组件无缝集成。
支持熔断:与 Hystrix、Sentinel 等熔断器集成,提升系统稳定性。
可扩展:支持自定义拦截器、编码器和解码器,便于扩展和定制化。
2 整合OpenFeign
在Spring Cloud Alibaba框架中整合OpenFeign,可以实现服务之间的远程调用,使得服务间的通信更加简单和高效。以下是整合OpenFeign的步骤和一些关键点:
2.1 添加依赖
在项目的pom.xml文件中添加OpenFeign的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这一步是整合OpenFeign的基础,通过添加依赖,我们可以在项目中使用Feign客户端进行服务间的调用。
2.2 启用Feign客户端
在Spring Boot应用的启动类上添加@EnableFeignClients注解,以启用Feign客户端。
@EnableFeignClients(basePackages = "com.hd.mall.member.feign")
@SpringBootApplication
@MapperScan("com.hd.mall.member.dao")
@EnableDiscoveryClient
public class MallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(MallMemberApplication.class, args);
}
}
这个注解告诉Spring Boot应用,需要扫描并创建Feign客户端接口的实现。
2.3 配置Nacos
由于Spring Cloud Alibaba整合了Nacos作为服务发现和配置管理的工具,需要在application.properties或application.yml文件中配置Nacos的地址。
spring.application.name=mall-member
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
这里配置了应用的名称以及Nacos服务器的地址。
2.4. 创建Feign客户端接口
@EnableFeignClients(basePackages = "com.hd.mall.member.feign")
com.hd.mall.member.feign 定义一个接口并使用@FeignClient注解来指定要调用的服务名。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("mall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/memberList")
public String memberCouponList();
}
@FeignClient注解指定了要调用的服务名称,而`@GetMapping`注解定义了一个GET请求。
mall-coupon服务对应的controller
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
/**
* 列表
*/
@RequestMapping("/memberList")
public R memberList(@RequestParam Map<String, Object> params){
PageUtils page = couponService.queryPage(params);
return R.ok().put("memberList", "coupon服务");
}
}
2.5. 调用远程服务
在需要的地方注入Feign客户端接口,并调用其方法,就像调用本地方法一样。
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("/couponlist")
public R couponlist(@RequestParam Map<String, Object> params){
String s = couponFeignService.memberCouponList();
return R.ok().put("page", "Members").put("coupon",s);
}
}
通过注入Feign客户端接口,我们可以在控制器中调用远程服务的方法。
2.6.启动服务调用接口
http://192.168.56.1:8000/member/member/couponlist