一、Ribbon负载均衡
Eureka已经集成Ribbon,所以无需引入依赖,要想使用Ribbon,只需在消费者的启动类的RestTemplate Http客户端工具类模板中配置
注解@LoadBalanced //开启负载均衡,浏览器访问消费者的Controller时,通过restTemplate方法访问其他服务类,该方法已经被定义负载均衡默认是轮询。
3001端口的微服只在一个注册中心注册了,也能同步到各个注册中心的分片中
二、负载均衡实例
1.Eurek集群
这个是eureka集群,参考上一张节搭建eureka集群,服务提供者服务消费者可以分别注册响应的集群中(注册中心不搭建集群也可以)
2.服务提供者集群
服务名相同,端口号不同来模拟微服务集群
端口号3001机台的服务:
server:
port: 3001
spring:
application:
name: good-provide
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
eureka:
client:
service-url:
defaultZone: http://eureka-server01:2001/eureka/ #注册到eureka集群中的某一个机台中
表现层
@RestController
@RequestMapping("/provide")
public class ProvideRibbonController {
@Autowired
private StudentServer studentServer;
@GetMapping("/find")
public Student find() {
return studentServer.findById();
}
}
端口号3002机台的服务:
server:
port: 3002
spring:
application:
name: good-provide
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
eureka:
client:
service-url:
defaultZone: http://eureka-server03:2003/eureka/
表现层:
@RestController
@RequestMapping("/provide")
public class Provide02RibbonController {
@RequestMapping("/find")
public Student find() {
Student student = new Student();
student.setSex("男");
student.setScore(88.0);
student.setName("王阿伯强");
student.setAge(88);
student.setSid(88);
return student;
}
}
3.服务消费者(配置负载均衡算法的地方)
配置好算法,按照服务名字,去轮询随机等访问服务提供者
server:
port: 19092
spring:
application:
name: user-consumer
eureka:
client:
service-url:
defaultZone: http://eureka-server01:2001/eureka/ #注册到其中一个注册中心去
instance:
#指定IP地址
#ip-address: 127.0.0.1
#访问服务的时候,推荐使用IP(访问本服务的时候推荐使用此IP,然后在Euraka的状态显示中显示的是Ip地址而不是主机名,消费者获取的时候也是获取ip地址)
prefer-ip-address: true
启动类注册RestTemplate
RestTemplate的方法根据注册中心的注册表信息,根据@LoadBalanced注解配置的负载均衡算法,调用RestTemplate实例的方法去远程调用微服务
Eureka已经集成Ribbon,所以无需引入依赖,要想使用Ribbon,直接在RestTemplate的配置方法上添加@LoadBalanced注解即可
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate find() {
return new RestTemplate();
}
}
表现层:
@RestController
@RequestMapping("/ribbon")
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/find")
public Student find() {
//restTemplate 会根据url=http://服务名+/控制器地址(controller)+/方法地址 来获取ip地址和相应的方法
String url = "http://good-provide" + "/provide/find";
return restTemplate.getForObject(url, Student.class);
}
}
请求结果:
第一次:
请求的是3002端口的微服务
第二次:
请求的是3001端口的微服务
默认是轮询策略,如果要配置其它策略可以在服务消费者配置文件中配置
server:
port: 19092
spring:
application:
name: user-consumer
# 修改服务地址轮询策略,默认是轮询,配置之后变随机
good-provide: #服务提供者的服务名
ribbon:
#轮询
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#随机算法
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
#加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
eureka:
client:
service-url:
defaultZone: http://eureka-server01:2001/eureka/
instance:
#指定IP地址
#ip-address: 127.0.0.1
#访问服务的时候,推荐使用IP(访问本服务的时候推荐使用此IP,然后在Euraka的状态显示中显示的是Ip地址而不是主机名,消费者获取的时候也是获取ip地址)
prefer-ip-address: true