spring-cloud-loadbalancer 使用--无注册中心

本文介绍了在没有注册中心的情况下如何使用 Spring Cloud LoadBalancer。内容涵盖关闭 Ribbon 的设置,适用于 Hoxton.SR7 版本的配置,包括服务消费方的 pom.xml 配置、application.yml 的调整、自定义服务集合以及控制器调用的示例,展示了负载均衡的实际效果。此外,还提供了将服务地址配置在 yml 文件中的方法。

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)));
    }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值