目录
一,负载均衡
1,什么是分在均衡
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。也就是说把请求分摊到所拥有的服务器上。
2,自定义负载均衡
provide1的配置
pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Nacos服务中心的启动器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
yml文件
server:
port: 8091
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.122.131:8848 #nacos注册中心的地址
application:
name: provider #注册到nacos的服务名
启动类
@SpringBootApplication
@EnableDiscoveryClient //把当前服务注册到nacos,并发现其它服务
public class RibbonProviderApp1 {
public static void main(String[] args) {
SpringApplication.run(RibbonProviderApp1.class, args);
}
}
controller
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
service
//接口
public interface UserService {
User getUserById(Integer id);
}
//实现类
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"@遗失的风--1",18);
}
}
provide2的配置
与provide1的配置基本一致,区别:yml配置的端口换一个,service的实现类的返回值换一个方便观察。
consumer的配置
pom文件配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
yml文件配置
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.122.131:8848
application:
name: consumer
启动类
@SpringBootApplication
@EnableDiscoveryClient //开启nacos,允许注册当前服务,并发现其它服务
public class RibbonConsumerApp {
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApp.class, args);
}
}
config
@Configuration
public class BeanConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
controller
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
private int index;
@RequestMapping(value="/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
List<ServiceInstance> serviceList =
discoveryClient.getInstances("ribbon-provider");
//(1)随机方式获得服务
//int currentIndex = new Random().nextInt(serviceList.size());
//(2)轮询方式获得服务
index=index + 1;
int currentIndex = (index) % serviceList.size();
ServiceInstance instance = serviceList.get(currentIndex);
String serviceUrl = instance.getHost() + ":" + instance.getPort();
System.out.println("serviceUrl:"+serviceUrl);
String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}
二,Ribbon
1,什么是Ribbon
Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,默认提供 很多种负载均衡算法,例如轮询、随机 等等。
2,基于ribbon实现负载均衡
config
@Configuration
public class BeanConfig {
/**
* 拦截器
* 1.通过ribbon-provider-->List<Service>--->使用负载均衡策略返回Service
* 2.把ribbon-provider换成ip和端口
*/
@LoadBalanced//开启负载均衡,默认是轮训策略
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
//随机策略
@Bean
public IRule iRule(){
return new RandomRule();
}
}
controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
public RestTemplate restTemplate;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//使用ribbon的策略
String url = "http://Ribbon-provider/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}