微服务注册中心

服务拆分及远程调用

  • 服务拆分
  • 服务间调用
在进行开发的时候,微服务随着代码复杂度的提升按照业务功能进行拆分。
在单体架构中,例如说查询订单详情,且订单详情中还要包含用户信息,那么在查询中按照商品id数据库中查询到商品信息,然后用户id拿到用户信息,最后返回。
微服务注册中心
文章图片

但是在微服务中这样是不可以的,因为不够满足单一职责,也就是说在进行服务拆分之后,用户服务查询用户信息,商品服务查询商品信息,那么要给前端返回商品信息和用户信息,给过来商品id,从商品服务中查询到商品信息,然后商品服务调用户服务,查询到用户信息,也就是要进行服务间调用。
微服务注册中心
文章图片

上面说明也就是说不同微服务,不要重复开发相同的业务, 如果多个服务中出现相同的业务逻辑,那么就是微服务拆分不合理的讯息。
如果每个微服务都有自己的数据库,那么从根本上杜绝了不同服务之间出现相同业务逻辑的问题。
【微服务注册中心】微服务注册中心
文章图片

如下我们创建用户服务和订单服务,业务逻辑上拆分不同服务,数据库中也存放不同的数据。
微服务注册中心
文章图片

总结起来3点
  • 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同的业务
  • 微服务将业务暴露接口,供其他微服务使用
  • 不同为服务都应该有自己的数据库
服务的提供者消费者 Eureka 注册中心 再样例中,首先使用到RestTemplate 硬编码HOST:IP 调用服务,这种方式会添加人为的维护。所以采用硬编码方式是low的。
假如更加复杂的情况下,如果有多个服务提供者,如果使用硬编码方式,那么我该调用哪个呢?在复杂的情况,假如一个服务提供者挂了,采用硬编码的方式就会发生恰好访问这个服务的问题。所以这里采用硬编码方式就会有几个问题
  • 服务消费者如何获取服务提供者的地址信息
  • 如果多个服务提供者,消费者该如何选择呢
  • 消费者如何得知服务提供者的健康状况
Eureka 就能解决这个问题。其作用就是一个注册中,其他服务都是Eureka 的客户端,在其他每个服务启动的时候会将自己的信息注册到注册中心,这些信息包括:
  1. 服务名字
  2. 服务地址
这个时候Order 服务想要去访问User 那么Order 去注册中心获取User 的信息,假如拿到User 有三个实例,然后在使用负载均衡收到去访问其中的一个。
Eureke 能够保证其存储的服务信息是有效的信息,这些信息都是客户端实时发送自己信息到注册中心。
所以有了Eureka上面三个问题就能得到解决
  • 服务消费者如何获取服务提供者的地址信息
    1. 服务提供者启动时候就会向注册中心注册自己信息
    2. eureka 保存这些信息
    3. 消费者根据服务名称向eureka 拉起服务提供者的信息
  • 如果多个服务提供者,消费者该如何选择呢
    服务消费者利用负载均衡算法,从服务列表中挑选出一个
  • 消费者如何得知服务提供者的健康状况
    1. 服务提供者会每隔30s向注册中心发送心跳请求,报告健康状态
    2. 注册中心会更新记录列表信息,心跳不正常会被踢出
    3. 消费者就可以拉取到最新的信息
微服务注册中心
文章图片

Rebion 如何做负载均衡
  1. 请求发出前拦截
  2. 根据域名从注册中心获取访问服务的ip
  3. 获取到ip:port 发起服务调用
微服务注册中心
文章图片

Irule 中有各种的负载均衡策略,也可以自定义负载均衡策略
可以使用的负载均衡策略有:
微服务注册中心
文章图片

Nacos 注册中心 NacosSpringCloudAlibaba 的产品。
Eureka 强大。
  • 注册中心
  • 动态DNS
  • 动态配置服务
  • 服务元数据管理
Nacos 服务分级存储模型 防止出现跨地域访问
微服务注册中心
文章图片

  • Nacos 也有基于地域优先级的负载均衡策略:
    微服务注册中心
    文章图片
  • 根据权重负载均衡
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
微服务注册中心
文章图片

以上的配置均在Nacos 中完成,并不需要代码的改动,所以代码不需要重启。
权重设置
  • Nacos控制台可以设置实例的权重值,0~1之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为0则完全不会被访问
Nacos 环境隔离
Nacos 既是一个注册中心,也是一个数据中心。
  • Namespace
    同一个命名空间中还有Group,Group 之下才是服务/数据
微服务注册中心
文章图片

Namespace 主要是用来做环境的隔离,如生产环境/开发环境等。
每个namespace都有唯一id
服务设置namespace时要写id而不是名称
不同namespace下的服务互相不可见
临时实例:默认都是临时实例,这是可以在nacos 客户端配置的,临时实例和非临时实例在心跳机制是不一样的。
非临时实例:nacos 主动取发送请求获取服务信息,且实例不会被剔除,只会被标记为不健康
临时实例:服务主动将心跳上报 nacos,当心跳不在发送,那么nacos 会将实例剔除
注册中心采用主动推送的方式将实例信息发送到实例
微服务注册中心
文章图片

笔记来源于:黑马程序员微服务课程,非常不错课程,你值得拥有。

    推荐阅读