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>
<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:
namespace: ce76fe8c-3957-4cd5-85ab-d8f88fb20eef
username: nacos
password: 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;
@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;
@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:
eager-load:
enabled: true
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;
@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;
@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;
@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:
eager-load:
enabled: true
clients: stock-ribbon
stock-ribbon:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
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;
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);
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;
@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 启动服务
 
|