目录
前言
在现代微服务架构中,服务之间的通信至关重要。OpenFeign 是一个声明式的 Web 服务客户端,它让我们可以通过简洁的注解方式实现 HTTP 请求的远程调用。与传统的基于 RestTemplate
或 HttpClient
的调用方式相比,OpenFeign 简化了开发过程,降低了代码复杂度,提高了开发效率。
HTTP :适用于跨语言和跨平台的场景
RPC :更适合高性能要求的服务间调用并且服务耦合度高,适合同一语言开发的项目
准备
- jdk17+
- maven3.9.4+
- idea2023
- spring cloud: 2023.0.1.0
- spring cloud alibaba: 2023.0.1
源码获取:GitHub - RemainderTime/spring-cloud-alibaba-base-demo: 基于spring cloud alibaba生态快速构建微服务脚手架
项目集成
微服务模块
- http-cloud-consumer 消费者服务
- http-cloud-producer 生产者服务
消费者服务pom.xml引入依赖
<!-- 远程调用http openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡 loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Tips!
loadbalancer:
负载均衡组件loadbalancer, 是对 Ribbon 的一种升级和替代,提供了更加灵活、轻量的负载均衡功能。 它不再强依赖于 Eureka,支持与多种服务注册中心兼容。相较于 Ribbon,Spring Cloud LoadBalancer 更加模块化、定制化,适用于微服务架构中的各种负载均衡需求。
其实在注册中心nacos依赖内部中已经集成了LoadBalancer的依赖,但是在博主实际使用中发现,如果不在模块中单独引入LoadBalancer依赖,后面会使用到的@FeignClient(name = "http-cloud-producer")方式不生效,只能使用@FeignClient(name = "http:127.0.0.0.1:8080")方式
消费者yml配置文件开启负载均衡
上也说到loadbalancer其实已经集成到了nacos依赖中,可以完全契合nacos作为注册中心实现服务间负载均衡
spring:
cloud:
loadbalancer: #开启负载均衡
nacos:
enabled: true
retry:
enabled: true # 启用负载均衡重试机制 负载均衡策略默认为轮询,想要修改策略新版本中需要手动java代码配置,新版本中配置文件的方式不支持了,更灵活但略复杂
消费者启动类配置
启动类添加注解启用Feign客户端 @EnableFeignClients
如果“生产者”微服务只是单一作为服务接口提供方,就不需要额外的远程调用配置。
生产者服务定义接口
和一般使用的接口没什么区别
@RestController
public class DemoController {
@GetMapping(value = "/test/feign/{string}")
public String test(@PathVariable String string) {
return string;
}
@GetMapping(value = "/test/feign01")
public String test01() {
return "成功了~~~";
}
}
消费者定义FeignService
定义的远程方法名称地址以及参数必须和生产者提供的接口一致
@FeignClient(name = "http-cloud-producer")
public interface FeignService {
@GetMapping(value = "/test/feign/{str}")
String feignInfo(@PathVariable("str") String str);
@GetMapping(value = "/test/feign01")
String feignInfo01();
}
注解中的 name = "http-cloud-producer" 参数内容为 生产者服务在 注册中心注册的服务名称,也可以使用 url = "http:127.0.0.0.1:8080" 设置服务真实地址
消费者调用远程接口
@RestController
public class FeignController {
@Autowired
private FeignService feignService;
/**
* 使用openFeign远程调用
* @param str
* @return
*/
@GetMapping(value = "/feign/{str}")
public String rest(@PathVariable String str) {
return feignService.feignInfo(str);
}
/**
* 使用openFeign远程调用 无参数
* @return
*/
@GetMapping(value = "/feign01")
public String rest01() {
return feignService.feignInfo01();
}
}
启动生产者消费者服务,请求消费者接口正常返回则使用成功了
至此使用openFeign实现远程调用完成了