当前位置: 首页 > news >正文

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

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

    • 1. 引入依赖
    • 2. 启用 OpenFeign
    • 3. 声明 Feign 客户端
    • 4. 使用 Feign 客户端
    • 5. Ribbon 负载均衡
    • 6. Spring Cloud LoadBalancer 负载均衡

1. 引入依赖

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

2. 启用 OpenFeign

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

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

3. 声明 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));  
    }  
}

相关文章:

  • 【快手】前端校招一面
  • Python MongoDB
  • 项目第十一弹:客户端模块设计与实现
  • C++之多态
  • Vue 响应式原理
  • pycharm 使用 translation 插件通过openai进行翻译
  • 使用Maven创建一个Java项目并在repository中使用
  • 【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
  • JDBC 编程
  • Postman cURL命令导入导出
  • 5.内容创作的未来:ChatGPT如何辅助写作(5/10)
  • 数据预处理方法—数据标准化和数据归一化
  • 大话C++:第11篇 类的定义与封装
  • 【AI视频】Runway:Gen-2 运镜详解
  • 关于安卓App自动化测试的一些想法
  • 7、论等保的必要性
  • LabVIEW提高开发效率技巧----采用并行任务提高性能
  • 使用Kong开源API网关的保姆级教程
  • MATLAB窗口操作常用命令
  • Th:1.1 建立连接
  • 当智慧农场遇见绿色工厂:百事如何用科技留住春天的味道?
  • 机器人为啥热衷“搞体育”,经济日报:是向加速融入日常生活发起的冲锋
  • 流失79载,国宝文物“子弹库帛书”(二、三卷)回归祖国
  • 泉州围头湾一港区项目炸礁被指影响中华白海豚,官方:已叫停重新评估
  • 沪指跌0.68%报3380.82点,创指跌1.92%:券商、军工跌幅靠前
  • 齐白石精品在波士顿展出,“白石画屋”呈现水墨挥洒