服务拆分及远程调用
- 服务拆分
- 服务间调用
在单体架构中,例如说查询订单详情,且订单详情中还要包含用户信息,那么在查询中按照商品id数据库中查询到商品信息,然后用户id拿到用户信息,最后返回。
文章图片
但是在微服务中这样是不可以的,因为不够满足单一职责,也就是说在进行服务拆分之后,用户服务查询用户信息,商品服务查询商品信息,那么要给前端返回商品信息和用户信息,给过来商品id,从商品服务中查询到商品信息,然后商品服务调用户服务,查询到用户信息,也就是要进行服务间调用。
文章图片
上面说明也就是说不同微服务,不要重复开发相同的业务, 如果多个服务中出现相同的业务逻辑,那么就是微服务拆分不合理的讯息。
如果每个微服务都有自己的数据库,那么从根本上杜绝了不同服务之间出现相同业务逻辑的问题。
【微服务注册中心】
文章图片
如下我们创建用户服务和订单服务,业务逻辑上拆分不同服务,数据库中也存放不同的数据。
文章图片
总结起来3点
- 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同的业务
- 微服务将业务暴露接口,供其他微服务使用
- 不同为服务都应该有自己的数据库
RestTemplate
硬编码HOST:IP
调用服务,这种方式会添加人为的维护。所以采用硬编码方式是low的。假如更加复杂的情况下,如果有多个服务提供者,如果使用硬编码方式,那么我该调用哪个呢?在复杂的情况,假如一个服务提供者挂了,采用硬编码的方式就会发生恰好访问这个服务的问题。所以这里采用硬编码方式就会有几个问题
- 服务消费者如何获取服务提供者的地址信息
- 如果多个服务提供者,消费者该如何选择呢
- 消费者如何得知服务提供者的健康状况
Eureka
就能解决这个问题。其作用就是一个注册中,其他服务都是Eureka
的客户端,在其他每个服务启动的时候会将自己的信息注册到注册中心,这些信息包括:- 服务名字
- 服务地址
Order
服务想要去访问User
那么Order
去注册中心获取User
的信息,假如拿到User
有三个实例,然后在使用负载均衡收到去访问其中的一个。且
Eureke
能够保证其存储的服务信息是有效的信息,这些信息都是客户端实时发送自己信息到注册中心。所以有了
Eureka
上面三个问题就能得到解决- 服务消费者如何获取服务提供者的地址信息
- 服务提供者启动时候就会向注册中心注册自己信息
eureka
保存这些信息- 消费者根据服务名称向
eureka
拉起服务提供者的信息
- 如果多个服务提供者,消费者该如何选择呢
服务消费者利用负载均衡算法,从服务列表中挑选出一个
- 消费者如何得知服务提供者的健康状况
- 服务提供者会每隔30s向注册中心发送心跳请求,报告健康状态
- 注册中心会更新记录列表信息,心跳不正常会被踢出
- 消费者就可以拉取到最新的信息
文章图片
Rebion 如何做负载均衡
- 请求发出前拦截
- 根据域名从注册中心获取访问服务的ip
- 获取到ip:port 发起服务调用
文章图片
Irule 中有各种的负载均衡策略,也可以自定义负载均衡策略
可以使用的负载均衡策略有:
文章图片
Nacos 注册中心
Nacos
是 SpringCloudAlibaba
的产品。比
Eureka
强大。- 注册中心
- 动态DNS
- 动态配置服务
- 服务元数据管理
Nacos
服务分级存储模型
防止出现跨地域访问文章图片
- Nacos 也有基于地域优先级的负载均衡策略:
文章图片
- 根据权重负载均衡
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
文章图片
以上的配置均在Nacos 中完成,并不需要代码的改动,所以代码不需要重启。
权重设置
- Nacos控制台可以设置实例的权重值,0~1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
Nacos 既是一个注册中心,也是一个数据中心。
- Namespace
同一个命名空间中还有Group,Group 之下才是服务/数据
文章图片
Namespace 主要是用来做环境的隔离,如生产环境/开发环境等。
每个namespace都有唯一id
服务设置namespace时要写id而不是名称
不同namespace下的服务互相不可见
临时实例:默认都是临时实例,这是可以在nacos 客户端配置的,临时实例和非临时实例在心跳机制是不一样的。
非临时实例:nacos 主动取发送请求获取服务信息,且实例不会被剔除,只会被标记为不健康
临时实例:服务主动将心跳上报 nacos,当心跳不在发送,那么nacos 会将实例剔除
注册中心采用主动推送的方式将实例信息发送到实例
文章图片
笔记来源于:黑马程序员微服务课程,非常不错课程,你值得拥有。
推荐阅读
- Spring认证中国教育管理中心-Spring Data Elasticsearch教程二
- Spring IoC
- 谈谈我自己理解的Spring为什么一定要用三级缓存
- (为什么在 Spring 的配置里,最好不要配置 xsd 文件的版本号)