一、微服务理解
个人理解:微服务的出现和流行并不是因为技术的原因,更多的是因为便于管理,将不同项目分作很多个服务,服务和服务之间再调用;
**原因:**在之前的项目都是大单体项目,项目用人多,修改模块自然也多,模块的部署时间等等要求也不同,所以拆分成不同的服务,每个团队各负责各的项目,就容易管理了。
就我所在团队使用的微服务,作为典型的一个SpringBoot微服务框架,从服务注册中心、服务配置中心、网关服务、以及服务集群中的服务,当然这里边的服务治理还包括,网关健康检查、负载均衡、容器云技术、熔断等的学习是有必要的。
二、微服务之间的最佳调用方式
服务和服务之间的沟通,相互调用就是一个重要的一环。
调用方式有俩中:RPC方式、事务驱动方式(消息发送方式包含事件通知、事件溯源)
**事件通知方式:**一个例子比如网购,我选购商品加入购物车,
动作1:商品进行结账(Checkout),生成一个结算动作的命令(Order Placed)发送
动作2:支付(Payment)动作收到消息后,接收用户信息(就是钱),服务完成后返回“支付收到”(Payment received)。
动作3:仓库的存货清单(Inventory)收到支付信息后,取货,并返回信息取货完成信息(Goods fetched)
动作4:接下来要运走货物,(shipment)得到取货成功信息后,发货,并返回信息给用户“商品已发货”(Goods shipped)。
RPC方式:搜罗其他博客找到的
三、总结
微服务之间的调用有两种方式,RPC和事件驱动,其中事件驱动分为事件通知和事件溯源。
事件驱动是更好的方式,因为它是松耦合的。
但如果业务逻辑是紧耦合的,RPC方式也是可行的(它的好处是代码更简单),而且你还可以通过选取合适的协议(Protobuf gRPC)来降低这种紧耦合带来的危害。
四、@FeignClient注解应用(RPC方式)
在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients 注解开启对 Feign Client 扫描加载处理。根据 Feign Client 的开发规范,定义接口并加 @FeignClients 注解。
当程序启动时,会进行包扫描,扫描所有 @FeignClients 的注解的类,并将这些信息注入 Spring IOC 容器中。当定义的 Feign 接口中的方法被调用时,通过JDK的代理的方式,来生成具体的 RequestTemplate。当生成代理时,Feign 会为每个接口方法创建一个 RequetTemplate 对象,该对象封装了 HTTP 请求需要的全部信息,如请求参数名、请求方法等信息都是在这个过程中确定的。
然后由 RequestTemplate 生成 Request,然后把 Request 交给 Client 去处理,这里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最后 Client 被封装到 LoadBalanceclient 类,这个类结合 Ribbon 负载均衡发起服务之间的调用。