使用 Netflix Feign 客户端调用服务
Netflix 的 Feign 客户端库是启用 Load Balancer 的 RestTemplate 类的替代方案。Feign 库采用不同的方法来调用 REST 服务。使用这种方法,开发人员首先定义一个 Java 接口,然后添加 Spring Cloud 注解,以映射将要调用的服务。Spring Cloud 框架将动态生成一个代理类,用于调用目标 REST 服务。除了接口定义,开发人员不需要编写其他调用服务的代码。
1. 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 使用 @EnableFeignClients 注解标注引导类
package com.study.cloudlearning;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@RefreshScope
@EnableFeignClients
@SpringBootApplication
public class CloudLearningApplication {
public static void main(String[] args) {
SpringApplication.run(CloudLearningApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3. 定义接口
package com.study.cloudlearning.service.client;
import com.study.cloudlearning.entity.Organization;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author Zhang B H
* @create 2023-10-30 12:40
*/
@FeignClient("organization-service")
public interface OrganizationFeignClient {
@GetMapping("/v1/organization/{organizationId}")
Organization getOrganization(
@PathVariable("organizationId") String organizationId);
}
上述代码中,使用了 @FeignClient 注解,并将我们想让这个接口代表的服务的应用程序 ID 传递给它。接下来,在这个接口中定义一个 getOrganization() 方法,客户端可以调用该方法来调用组织服务。
定义 getOrganization() 方法的方式看起来就像在 Spring 控制器类中公开一个端点的方式一样。
首先,为 getOrganization() 方法定义一个 @RequestMapping 注解,该注解映射 HTTP 动词以及将在 organization 服务调用中公开的端点。
其次,使用 @PathVariable 注解将URL传入的组织ID映射到方法调用上的organizationId参数。
调用组织服务的返回值将被自动映射到 Organization 类,这个类被定义为 getOrganization() 方法的返回值。
要使用 OrganizationFeignClient 类,我们需要做的只是自动装配并使用它。Feign 客户端代码将为我们处理所有编码。
Last updated