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