01.微服务的概念
- 单体、分布式、集群 (面试用到)
- 微服务
- 把之前的大的应用,按照业务功能拆分成若干个小的模块,每个模块都是独立的开发,测试,上线,维护
- 缺点: 开发成本高,众多服务出错的处理(容错),分布式事务的问题.
02.搭建项目的环境
- shop-parent(管理统一依赖)
- shop-product-api(存放商品服务实体类)
- shop-product-server(提供商品服务项目)
- shop-order-api(存放订单服务的实体类)
- shop-order-server(提供订单服务项目)
03.基于RestTemplate实现订单服务调用商品的服务.
04.注册中心 (面试常考的点)
- 解决服务调用的IP端口管理的问题
- 所有服务启动的时候将IP和端口注册到注册中心
- 所有服务在启动的时候,拉取服务器上最新服务列表,周期性更新最新的服务列表
- 实际在远程调用的时候,读取本地的缓存的服务列表
- 通过心跳的机制实现服务的动态感知.(注册中心在15秒没有收到客户端的心跳,把该服务实例信息健康状态修改成false,在30秒没有客户端心跳,把该服务的实例信息从列表中移除掉)
04.自定义负载均衡
@Autowired
private DiscoveryClient discoveryClient; ===>存储本地服务列表信息,根据服务名获取服务列表
05.SpringCloud提供的负载均衡组件
- 添加依赖
- 在RestTemplate对象中添加@LoadBalanced===>给RestTemplate添加拦截器,在发送请求前将服务名替换成的具体IP地址
- 在程序中 写这样的地址 http://product-service/product/get?pid=1
- 可以修改负载均衡策略,在配置类添加负载均衡的bean
06.远程调用组件Feign
- 调用远程接口像调用本地代码一样.
- 定义接口,在接口上定义@FeignClent(name=“product-service”,path=“/product”)
/**
name: 定义远程调用服务明后才能
path: 远程访问路径前缀
*/
@FeignClient(name = “product-service”,path = “/product”)
public interface ProductFeignApi {
//具体的地址信息
@RequestMapping(“/get”)
//定义参数的名称
Product get(@RequestParam(“pid”) Long pid);
}
工作原理: 通过动态代理+反射的方式,拼接成远程调用的服务的地址,底层httpURLConnection,发送请求,访问远程接口. (面试可能问到)
07.服务雪崩的问题
- 由于微服务众多,中间存在相互调用关系. 如果某个微服务出现问题,导致其他微服务调用,出现请求阻塞,导致资源被耗尽,出现连锁反应,导致所有的微服务都不可用.
- 常见容错机制
- 资源的隔离 (并不会把所有的资源都分配给某一个微服务)
- 超时机制(当服务调用长时间没有响应,可以主动断开请求,这个线程就可以重新接受其他请求)
- 限流操作(对服务器提前做压测,了解服务器的情况,对服务接口做限流,保护系统)
- 熔断机制(对服务器做监控,当CPU,内存,响应时间,错误率,错误数达到设定的阈值,此时服务器压力很大了,主动熔断)
- 降级机制(当调用其他服务,其他服务不可用的情况下,此时为了用户体验感更好些,走本地的备用方案)