原创

restTemplate负载均衡

温馨提示:
本文最后更新于 2025年09月07日,已超过 278 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

负载均衡

引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>


依赖注入

    @Autowired
    LoadBalancerClient loadBalancerClient;

根据分组名,获取 任意的 一个 服务器 ,会自动进行 负载均衡

    private Product getProductFromRemmoteWithLoadBalance(Long productId) {
        ServiceInstance instance = loadBalancerClient.choose("service-product");
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + productId;
        Product product = restTemplate.getForObject(url, Product.class);
        log.info("远程请求: {} ", url);
        return product;
    }

注解式 负载均衡

配置添加 注解   @LoadBalanced

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class OrderConfig {
    @LoadBalanced //注解式 负载均衡
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}


实现方法 只需要 路径中拼接 分组名,则自动 负载均衡


    //注解式 负载均衡
    private Product getProductFromRemmoteWithLoadBalanceAnnotion(Long productId) {
        String url = "http://service-product/product/" + productId;
        Product product = restTemplate.getForObject(url, Product.class);
        log.info("远程请求: {} ", url);
        return product;
    }

注册中心宕机,远程调用  规则


配置中心

基本使用

    @GetMapping("/config")
    public String getConfig() {
        return timeout + ":" + confirm;
    }

引入依赖

        <!--        配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

nacos的配置自动刷新

第一:在controller中 添加注解 @RefreshScope 

使用 @ value获取 配置中的数据

    @Value("${order.timeout}")
    public String timeout;
    @Value("${order.auto-confirm}")
    public String confirm;

通过接口 访问 数据

    @GetMapping("/config")
    public String getConfig() {
        return timeout + ":" + confirm;
    }

注意 : 在多模块中,对于没有进行  nacos配置问价使用的模块使用 禁止导入检查

第二 @ConfigurationProperties

新建 配置绑定类 

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "order")// 配置批量绑定在nacos下,可以无需@RefreshScope就能是吸纳自动刷新
public class OrderProperties {

    public String timeout;
    public String autoConfirm;
}

 自动注入

    @Autowired
    OrderProperties orderProperties;

接口访问

    @GetMapping("/config")
    public String getConfig() {
        return orderProperties.timeout + ":" + orderProperties.autoConfirm;
    }


第三 NacosConfigManager 监听配置变化

即时获取 更新的配置数据,并可以 做自己的处理逻辑

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;


@SpringBootApplication
public class OrderMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class, args);
    }

    /*
      1 项目启动就监听配置文件变化
      2、发生变化后拿到变化值
      3、发生邮件
       */
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {
        return args -> {
            ConfigService service = nacosConfigManager.getConfigService();
            service.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {
                @Override
                public Executor getExecutor() {
                    return Executors.newFixedThreadPool(2);
                }

                @Override
                public void receiveConfigInfo(String s) {
                    System.out.println("变化的配置信息" + s);
                    System.err.println("发送邮件的操作");
                }
            });
            System.out.println("系统启动!!!");
        };
    }
}

配置的优先级

配置的按需加载


最优的书写方式  根据不同的配置文件,读取不同的配置。nacos的配置依据 激活的配置文件动态刷新

spring:
  profiles:
    active: test
  config:
    import:
      - nacos:service-order.properties?group=DEFAULT_GROUP
      - nacos:common.properties?group=dev
      - nacos:database.properties?group=dev
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        import-check:
          enabled: false
        namespace: ${spring.profiles.active:dev}
server:
  port: 8000
---
spring:
  config:
    import:
      - nacos:service-order.properties?group=DEFAULT_GROUP
      - nacos:common.properties?group=dev
    activate:
      on-profile: dev
---
spring:
  config:
    import:
      - nacos:service-order.properties?group=DEFAULT_GROUP
    activate:
      on-profile: test
正文到此结束