定制化开发服务调用——Ribbon、LoadBalance和OpenFeign

、LoadBalance

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

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

Ribbon + LoadBalance

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

@Configurationpublic class ApplicationContextConfig {    @Bean    @LoadBalanced    public RestTemplate getRestTemplate(){        return new RestTemplate();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

@RestController@Slf4jpublic class OrderController {    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";    @Resource    private RestTemplate restTemplate;    @GetMapping(value = "/consumer/payment/get/{id}")    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

OpenFeign

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

        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-openfeign</artifactId>        </dependency>
  • 1
  • 2
  • 3
  • 4

配置:

server.port=80eureka.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/# 根据自己的情况选择用哪个
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

主启动类:

@SpringBootApplication@EnableFeignClientspublic class OrderFeignMain80 {    public static void main(String[] args) {        SpringApplication.run(OrderFeignMain80.class, args);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

需要加上注释EnableFeignClients
Controller层demo:

@RestController@Slf4jpublic class OrderFeignController {    @Resource    private PaymentFeignService paymentFeignService;    @GetMapping(value = "/consumer/payment/get/{id}")    public CommonResult getPaymentById(@PathVariable("id") Long id) {        CommonResult<Payment> ret = paymentFeignService.getPaymentById(id);        return ret;    }    @GetMapping(value = "/consumer/payment/feign/timeout")    public String getPort(){        return paymentFeignService.paymentFeignTimeout();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Service层Demo:

@Component@FeignClient(value = "CLOUD-PAYMENT-SERVICE")public interface PaymentFeignService {    @GetMapping(value = "/payment/get/{id}")    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);    @GetMapping(value = "/payment/feign/timeout")    public String paymentFeignTimeout();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发