【springboot】整合LoadBalancer

问题产生背景

      以下是一个购物车项目,通过调用外部接口获取商品信息,并添加到购物车中,这段代码中有一个问题:下面的代码中直接指定了调用的url,但如果存在多个resfood服务的url,就需要修改代码,如果存在多个,就无法保证调用的url来自不同的resfood服务,所以需要使用负载均衡。负载均衡可以实现将请求平均分配到各个服务上,避免出现一直调用同一个服务的情况。

    @Value("${resfood.url}")
    private String resfoodUrl;
    /**
     * 调用外部接口,获取商品信息,并添加到itemList中
     * @param fid
     * @param item
     * @param itemList
     */
    private void addItem(int fid, CartItem item, List<CartItem> itemList) {
        String url = resfoodUrl+fid;
        Map<String,Object> result = restTemplate.getForObject(url, Map.class);
        System.out.println(result);
        System.out.println(result.get("obj").getClass().getSimpleName());
        // ObjectMapper是Jackson提供的一个类,用于将json数据转换为java对象
        Resfood resfood = objectMapper.convertValue(result.get("obj"), Resfood.class);
//        CartItem cartItem = new CartItem();
        //原来的item
        item.setFood(resfood);
        //处理数量小于0的情况
        if(item.getNum()<=0){
            return;
        }
//            item.setNum(0);
//        cartItem.setNum(item.getNum());
        itemList.add(item);
    }

解决方案:实现LoadBalancer

      实现 Spring Cloud LoadBalancer 的前提条件:当前服务与当前服务调用的服务需要实现服务注册与发现。

1. 添加依赖

        <!--       负载均衡依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--        nacos场景依赖:nacos客户端,用于将当前的微服务注册到nacos服务器中-->
        <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2. 配置文件

      配置nacos

  cloud:
    nacos:
      discovery:
#        nacos的服务器地址,根据实际情况修改
        server-addr: your_nacos_server_addr
        username: nacos
        password: nacos

3. 使用LoadBalancer

      在配置类中创建一个带有负载均衡功能的 RestTemplate Bean。

@Configuration
public class RestTemplateConfig {
    // 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

4. 使用 RestTemplate 进行服务调用

      在代码中,使用 LoadBalanced 的 RestTemplate 调用服务。

    @Value("${resfood.url}")
    private String resfoodUrl;
    /**
     * 调用外部接口,获取商品信息,并添加到itemList中
     * @param fid
     * @param item
     * @param itemList
     */
    private void addItem(int fid, CartItem item, List<CartItem> itemList) {
        String url = resfoodUrl+fid;
        Map<String,Object> result = restTemplate.getForObject(url, Map.class);
        System.out.println(result);
        System.out.println(result.get("obj").getClass().getSimpleName());
        // ObjectMapper是Jackson提供的一个类,用于将json数据转换为java对象
        Resfood resfood = objectMapper.convertValue(result.get("obj"), Resfood.class);
//        CartItem cartItem = new CartItem();
        //原来的item
        item.setFood(resfood);
        //处理数量小于0的情况
        if(item.getNum()<=0){
            return;
        }
//            item.setNum(0);
//        cartItem.setNum(item.getNum());
        itemList.add(item);
    }

      使用服务名称代替url,让Spring Cloud LoadBalancer自动选择合适的服务实例。

resfood:
  url: http://res-food/resfood/getById/

5. 测试

      多开几个依赖的服务,请求需要测试的接口,测试是否能通过服务名称调用服务,并且负载均衡。

在这里插入图片描述

      请求发送到不同的服务上。

在这里插入图片描述在这里插入图片描述

Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架,它简化了Spring应用程序的开发和部署过程。而JFoenix是一个JavaFX的开源UI库,提供了一套现代化的UI控件和主题。 要实现Spring Boot与JFoenix的整合,可以按照以下步骤进行操作: 1. 首先,在你的Spring Boot项目中添加JFoenix的依赖。可以在项目的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>com.jfoenix</groupId> <artifactId>jfoenix</artifactId> <version>9.0.10</version> </dependency> ``` 2. 接下来,在你的Spring Boot应用程序中创建JavaFX的主类。可以使用`@SpringBootApplication`注解标记该类,并在`main`方法中启动JavaFX应用程序。 ```java @SpringBootApplication public class MainApplication extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { // 在这里编写JavaFX的界面代码 } } ``` 3. 然后,在JavaFX界面代码中使用JFoenix提供的UI控件和主题。你可以使用FXML文件定义界面布局,并在控制器类中使用`@FXML`注解将FXML文件中定义的控件与Java代码进行绑定。 ```xml <!-- sample.fxml --> <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.VBox?> <?import com.jfoenix.controls.JFXButton?> <VBox xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.SampleController"> <JFXButton text="Click Me!" onAction="#handleButtonClick"/> </VBox> ``` ```java // SampleController.java public class SampleController { @FXML private JFXButton button; @FXML private void handleButtonClick(ActionEvent event) { // 处理按钮点击事件 } } ``` 4. 最后,在Spring Boot的主类中加载JavaFX的界面。可以使用`FXMLLoader`加载FXML文件,并将其设置为JavaFX的根节点。 ```java @SpringBootApplication public class MainApplication extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml")); Parent root = fxmlLoader.load(); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } } ``` 这样,你就完成了Spring Boot与JFoenix的整合。你可以在JavaFX界面中使用JFoenix提供的UI控件和主题,同时也可以在Spring Boot应用程序中使用Spring的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睆小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值