栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

服务调用——Ribbon、LoadBalance和OpenFeign

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

服务调用——Ribbon、LoadBalance和OpenFeign

Ribbon、LoadBalance

消费端在使用restTemplate调用服务端时,对于负载均衡有两种实现方式。

  • 使用Ngnix来完成负载均衡,此时,需要在Nginx上进行服务端的相关配置,可以认为Nginx是跟服务端捆绑在一起的。
  • 使用Ribbon来完成负载均衡,此时Ribbon是与消费端捆绑在一起的。
    总结:如果想把负载均衡放在客户端,使用Ribbon;如果想把负载均衡放在服务端,则使用Nginx。
Ribbon + LoadBalance

Ribbon依赖已经包含在Eureka依赖当中,不需要导入额外的依赖,直接与Eureka配套使用即可。使用的方法也非常简单。使用注解@LoadBalanced即可赋予RestTemplate负载均衡的能力。

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

然后在调用服务时,写上微服务的名称即可( public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";)

@RestController
@Slf4j
public class OrderController {
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    @Resource
    private RestTemplate restTemplate;
    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

默认使用的是轮询负载均衡策略。
一共有以下几种轮询策略:

OpenFeign

OpenFeign相较于Ribbon更加轻便了,都不需要手动调用RestTemplate。
需要的依赖:

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

配置:

server.port=80
eureka.client.register-with-eureka=false
#集群版
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/
#单机版
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/
# 根据自己的情况选择用哪个

主启动类:

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

需要加上注释EnableFeignClients
Controller层demo:

@RestController
@Slf4j
public class OrderFeignController {
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        CommonResult ret = paymentFeignService.getPaymentById(id);
        return ret;
    }

    @GetMapping(value = "/consumer/payment/feign/timeout")
    public String getPort(){
        return paymentFeignService.paymentFeignTimeout();
    }
}

Service层Demo:

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id);

    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeout();
}

这里记得要加@FeignClient注解,value为微服务的名称。通过微服务名称 + 路径来调用接口。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/973099.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号