IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springcloud 负载均衡 ribbon -> 正文阅读

[Java知识库]springcloud 负载均衡 ribbon

springcloud 负载均衡 ribbon

注意:基于nacos注册中心的前提下进行负载均衡实现的

gitee地址:springcloud负载均衡

1.目录结构

在这里插入图片描述

2.maven依赖

父工程(springcloud-ribbon)依赖

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.1.13.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Dependencies -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.13.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR6</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

所有子模块依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

3.负载模块(stock-ribbon)

3.1 配置application.yaml

server:
  port: 8200

spring:
  application:
    # 注册服务名称
    name: stock-ribbon
  cloud:
    nacos:
      discovery:
        # nacos命名空间id
        namespace: ce76fe8c-3957-4cd5-85ab-d8f88fb20eef
      username: nacos
      password: nacos
      # nacos地址
      server-addr: 192.168.153.199:8848

3.2 controller

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 黔程似景
 * @description 测试类
 * @date 2022/9/25 11:34
 * @blame 黔程似景
 **/
@RestController
public class StockController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/stock")
    public String order() {
        return "stock服务端口为:" + port;
    }
}

3.3 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author 黔程似景
 * @description 负载均衡服务端的启动类
 * @date 2022/9/25 16:53
 * @blame 黔程似景
 **/
@SpringBootApplication
public class StockApplication {

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

}

3.4 使用idea启动两个服务

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

4.注解方式实现负载均衡(order-ribbon-annotation)

注意:实现策略不能够被启动类扫描到

在这里插入图片描述

4.1 配置application.yaml

server:
  port: 8000

spring:
  application:
    name: order-annotation-ribbon
  cloud:
    nacos:
      discovery:
        namespace: ce76fe8c-3957-4cd5-85ab-d8f88fb20eef
      username: nacos
      password: nacos
      server-addr: 192.168.153.199:8848

# ribbon 默认为懒加载模式,即用的时候才会去加载,需要设置启动加载配置如下
ribbon:
  eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置mall‐user使用ribbon饥饿加载,多个使用逗号分隔
    clients: stock-ribbon

4.2 配置类

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 黔程似景
 * @description  注入随机的负载均衡方式启动类
 * @date 2022/9/25 12:00
 * @blame 黔程似景
 **/
@Configuration
public class RibbonRandomRuleConfig {

    /**
     * 注入随机负载均衡策略
     */
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }

}

4.3 controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 黔程似景
 * @description 测试接口
 * @date 2022/9/25 11:32
 * @blame 黔程似景
 **/
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/requestStock")
    public List<String> requestOrder(){
        List<String> result = new ArrayList<>();
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));

        return result;
    }

}

4.4 启动类

import com.qq.ribbon.RibbonRandomRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author 黔程似景
 * @description 以注解的形式实现负载均衡
 * @date 2022/9/25 16:48
 * @blame 黔程似景
 **/
@SpringBootApplication
@RibbonClients({
        @RibbonClient(name = "stock-ribbon" , configuration = RibbonRandomRuleConfig.class)
})
public class OrderAnnotationApplication {

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

    /**
     * 负载均衡的能力赋予
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }

}

4.5 启动服务

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

5.配置方式进行负载均衡(order-ribbon-config)

5.1配置application.yaml

server:
  port: 8100

spring:
  application:
    name: order-config-ribbon
  cloud:
    nacos:
      discovery:
        namespace: ce76fe8c-3957-4cd5-85ab-d8f88fb20eef
      username: nacos
      password: nacos
      server-addr: 192.168.153.199:8848

# ribbon 默认为懒加载模式,即用的时候才会去加载,需要设置启动加载配置如下
ribbon:
  eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置mall‐user使用ribbon饥饿加载,多个使用逗号分隔
    clients: stock-ribbon

# 使用配置的形式进行设定负载均衡策略
stock-ribbon:
  ribbon:
#    # 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)--- 自定义策略
#    NFLoadBalancerRuleClassName: com.qq.order.ribbon.rule.CustomRule
#    # 基于nacos权重,如果权重相等则是轮询
#    # 对负载的服务,进行权重配置spring.cloud.nacos.discovery.weight=1 , 或者直接在nacos   服务管理-->服务列表-->根据服务名单机详情-->根据ip和端口单机编辑-->修改权重
#    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    # 轮询
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#    # 随机
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.2 配置类

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author 黔程似景
 * @description 自己新建的的负载均衡策略
 * @date 2022/9/25 14:37
 * @blame 黔程似景
 **/
public class CustomRule extends AbstractLoadBalancerRule {

    @Override
    public Server choose(Object key) {

        ILoadBalancer loadBalancer = this.getLoadBalancer();

        //获得当前请求服务的实例
        List<Server> serverList = loadBalancer.getReachableServers();

        int random = ThreadLocalRandom.current().nextInt(serverList.size());

        Server server = serverList.get(random);

        //判断是否存活,一般情况下不会存在不存活的实例
//        if (server.isAlive()){
//
//        }

        return server;
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {

    }
}

5.3 controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 黔程似景
 * @description 测试接口
 * @date 2022/9/25 11:32
 * @blame 黔程似景
 **/
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/requestStock")
    public List<String> requestOrder(){
        List<String> result = new ArrayList<>();
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));
        result.add(restTemplate.getForObject("http://stock-ribbon/stock", String.class));

        return result;
    }

}

5.4 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author 黔程似景
 * @description 以配置的形式来实现负载均衡
 * @date 2022/9/25 16:45
 * @blame 黔程似景
 **/
@SpringBootApplication
public class OrderConfigApplication {

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

    /**
     * 负载均衡的能力赋予
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }

}

5.5 启动服务

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:38:26  更:2022-09-30 00:40:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 15:24:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码