复习
上午
自我实验 提供者服务器的高可用
如果8001宕机
等待30s(延迟)
eureka的高可用
老师测试
增加eureka集群
启动配置加两个参数
纠正 加上
自我实现
加注释玩玩
eureka集群高可用分析
这个错误 是互相没完全启动完 等两个eureka完全启动完的话 就没错了
不是选举制 (一一相对的) 不需要考虑奇偶数量
修改2,3,4服务器
测试开始
当一个 eureka 服务宕机时,仍可以连接另一个 eureka 服务
调用RestTemplate (web消费者)发送一个http协议请求(提供者 ) 然后提供者向我们返回一个json数据? 然后把json转换成java对象来使用
RestTemplate 请求响应 封装json一步完成
RestTemplate 是用来调用其他微服务的工具类,封装了远程调用代码,提供了一组用于远程调用的模板方法,例如:getForObject()、postForObject() 等
主程序
创建 RestTemplate 实例
都配置成功
实现远程调用
写controller层
自我测试 ribbon服务器去访问item服务器 ribbon远程调用
脚手架 sp06-ribbon消费者
package cn.tedu.sp06.ribbon.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import cn.tedu.sp01.pojo.Item;
import cn.tedu.sp01.pojo.Order;
import cn.tedu.sp01.pojo.User;
import cn.tedu.web.util.JsonResult;
@RestController
public class RibbonController {
@Autowired
private RestTemplate rt;
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
//向指定微服务地址发送 get 请求,并获得该服务的返回结果
//{1} 占位符,用 orderId 填充
return rt.getForObject("http://localhost:8001/{1}", JsonResult.class, orderId);
}
@PostMapping("/item-service/decreaseNumber")
public JsonResult decreaseNumber(@RequestBody List<Item> items) {
//发送 post 请求
return rt.postForObject("http://localhost:8001/decreaseNumber", items, JsonResult.class);
}
item商品实现类 提供者
package cn.tedu.sp02.item.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import cn.tedu.sp01.pojo.Item;
import cn.tedu.sp01.service.ItemService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class ItemServiceImpl implements ItemService {
@Override
public List<Item> getItems(String orderId) {
ArrayList<Item> list = new ArrayList<Item>();
list.add(new Item(1, "商品 1",1));
list.add(new Item(2, "商品 2",2));
list.add(new Item(3, "商品 3",3));
list.add(new Item(4, "商品 4",4));
list.add(new Item(5, "商品 5",5));
return list;
}
@Override
public void decreaseNumbers(List<Item> list) {
for(Item item : list) {
log.info("减少库存 - "+item);
}
}
}
sp01-common接口
package cn.tedu.sp01.service;
import java.util.List;
import cn.tedu.sp01.pojo.Item;
public interface ItemService {
List<Item> getItems(String orderId);
void decreaseNumbers(List<Item> list);
}
package cn.tedu.sp01.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Item {
private Integer id;
private String name;
private Integer number;
}
远程调用页面实现
post 远程调用成功 用的是8001服务器
轻测试 如果8001服务器宕机的话
好像要等30s
配置没错 等待解答 下午会讲到负载均衡
晚上回看http 刚讲远程调用的时候模块 不知道什么协议
下午
自我实现 添加用户,订单模块远程调用
都实现完成了
restTemplate 远程调用
ribbon增强了远程调用的功能 还能重试和负载均衡
Ribbon负载均衡
自我实现
RestTemplate 设置 @LoadBalanced
@LoadBalanced 负载均衡注解,会对 RestTemplate 实例进行封装,创建动态代理对象,并切入(AOP)负载均衡代码,把请求分发到集群中的服务器
远程调用+轮询 负载均衡成功
尝试高可用性 8001服务器宕机
访问商品模块 自动切换至8002服务器
更新 和拉取 不能实时
宕机后 负载均衡的高可用性成功
二、什么是高可用?
首先了解什么是高可用?
这是 CAP 定理是分布式系统的基础,也是分布式系统的 3 个指标:
Consistency(一致性)
Availability(可用性)
Partition tolerance(分区容错性)
那高可用(High Availability)是什么?高可用,简称 HA,是系统一种特征或者指标,通常是指,提供一定性能上的服务运行时间,高于平均正常时间段。反之,消除系统服务不可用的时间。
衡量系统是否满足高可用,就是当一台或者多台服务器宕机的时候,系统整体和服务依然正常可用。
举个例子,一些知名的网站保证 4 个 9 以上的可用性,也就是可用性超过 99.99%。那 0.01% 就是所谓故障时间的百分比。比如电商网站有赞,服务不可用会造成商家损失金钱和用户。那么在提高可用性基础上同时,对系统宕机和服务不可用会有补偿。
ribbon 重试 容错方式
出错情况
小案例
初始请求 失败 就更换
自我实现
依赖
yml配置文件
主启动类
模拟了一段延迟效果
实现完成
02服务器的控制层看日志
页面及控制台效果
好活 全失败了 一共六次请求
再次访问
8001 延迟213的 接收到了请求并返回了回去
再玩一次
eureka总结 类似ribbon
克隆项目
升级虚拟机
导入镜像