Spring Cloud Alibaba 03_使用 openFeign 实现远程调用

1. 引入 openfeign 依赖

<dependency>  
    <groupId>org.springframework.cloud</groupId>  
    <artifactId>spring-cloud-starter-openfeign</artifactId>  
    <!-- 版本号应该与你的 Spring Cloud 版本兼容 -->  
</dependency>

2. @EnableFeignClients 注解启用 OpenFeign

配置类添加 @EnableFeignClients 注解以启用 OpenFeign 的自动配置。该注解会告诉 SpringBoot 在启动时扫描并注册所有标记了 @FeignClient 的接口。

@SpringBootApplication  
@EnableFeignClients  
public class Application {  
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
}

3. @FeignClient 注解声明 Feign 客户端

使用 @FeignClient 注解声明一个 Feign 客户端,name 属性指定远程服务的名称。通过该接口定义远程服务的方法。

@FeignClient(name = "remote-service")  
public interface RemoteServiceClient {  
  
    @GetMapping("/api/data")  
    String getData();  
  
    @PostMapping("/api/data")  
    ResponseEntity<String> postData(@RequestBody String data);  
}

4. 使用 Feign 客户端

@Service  
public class MyService {  
  
    @Autowired  
    private RemoteServiceClient remoteServiceClient;  
  
    public void someMethod() {  
        String data = remoteServiceClient.getData();  
        // 处理数据  
    }  
}

5. Ribbon 负载均衡

SpringCloud2020 版本以前的 OpenFeign 默认集成了 Ribbon 作为客户端负载均衡器,其默认的负载均衡策略为轮询,可以通过配置修改负载均衡策略。

修改负载均衡策略为随机的配置示例:

your-service-name:  
  ribbon:  
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

6. Spring Cloud LoadBalancer 负载均衡

SpringCloud2020 版本以后的 OpenFeign 默认集成了 Spring Cloud LoadBalancer,默认负载均衡策略为轮询,内置了轮询、随机等策略,配置随机内置策略的示例如下:

@Configuration  
public class CustomLoadBalancerConfiguration {  
  
    @Bean  
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {  
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);  
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);  
    }  
}
@SpringBootApplication  
@EnableDiscoveryClient  
@LoadBalancerClients(defaultConfiguration = CustomLoadBalancerConfiguration.class)  
public class MyApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApplication.class, args);  
    }  
}

你也可以通过实现 ReactiveLoadBalancer<ServiceInstance> 接口来实现自定义策略。

import org.springframework.cloud.client.ServiceInstance;  
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;  
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;  
import reactor.core.publisher.Flux;  
  
import java.util.List;  
  
public class RandomLoadBalancer implements ReactorLoadBalancer<ServiceInstance> {  
  
    private final ServiceInstanceListSupplier serviceInstanceListSupplier;  
  
    public RandomLoadBalancer(ServiceInstanceListSupplier serviceInstanceListSupplier) {  
        this.serviceInstanceListSupplier = serviceInstanceListSupplier;  
    }  
  
    @Override  
    public Mono<Response<ServiceInstance>> choose(Request request) {  
        return serviceInstanceListSupplier.get()  
                .map(serviceInstances -> {  
                    if (serviceInstances.isEmpty()) {  
                        return new EmptyResponse();  
                    }  
                    List<ServiceInstance> instances = serviceInstances.get();  
                    // 这里简单地通过随机索引来选择服务实例  
                    int index = (int) (Math.random() * instances.size());  
                    return new DefaultResponse(instances.get(index));  
                })  
                .single();  
    }  
}
@Configuration  
public class LoadBalancerConfig {  
  
    @Bean  
    public ReactorLoadBalancer<ServiceInstance> customLoadBalancer(Environment environment,  
                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {  
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);  
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));  
    }  
}

7. Feign 的其他配置

可通过 application.propertiesapplication.yml 文件来配置 Feign 客户端的各种参数,如连接超时时间、读取超时时间等:

feign.client.config.default.connectTimeout=5000  
feign.client.config.default.readTimeout=10000

或者针对特定 Feign 客户端进行配置:

feign.client.config.service-name.connectTimeout=5000  
feign.client.config.service-name.readTimeout=10000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值