环境: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 动态网关配置