天天看点

Spring Cloud Gateway通过静态服务注册发现机制实现负载均衡

作者:Spring全家桶实战案例

环境:Spring2.3.12.RELEASE + Spring Cloud Gateway2.2.9.RELEASE + Spring-Cloud-loadbalancer2.2.9.RELEASE

本示例通过配置文件配置服务提供者ServiceProvider,也就是我们不使用Euraka或者Nacos这样的服务注册服务,通过application.yml来配置静态的服务。

服务提供者

server:
  port: 8081           

一个接口

@RestController
@RequestMapping("/demo")
public class DemoController {
  @GetMapping("/index")
  public Object index(String name) {
    return "您输入的是:" + name ;
  }
}           

网关配置

引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
  <version>2.2.9.RELEASE</version><!-- <version>3.0.5</version> 这个版本对应springboot 2.4.12 -->
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-loadbalancer</artifactId>
  <version>2.2.9.RELEASE</version>
</dependency>           

路由配置

spring:
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      default-filters:
      - StripPrefix=1
      routes:
      - id: lbs
        uri: lb://ssc
        predicates:
        - name: Path
          args:
            a: /api-a/**           

静态服务配置

spring:
  cloud:
    discovery:
      enabled: true
      client:
        simple:
          instances:
            ssc:
            - instanceId: ss
              host: localhost
              port: 8081             

通过这样配置,我们可以不同提供动态的服务注册功能。

多个RestTemplate

如果您想要一个不平衡负载的RestTemplate,那么创建一个RestTemplate Bean并注入它。要访问负载平衡的RestTemplate,请在创建@Bean时使用@LoadBalanced限定符,如下例所示:

@Resource
private RestTemplateBuilder builder ;
	
@Bean
@LoadBalanced
public RestTemplate loadBalanced() {
  return builder.build() ;
}
	
	
@Bean
public RestTemplate restTemplate() {
  return builder.build() ;
}           

使用:

@Resource
private RestTemplate loadBalanced ;
	
@Resource
private RestTemplate restTemplate ;
	
	
@GetMapping("/index")
public Object indexLb(String name) {
  return loadBalanced.getForObject("http://ssc/demo/index?name=" + name, String.class) ;
}
	
@GetMapping("/def")
public Object index(String name) {
  return restTemplate.getForObject("http://localhost:8084/demo/index?name=" + name, String.class) ;
}           

多个WebClient

如果你想要一个不平衡负载的WebClient,创建一个WebClient bean并注入它。要访问负载平衡的WebClient,请在创建@Bean时使用@LoadBalanced限定符,如下例所示:

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

@Bean
public WebClient.Builder webClient() {
  return WebClient.builder();
}           
@Resource
private WebClient.Builder webClientloadBalanced ;
// 基于响应式的负载均衡
@GetMapping("/index")
public Mono<String> indexLb(String name) {
  return webClientloadBalanced.baseUrl("http://ssc")
    .build()
    .get()
    .uri("/demo/index")
    .retrieve()
    .bodyToMono(String.class) ;
}           

WebFlux中WebClient作为负载平衡器客户端

可以将WebClient配置为使用ReactiveLoadBalancer。如果将Spring Cloud LoadBalancer starter添加到项目中,并且Spring webflux位于类路径上,则会自动配置ReactorLoadBalancerExchangeFilterFunction。以下示例显示如何配置WebClient以使用反应式负载平衡器:

@GetMapping("/index")
public Mono<String> indexLb(String name) {
  return WebClient.builder().baseUrl("http://ssc")
    .filter(lbFunction) // 这里是关键使用WebClient具有负载均衡的功能
    .build()
    .get()
    .uri("/demo/index")
    .retrieve().bodyToMono(String.class) ;
}           

完毕!!!

Spring Cloud Bus使用说明详解

Spring Cloud Nacos 开启权限验证

Spring Cloud Gateway应用详解1之谓词

SpringCloud Nacos 整合feign

在Spring Cloud 中你还在使用Ribbon快来试试Load-Balancer

Spring Cloud 中断路器 Circuit Breaker的应用

Spring Cloud 微服务日志收集管理Elastic Stack完整详细版

SpringCloud Feign实现原理源分析

SpringCloud Hystrix实现资源隔离应用

SpringCloud zuul 动态网关配置

Spring Cloud Gateway通过静态服务注册发现机制实现负载均衡
Spring Cloud Gateway通过静态服务注册发现机制实现负载均衡
Spring Cloud Gateway通过静态服务注册发现机制实现负载均衡
Spring Cloud Gateway通过静态服务注册发现机制实现负载均衡

继续阅读