一、两种应用间的通信方式
二、Spring Cloud中两种restful调用方式:(示例:用订单服务调用商品服务的接口)
2.1 Spring Cloud中第一种restful调用方式:如下的示例,把商品服务理解为Server端,订单服务理解为Client端:用RestTemplate去调用另一个服务,这种的缺陷在于要硬编码url
2.2 Spring Cloud中第二种restful调用方式:通过loadBananceClient
!(1)查看Eureka中的服务,此时Product有两个服务
2.3 Spring Cloud中第三种restful调用方式:
三、负载均衡器:Ribbon
客户端向服务器,例如Eureka Server拉取可利用的服务,然后根据负载均衡策略直接命中 哪台服务器访问请求,整个过程都是在客户端进行的,SPring Cloud的客户端组件就是Ribbon组件,在二中实例中使用LoadBance注解或者LoadBananceClient,用到的就是Ribbon组件。添加LoadBalance注解后,Ribbon会基于某种规则自动实现负载均衡算法
-
通过ServerList发现所有可用的服务,通过ServerListFilter剔除无效的服务,然后通过IRule选择合适的服务
四、追踪负载均衡源码
五、使用Feign来实现应用间的通信
-
1、在调用方引入依赖(这里就是Order)
-
2、在调用启动类上加注解
-
3、定义调用哪些接口
-
4、使用服务端的方法
六、实战:在订单端调用商品的服务
6.1 开发商品的业务
6.2订单端调用
6.3调用接口
七、扣库存
八、解决问题:虽然实现了功能,在订单中调用商品服务,但是还是有如下的问题
8.1 服务端(Product暴漏了服务端的实体类(ProductInfo),这在远程调用里是不被允许的
8.2 客户端重复定义服务端的类(客户端调用服务端,客户端需要依赖服务端的部分类,之前的解决方案是重复定义一遍,这是十分不好的。对象属于哪个服务就在哪个地方定义)
8.3为了使用FeignClient,将服务端的接口定义在客户端里。这显然是不合理的。服务端应该定义接口,客户端直接调用即可。
8.4为了解决如上的问题,将服务端抽象为三个模块。
- productServer:所有的业务逻辑,Controller、Service
- productClient:对外暴漏的接口
-
productCommon:被外部服务调用也会被自己调用的对象。
九、异步服务调用