SA实战 ·《SpringCloud Alibaba实战》服务治理(一)

Pike_Chen
发布于 2022-5-31 16:31
浏览
0收藏

 

大家好,我是冰河~~

注意:本项目完整源码加入 冰河技术 知识星球即可获取,文末有优惠券。
在《SpringCloud Alibaba实战》专栏的《SA实战 ·《SpringCloud Alibaba实战》快速搭建三大微服务并完成交互开发与测试》一文中,我们初步实现了用户微服务、商品微服务和订单微服务之间的交互。

 

但是在实现的过程中,存在一个很明显的问题:那就是将用户微服务所在的IP和端口,以及商品微服务所在的IP和端口硬编码到订单微服务的代码中了。这样的做法存在着非常多的问题。

硬编码的问题

 

如果将用户微服务和商品微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题,其中,最明显的问题有三个,如下所示。

(1)如果用户微服务和商品微服务的IP地址或者端口号发生了变化,则订单微服务将变得不可用,需要对同步修改订单微服务中调用用户微服务和商品微服务的IP地址和端口号。

(2)如果系统中提供了多个用户微服务和商品微服务,则无法实现微服务的负载均衡功能。

(3)如果系统需要支持更高的并发,需要部署更多的用户微服务和商品微服务以及订单微服务,如果将用户微服务和商品微服务的IP地址和端口硬编码到订单微服务,则后续的维护会变得异常复杂。

所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

服务治理
如果系统采用了微服务的架构模式,随着微服务数量的不断增多,服务之间的调用关系会变得纵横交错,以纯人工手动的方式来管理这些微服务以及微服务之间的调用关系是及其复杂的,也是极度不可取的。

所以,需要引入服务治理的功能。服务治理也是在微服务架构模式下的一种最核心和最基本的模块,主要用来实现各个微服务的自动注册与发现。

引入服务治理后,微服务项目总体上可以分为三个大的模块:服务提供者、服务消费者和注册中心,三者的关系如下图所示。

SA实战 ·《SpringCloud Alibaba实战》服务治理(一)-鸿蒙开发者社区

 

(1)服务提供者会将自身提供的服务注册到注册中心,并向注册中心发送心跳信息来证明自己还存活,其中,心跳信息中就会包含服务提供者自身提供的服务信息。

(2)注册中心会存储服务提供者上报的信息,并通过服务提供者发送的心跳来更新服务提供者最后的存活时间,如果超过一段时间没有收到服务提供者上报的心跳信息,则注册中心会认为服务提供者不可用,会将对应的服务提供者从服务列表中剔除。

(3)服务消费者会向注册中心订阅自身监听的服务,注册中心会保存服务消费者的信息,也会向服务消费者推送服务提供者的信息。

(4)服务消费者从注册中心获取到服务提供者的信息时,会直接调用服务提供者的接口来实现远程调用。

这里需要注意的是:服务消费者一般会从注册中心中获取到所有服务提供者的信息,根据具体情况实现对具体服务提供者的实例进行访问。

注册中心
从上面的分析可以看出,微服务实现服务治理的关键就是引入了注册中心,它是微服务架构模式下一个非常重要的组件,主要实现了服务注册与发现,服务配置和服务的健康检测等功能。

服务注册与发现
(1)服务注册:注册中心提供保存服务提供者和服务消费者的相关信息。

(2)服务发现:也可以理解为服务订阅,服务调用者也就是服务消费者,向注册中心订阅服务提供者的信息,注册中心会向服务消费者推送服务提供者的信息。

服务配置
(1)配置订阅:服务的提供者和消费者都可以向注册中心订阅微服务相关的配置信息。

(2)配置下发:注册中心能够将微服务相关的配置信息主动推送给服务的提供者和消费者。

服务健康检测
注册中心会定期检测存储的服务列表中服务提供者的健康状况,例如服务提供者超过一定的时间没有上报心跳信息,则注册中心会认为对应的服务提供者不可用,就会将服务提供者踢出服务列表。

常见的注册中心
能够实现注册中心功能的组件有很多,但是常用的组件大概包含:Zookeeper、Eureka、Consul、Etcd、Nacos等。这里,就给大家简单介绍下这些能够实现注册中心功能的框架或组件。

(1)Zookeeper

接触过分布式或者大数据开发的小伙伴应该都知道,Zookeeper是Apache Hadoop的一个子项目,它是一个分布式服务治理框架,主要用来解决应用开发中遇到的一些数据管理问题,例如:分布式集群管理、元数据管理、分布式配置管理、状态同步和统一命名管理等。在高并发环境下,也可以通过Zookeeper实现分布式锁功能。

(2)Eureka

Eureka是Netflix开源的SpringCloud中支持服务注册与发现的组件,但是后来闭源了。

(3)Consul

Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现、服务隔离、服务配置,这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。

(4)Etcd

etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在领导者节点中也可以容忍机器故障。

(5)Nacos

这里,我们重点说下Nacos。Nacos是阿里巴巴开源的一款更易于构建云原生应用的支持动态服务发现、配置管理和服务管理的平台,其提供了一组简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理,主要如下所示。

  • 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如IP地址、端口等信 息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
  • 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
  • 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
  • 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清 单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地存。
  • 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
    这里,我们选用的注册中心就是阿里巴巴开源的Nacos。

搭建Nacos环境
(1)到链接

https://github.com/alibaba/nacos/releases 下载Nacos的安装包,我这里下载的安装包为:nacos-server-1.4.3.zip。

(2)解压Nacos安装包,并在命令行进入到Nacos的bin目录下执行如下命令以单机的方式启动Nacos。

startup.cmd -m standalone

注意:如果需要以单机的方式启动Nacos,则需要添加 -m standalone 参数,否则,Nacos会以集群的方式启动。

(3)启动Nacos之后,在浏览器中输入链接http://localhost:8848/nacos 来访问Nacos的管理界面,默认的用户名和密码都是Nacos,如下所示。

SA实战 ·《SpringCloud Alibaba实战》服务治理(一)-鸿蒙开发者社区

 

输入用户名和密码进入Nacos的管理界面,如下所示。

SA实战 ·《SpringCloud Alibaba实战》服务治理(一)-鸿蒙开发者社区

 

这里,我们进入到Nacos的服务管理-服务列表菜单下,如下所示。

SA实战 ·《SpringCloud Alibaba实战》服务治理(一)-鸿蒙开发者社区

 

可以看到,在Nacos的服务管理-服务列表菜单下还没有任何服务,接下来,我们就对项目的代码进行改造。

集成Nacos注册中心
引入Nacos注册中心时,我们需要对项目的代码进行一定的改造,以便利用Nacos实现服务的注册与发现功能。

改造用户微服务
(1)在用户微服务的pom.xml文件中添加nacos的服务注册与发现依赖,如下所示。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)在用户微服务的resources目录下的application.yml文件中添加Nacos注册中心的服务地址配置,如下所示。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

(3)在用户微服务的启动类io.binghe.shop#UserStarter上标注@EnableDiscoveryClient注解,如下所示。

/**
 * @author binghe
 * @version 1.0.0
 * @description 启动用户服的类
 */
@SpringBootApplication
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan(value = { "io.binghe.shop.user.mapper" })
@EnableDiscoveryClient
public class UserStarter {

    public static void main(String[] args){
        SpringApplication.run(UserStarter.class, args);
    }
}

 

此时,就完成了对用户微服务的代码改造。

(4)启动用户微服务,并刷新Nacos页面,如下所示。

SA实战 ·《SpringCloud Alibaba实战》服务治理(一)-鸿蒙开发者社区

 

可以看到,用户微服务已经成功注册到Nacos中。

 

文章转自公众号:冰河技术

分类
已于2022-5-31 16:31:27修改
收藏
回复
举报
回复
    相关推荐