微服务相互调用-Ribbon
稍微LOW,也是不常用的技术
RestTemplate->Ribbon
前面,已经通过RestTemplate可以实现微服务之间的相互调用,但是RestTemplate有一定的问题,问题:1、必须要确定的具体地址。2、如果具体地址出问题了,就无法正常的做自动切换。3、微服务都是以集群的方式来部署,无法去选择集群中其他地址
解决方案
Ribbon
Ribbon概述
Ribbon是NetFlex的一个负载均衡器,例外它还可以同样使用RestTemplate完成对微服务之间的调用
你可以认为:Ribbon就是在RestTemplate的基础之上,提供了负载均衡的能力
Ribbon一般是配合Eureka注册中心来使用,意味着:Ribbon可以从Eureka中去发现自己需要的微服务实例
负载均衡
Ribbon提供的这种负载均衡的原理,是一种客户端的负载均衡机制
负载均衡:将负载(HTTP的请求)较为平均的分配到服务器上去
负载均衡常见的算法:轮询,权重,IP地址黏贴,最少连接
负载均衡的分类
**服务端负载均衡:**服务端的这种方式,一定是有服务器(Apache/Nginx)在参与,它的原理:包工头-工人之间的关系,它是属于任务分配的一种方式
**客户端负载均衡:**客户端的负载均衡一般是发生在分布式应用程序内容,它的原理:是属于调用者与被调用者之间的关系
Ribbon使用
1、导入Ribbon的依赖
但是Ribbon只要是你使用Eureka,那么程序已经自带了
2、开启负载均衡
在调用的一方,开启负载均衡
配置Ribbon实际上就是开启它的负载均衡
说Ribbon的底层就是RestTemplate,那么配置Ribbon实际上就是在配置RestTemplate
/**
* 产生一个RestTemplate 模板对象
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
**默认情况下:**Ribbon使用的轮询模式
3、客户端调用方式
/**
* RestTemplate一定要写详细地址
* @return
*/
public String getUrl(){
// return "http://127.0.0.1:9091/";
//127.0.0.1:9091替换成 micro-base-server(被调用者的spring.application.name)
return "http://micro-base-server/";
}
4、Ribbon提供的负载均衡
com.netflix.loadbalancer.RoundRobinRule 轮询(默认)
com.netflix.loadbalancer.RandomRule 随机
com.netflix.loadbalancer.RetryRul 重试
com.netflix.loadbalancer.WeightedResponseTimeRule 权重
com.netflix.loadbalancer.BestAvailableRule 最佳
com.netflix.loadbalancer.AvailabilityFilteringRule 请求过滤
5、全局配置Ribbon的负载均衡
在SpringMvcConfiguration中
/**
* 定义自己的负载均衡策略
* @return
*/
@Bean
public IRule myRandomRule(){
return new RandomRule();
}
6、局部配置Ribbon的负载均衡
每个单独的微服务调用,可能使用的负载均衡策略不一致,那么如何设置呢?
以RetryRule的方式来讲解,注释掉 上述的全局负载均衡的代码
Ribbon在使用restTemplate调用其他的微服务时,调用可能由于某些原因失败了,失败了肯定要解决,采用重试机制解决
1、导入重试依赖包
在调用者一方的pom.xml中
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
2、修改application.yml文件
spring:
application:
name: micro-user-server
datasource: #配置Druid的数据源连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/micro-user-server?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true
username: root
password: 123456
druid:
initial-size: 5
max-active: 20
min-idle: 1
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: select now() from dual
test-while-idle: false
test-on-borrow: true
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=3000
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
reset-enable: true
url-pattern: /druid/*
web-stat-filter:
enabled: true
exclusions:
-*.js
-*.gif
-*.jpg
-*.png
-*.css
-*.ico
-/druid/*
url-pattern: /*
micro-base-server: #微服务的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
ConnectTimeout: 250 # Ribbon的连接超时时间(毫秒)
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
#设置其他微服务的负载均衡策略
#micro-admin-server:
# ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#
server:
port: 9092
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8080/eureka/
mybatis:
mapper-locations: classpath:mapper/*.xml #配置Mapper映射文件所在的位置
type-aliases-package: com.woniuxy.microuserserver.bean #别名包
configuration:
lazy-loading-enabled: true #延迟加载
aggressive-lazy-loading: false
logging:
level:
root: debug #将日志下调至Debug
logging.level.root 为了查看效果, 可以将日志级别下调至Debug
micro-base-server 单独为该微服务,定制化的设置 负载均衡规则
3、查看重试效果
g:
level:
root: debug #将日志下调至Debug
> logging.level.root 为了查看效果, 可以将日志级别下调至Debug
>
> micro-base-server 单独为该微服务,定制化的设置 负载均衡规则
##### 3、查看重试效果