Eureka client– 高可用
单机环境下使用端口进行区别,启动多个即可。
在客户端有多个的情况下,可以使用Ribbon进行负载均衡(eureka依赖ribbon,无需在导ribbon坐标)
Ribbon 客户端负载均衡
ribbon简洁:
Ribbon是 Netflix 提供的一个基于HTTP和TCP的客户端负载均衡工具。
Ribbon主要有两个功能:
1.简化远程调用
------使用 Ribbon 简化restTemplate调用
* 1. 在声明restTemplate的Bean时候,添加一个注解:@LoadBalanced
* 2. 在使用restTemplate发起请求时,需要定义url时,host:port可以替换为 服务提供方的 应用名称
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 RestTemplateConfig {
@Bean
@LoadBalanced //简化远程调用
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package com.itheima.eurekaconsumer.controller;
import com.itheima.eurekaconsumer.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 服务的调用方
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
/**
* 使用 Ribbon 简化restTemplate调用
* 1. 在声明restTemplate的Bean时候,添加一个注解:@LoadBalanced
* 2. 在使用restTemplate发起请求时,需要定义url时,host:port可以替换为 服务提供方的 应用名称
* @param id
* @return
*/
@GetMapping("/goods2/{id}")
public Goods findGoodsById2(@PathVariable("id") int id){
System.out.println("findGoodsById..."+id);
String url = "http://EUREKA-PROVIDER/goods/findOne/"+id;
// 3. 调用方法
Goods goods = restTemplate.getForObject(url, Goods.class);
return goods;
}
}
2.负载均衡
Ribbon 负责均衡策略:
1.随机 :RandomRule
2.轮询 :RoundRobinRule (默认)
3.最小并发:BestAvailableRule 选择并发量最小的
4.过滤:AvailabilityFilteringRule 过滤掉坏的、并发量高的
5.响应时间:WeightedResponseTimeRule 选择最先响应的
6.轮询重试:RetryRule
7.性能可用性:ZoneAvoidanceRule 综合所有性能,选择性能最好的
设置负载均衡策略(设置在客户端的消费者)
1.编码
创建一个配置类,指定负载均衡策略
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author CZM
* @date 2021 03 19 15:16
* 设置负载均衡策略(编码方式)
*/
@Configuration
public class MyRule {
@Bean
public IRule rule(){
return new RandomRule(); //随机
}
}
在启动类使用注解@RibbonClient激活配置
package com.itheima.eurekaconsumer;
import com.itheima.eurekaconsumer.config.MyRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableDiscoveryClient // 激活DiscoveryClient
@EnableEurekaClient
@SpringBootApplication
/*
配置Ribbon的负载均衡策略
name :设置服务提供方的应用名称
configuration :设置负载均衡的Bean
*/
@RibbonClient(name = "EUREKA-PROVIDER",configuration = MyRule.class)
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
2.配置文件
# 配置的方式设置Ribbon的负载均衡策略
EUREKA-PROVIDER: # 设置的服务提供方的 应用名称
ribbon:
NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类
服务端负载均衡
负载均衡算法在服务端,由负载均衡器维护服务地址列表
客户端负载均衡
负载均衡算法在客户端(消费者),客户端维护服务地址列表