ribbon 好像停止维护更新了,领导让搞一搞spring-cloud-loadbalancer,本篇主要贴一下怎么单独使用(参考 官方文档),与feign\gateway的集成,请看下一篇
无注册中心版(领导不让用注册中心,用注册中心的同学不要生搬硬套哦,其实有注册中心会好办很多)
适用于spring-cloud 版本 Hoxton.SR7,其他版本没有尝试
服务消费方(调用方)
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
application.yml 关闭ribbon
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
自定义服务集合
/**
* loadbalancer 服务实例列表
*/
public class DemoServiceInstanceListSuppler implements ServiceInstanceListSupplier {
private final String serviceId;
DemoServiceInstanceListSuppler(String serviceId) {
this.serviceId = serviceId;
}
@Override
public String getServiceId() {
return serviceId;
}
/**
* 如果采用注册中心,则不需要当前方法的配置,loadbalancer 会获取注册中心的服务注册列表自动进行路由
* 如果不采用注册中心,一种是像下面的方法一样在代码中配置,一种是可以把服务列表信息配置在属性文件中
*/
@Override
public Flux<List<ServiceInstance>> get() {
return Flux.just(Arrays
.asList(new DefaultServiceInstance(serviceId + "1", serviceId, "localhost", 8085, false),
new DefaultServiceInstance(serviceId + "2", serviceId, "localhost", 8084, false)));
}
}
配置
@Configuration
// 定义服务提供方的服务名称为“customer”
@LoadBalancerClient(name = "customer", configuration = LbConfiguration.class)
public class LbConfiguration {
@Bean
@Primary
ServiceInstanceListSupplier serviceInstanceListSupplier() {
return new DemoServiceInstanceListSuppler("customer");
}
@LoadBalanced
@Bean
WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
controller 调用
@Autowired
private WebClient.Builder loadBalancedWebClientBuilder;
@RequestMapping("/hi")
public Mono<String> hi(@RequestParam(value = "name", defaultValue = "Mary") String name) {
return
loadBalancedWebClientBuilder
.build().get().uri("http://customer/test1/")
.retrieve().bodyToMono(String.class)
.map(greeting -> String.format("%s, %s!", greeting, name));
}

负载均衡结果


如果想把 “服务地址” 配置在yml 文件中,请看下面
application.yml
loadbalancer:
instances:
- serviceId: demo_1
instanceId: demo
host: localhost
port: 8083
secure: false
- serviceId: demo_2
instanceId: demo
host: localhost
port: 8084
secure: false
@ConfigurationProperties(prefix = "loadbalancer")
public class InstanceList {
private List<Instance> instances;
public List<Instance> getInstances() {
return instances;
}
public void setInstances(List<Instance> instances) {
this.instances = instances;
}
}
public class Instance {
private String serviceId;
private String instanceId;
private String host;
private int port;
private boolean secure = false;
public String getServiceId() {
return serviceId;
}
public void setServiceId(String serviceId) {
this.serviceId = serviceId;
}
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public boolean isSecure() {
return secure;
}
public void setSecure(boolean secure) {
this.secure = secure;
}
}
@Configuration
@EnableConfigurationProperties(InstanceList.class)
public class InstanceConfig {
@Bean
public InstanceList instanceList(){
return new InstanceList();
}
}
代替上述示例中 “服务地址”写在代码的情况
@Override
public Flux<List<ServiceInstance>> get() {
List<ServiceInstance> list = new ArrayList<>();
instanceList.getInstances().forEach(instance -> {
list.add(new DefaultServiceInstance(instance.getInstanceId(),instance.getServiceId(),instance.getHost(),instance.getPort(),false));
});
return Flux.just(list);
// return Flux.just(Arrays
// .asList(new DefaultServiceInstance(serviceId + "1", serviceId, "localhost", 8083, false),
// new DefaultServiceInstance(serviceId + "2", serviceId, "localhost", 8084, false)));
}
本文介绍了在没有注册中心的情况下如何使用 Spring Cloud LoadBalancer。内容涵盖关闭 Ribbon 的设置,适用于 Hoxton.SR7 版本的配置,包括服务消费方的 pom.xml 配置、application.yml 的调整、自定义服务集合以及控制器调用的示例,展示了负载均衡的实际效果。此外,还提供了将服务地址配置在 yml 文件中的方法。

1866

被折叠的 条评论
为什么被折叠?



