服务负载均衡-Spring Cloud LoadBalancer

关键词:负载均衡    Spring Cloud LoadBalancer    


Spring Cloud不仅提供了使用Ribbon进行客户端负载均衡,还提供了Spring Cloud LoadBalancer。相比较于Ribbon,Spring Cloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient。WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求,因此学习Spring Cloud LoadBalancer之前,建议先了解下Spring Web Flux。


█ 使用

公共依赖

Spring Cloud依赖,版本是Hoxton.RELEASE。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

搭建服务注册中心-Eureka

关于Eureka的使用,请戳《服务注册与发现-Spring Cloud Netflix-Eureka

搭建服务端

(1)引入依赖:

<dependency>
    <!-- 使用web,使用Spring MVC对外提供服务   -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <!-- Eureka客户端,用于向Eureka服务端注册服务 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(2)创建Controller,对外提供访问接口:

@RestController
@RequestMapping("/base")
public class BaseController {

    @Value("${server.port}")
    private Integer port;

    @GetMapping("/string")
    public String getString() {
        return "my server get string ---->"+port;
    }

}

(3)编写application.yml配置:

# 服务端口号
server:
  port: 8081

# 服务名
spring:
  application:
    name: myServer

# Eureka
eureka:
  client:
    # 不从Eureka注册中心获取服务列表
    fetch-registry: false
    # 向Eureka注册中心注册当前服务
    register-with-eureka: true
    # Eureka服务地址
    service-url:
      defaultZone: http://localhost:8899/eureka

(4)分别以两个不同的端口号启动服务端项目,比如:8081、8082

搭建客户端

(1)引入依赖:

<dependency>
    <!-- Spring Cloud loadbalancer 负载均衡-->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
    <!-- Eureka客户端,用于向Eureka服务端获取已注册服务列表 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(2)编写application.yml配置:

server:
  port: 80

eureka:
  client:
    fetch-registry: true
    register-with-eureka: false
    service-url:
      defaultZone: http://localhost:8899/eureka

在《服务负载均衡-Spring Cloud Netflix-Ribbon》中,Spring Cloud提供了@LoadBalanced注解配合RestTemplate使用Spring Cloud Ribbon实现了客户端的负载均衡。对于Spring Cloud LoadBalancer也可以使用相同的方式。另外Spring Cloud LoadBalancer也提供了接合Spring Web Flux的负载均衡,如果你客户端使用Spring Web Flux完成服务端的访问,也只需相似的配置就能实现客户端负载均衡。

如果在项目的类路径下存在Spring Cloud Ribbon相关的类,需要通过配置关闭Ribbon功能,因为Spring Cloud默认优先使用Ribbon:

spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false

(3)客户端调用服务端接口

客户端可以使用两种方式访问服务端接口,一种是使用RestTemplate,一种是WebClient。

  • RestTemplate

①引入依赖:

<dependency>
    <!-- 使用web,使用Spring MVC对外提供服务   -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

②编写配置,创建RestTemplate类型的Bean:

需要在方法上标注@LoadBalanced注解。

@Configuration
public class LoadbalanceConfiguration {

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

}

③编写Controller,客户端实现访问服务端资源,并对外提供访问接口:

通过@Autowired,会注入第①个步骤中创建的RestTemplate实例。

@RestController
@RequestMapping("/rt/client")
public class RestClient {

    // myServer是服务端的服务名,spring.application.name的配置
    private static final String BASE_URL = "http://myServer";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getString")
    public String getString() {
        // 调用服务端提供的接口
        return restTemplate.getForObject(BASE_URL+"/base/string", String.class);
    }

}

④启动服务端,调用接口:localhost:80/rt/client/getString

访问客户端接口,客户端通过负载均衡,选择一个可用的服务端接口调用。

  • WebClient

WebClient是Spring Web Flux中提供的类,通过使用WebClient可以通过响应式编程的方式异步访问服务端接口。

WebClient.Bulider是WebClient的内部类,也是编程的入口。

①引入依赖:

<dependency>
    <!-- Spring Webflux响应式web编程-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

②编写配置,创建WebClient.Bulider类型的Bean:

同样需要在方法上标注@LoadBalanced注解。

@Configuration
public class LoadbalanceConfiguration {

    @Bean
    @LoadBalanced
    public WebClient.Builder builder() {
        return WebClient.builder();
    }
    
}

③编写Controller,客户端实现访问服务端资源,并对外提供访问接口:

@RestController
@RequestMapping("/rx/client")
public class ReactiveClient {

    private static final String BASE_URL = "http://myServer";

    @Autowired
    private WebClient.Builder clientBuilder;

    @GetMapping(&#
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值