ACID
Atomicity(原子性)
Consistency(一致性)
Isolation(事务 独立性)
Durability(持久性)
CAP三选一原则
Consistency(强一致性)
Availablity(可用性)
Partition tolerance(分区容错性)
6. Ribbon负载均衡
码神》码龙》码工》码农》码畜》码渣
RibbonRibbon github是基于Netflix Ribbon实现的一套客户端 负载均衡(Load Balance)的工具。
完善的配置项超时,重试。。
帮助基于某种规则(轮询,随机)。也可以自定义负载均衡算法。
初步配置
1.maven 2.yml 3.@EnableXXX
<!-- Ribbon相关 ↓-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- Ribbon相关 ↑-->
server:
port: 80
eureka:
client:
register-with-eureka: false #false表示不向注册中心注册自己。
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
//主启动类增加LB启动注解
@EnableEurekaClient
@Configuration
public class ConfigBean {
@Bean
// 开启Ribbon负载均衡
@LoadBalanced
public RestTemplate getRestTemplate(){
// 提供了很多中便捷访问远程http的服务的方法
// 是一种简单便捷的访问restful的服务模板类
// 是spring 提供用于访问Rest服务的客户端模版工具集
return new RestTemplate();
}
@Bean
public IRule myRule(){
// 用随机算法代替默认的轮询算法,默认的是随机算法,新算法加入到容器就会覆盖默认
// return new RandomRule();
// 重试算法
return new RetryRule();
}
}
客户端访问类,访问地址改为微服务的名字,通过Eureka上面注册服务的名字去访问,这样同名的多个服务集群可以实现负载均衡的访问策略。
Ribbon 和Eureka整合后消费者可以直接调用服务名而不用关心地址和端口号。
@RestController
@RequestMapping("/consumer/dept")
public class DeptController_Consumer {
//private final static String RESTPRE = "http://127.0.0.1:8001";
// 设置成对外暴露的微服务的名字,消费者直接通过Eureka调用服务名而不用关心地址和端口号
private final static String RESTPRE = "http://SPRINGCLOUD-DEPT";
/**
* 使用restTemplate访问restful接口非常的简单粗暴无脑
* (url, requestMap, ResponseBean.class) 这三个参数分别代表
* REST请求地址, 请求参数, Http响应转换被转换成的对象类型
*/
@Autowired
private RestTemplate restTemplate;
@ApiOperation(value="根据id查询部门信息", notes="根据url的id来查询部门信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "部门ID", required = true, dataType = "Long",paramType = "path"),
})
@GetMapping("/info/{id}")
public Dept info(@PathVariable(value = "id") Long id){
return restTemplate.getForObject(RESTPRE + "/dept/info/" + id, Dept.class);
}
@ApiOperation(value="新增部门", notes="新增部门")
@ApiImplicitParams({
@ApiImplicitParam(name = "dept", value = "部门实体", required = true, dataType = "Dept")
})
@PostMapping("/add")
public boolean add(@RequestBody Dept dept){
return restTemplate.postForObject(RESTPRE + "/dept/add", dept, Boolean.class);
}
@ApiOperation(value="获取部门集合", notes="获取部门集合")
@GetMapping("/list")
public List<Dept> list(){
return restTemplate.getForObject(RESTPRE + "/dept/list", List.class);
}
@GetMapping("/discovery")
public Object discovery(){
return restTemplate.getForObject(RESTPRE + "/dept/discovery", Object.class);
}
}
server:
port: 8003
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: cn.sysq.springcloud.pojo # 所有pojo类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
# 对外暴露的微服务的名字
name: springcloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/cloudDB03?useSSL=true # 数据库名称
username: root
password: 1234
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client:
# 客户端注册进eureka服务列表内
service-url:
# defaultZone: http://127.0.0.1:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
# 不使用默认的名字 改成我们自己定义的
instance-id: springcloud-dept8003
# 访问路径可以显示IP地址
prefer-ip-address: true
# 对当前的微服务做说明
info:
app.name: ljz-springcloud
company.name: www.sanyueshiqi.cn
build.artifactId: ${project.artifactId}
build.version: ${project.version}
IRule接口是LB算法的规则接口,支持的算法实现这个接口
LB集中式 F5 nginx
LB进程内 ribbon