Spring Cloud 快速上手(一)服务的注册与发现

231 阅读6分钟

目录

  1. 什么是 Spring Cloud
  2. 了解注册中心
  3. 挑选合适的注册中心
  4. 快速上手实践

什么是 Spring Cloud

在 2005 年的 Web Services Edge,微服务一词首次提出。当然,理论与落地有一定差距,所以接下来的十年,都没有什么起色。很大一部分原因是大多数人对它的感觉就是对SOA架构的缝缝补补。

在 2014 年,又一篇论文提出《Microservices: a definition of this new architectural term》,人们开始对微服务这些概念开始有了一定认知。作为 Web 领域开发的佼佼者,Java 体系也推出了它的一个微服务规范: Spring Cloud。它包含了一系列的技术解决方案,下面是一个来自官网的架构图:

本篇从最右边的服务注册中心 (Service Registry)介绍。

了解注册中心

微服务突出一个“”字,所以在第一感官上,有很多独立项目。各个项目间代码隔离,但业务有关联。从原有的代码上下文,变成了独立服务。对于服务间的调用,异常处理,数据一致就成了麻烦事。

假设有现在有服务A,需要请求服务B。很简单,只要双方协商一个IP地址和端口等一系列协议就好。但一个服务又不止一台机器,这里简单的协议可能不太够用了。在很多方案参考里,经常听到这样一句话:在计算机领域中的任何问题,都可以通过加一个中间件来解决。

这里可以是一个网关,可以是一个VIP等。

VIP: 虚拟IP地址

有了地址还不够,还需要异常容错。还是 A 与 B 间的请求,如果没有得到回应,可能是两种情况:

  • 服务不可用,比如宕机,下线。
  • 服务在忙,这个业务的流量比较大。

运维同学又需要对业务缝缝补补。那再加上一致性,感觉天塌了。

有没有一款一站式解决上方烦恼的好法子呢?有,就是本篇主角:注册中心。

image.png

只有服务A和服务B,则呈现图中所示。多节点情况下,数据一致性(Consistency)对于不同的业务来说是不同的。比如社交媒体需要强一致性,一些分布式文件系统中不那么看中它,反而更想要可用性(Availability)。

由此,便引出了分布式系统中的一个重要概念:CAP定理。

微服务也属于分布式。P代表分区容忍性,Partition Tolerance

挑选合适的注册中心

开篇提到,Spring Cloud 是一个技术集,在每个领域也都有多种技术实现。为了挑选一个适合的注册中心,需要去结合当前业务能力,团队技术水平等综合挑选。当然,在这些准备前,需要对现在的技术展开一些调研。

  • Zookeeper

Zookeeper 严格来说并不算一个注册中心,不过可以用一些技术实现。

  • Eureka

Netflix 开源的服务发现组件,很注重可用性。但在 2.0 后不再更新。

  • Nacos

Nacos 是 Dynamic Naming and Configuration Service的缩写,由阿里开源。明显看到它以“动态”为特点。

  • Consul

Spring 官网推荐的 CP 类的注册中心,算作作为 Eureka 的替代。

  • Etcd

由 go 语言实现,如果想要更深入开发,需要团队了解 go。

综上,选择 Nacos 作为本次实践的技术栈。

快速上手实践

实践.png

搭建 Nacos

作为初次尝试,并不需要将 Nacos 嵌入到服务中,直接下载官方的Release包即可。解压后,的格式如下:

Nacos 2.4.3
│  LICENSE
│  NOTICE
├─bin 服务启停
├─conf 配置信息
└─target 生成的jar包

如果是 Windows 直接双击/bin/startup.cmd会得到以下结果

image.png

最后启动失败,黑框消失。

错误排查

黑框的提示中,上述方式启动,是以 集群(cluster)方式启动的,并且 IP 地址为空。 细节也可以根据日志文件来观察logs/nacos.log来查看。

回看官方的教学,正确单机打开方式是这样:

startup.cmd -m standalone

Windows 在对应目录按住 Shift + 鼠标右键,即可在当前目录下唤出命令行工具。 家用电脑还会出现如下的错误:

image.png

命令前追加./即可,完整命令如下:

./startup.cmd -m standalone

观察控制台

Nacos准备了一个以 8848 为端口的网页控制台:方便运维。在链接上按住 Ctrl + 鼠标左键 进入。

image.png

控制台权限很大,上线请配置安全访问。后续介绍。

image.png

注册与订阅

Nacos 来自 Spring cloud alibaba 体系,所以以下项目以来也围绕该体系来搭建。

截止 2024年11月6日,最新依赖如下:

框架版本
Spring Cloud Alibaba2023.0.1.0
Spring Cloud2023.0.1
Spring Boot3.2.4
Nacos2.3.0

初始化与注册

Spring 官方的启动器是没有直接添加 Nacos 的,可以选择在 maven 仓库搜索或者使用国内的启动器。

image.png ⚠️版本有一定出入,自行更改

除了基础的Spring boot依赖,还需要Nacos

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

并且手动添加本机,注册中心的配置。src/main/resources/application.properties

spring.application.name=server-a
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
server.port=18083

同样的,服务B也是这样配置,注意端口。

启动后,即可在 Nacos 面板的 服务管理/服务列表下可以找到对应服务。

image.png

发现服务

通过 Nacos 控制台,可以点击查询按钮,来重新检索。使用F12打开查看调用的API。

keyvalue
请求 URLxxxx:8848/nacos/v1/ns/catalog/services?hasIpCount=false&withInstances=false&pageNo=1&pageSize=10&serviceNameParam=&groupNameParam=&namespaceId=
请求方法:GET
状态代码:200

返回值

{
    "count": 2,
    "serviceList": [
        {
            "name": "server-a",
            "groupName": "DEFAULT_GROUP",
            "clusterCount": 1,
            "ipCount": 1,
            "healthyInstanceCount": 1,
            "triggerFlag": "false"
        },
        {
            "name": "server-b",
            "groupName": "DEFAULT_GROUP",
            "clusterCount": 1,
            "ipCount": 1,
            "healthyInstanceCount": 1,
            "triggerFlag": "false"
        }
    ]
}

服务端也可以使用一些框架来调用,本次使用官方的API。为了简化调用流程,在服务 B 添加Controller 内部使用逻辑获取服务A信息。

NamingService namingService = NamingFactory.createNamingService("localhost:8848");
Instance instance = namingService.selectOneHealthyInstance("server-a");
String url = "http://" + instance.getIp() + ":" + instance.getPort();
return "hello, 我在" + url;

使用终端测试一下

image.png

到这里,算是成功访问。

开启保护

开头我们提到,现在的Nacos是没有开启登录控制的,控制台也给出了提示。点进去即可查看原因。

省流:2.2.2之后默认关闭,使用配置即可开启,默认访问用户是nacos/nacos

最后

本篇只是笔者在微服务上的自行探索,个别资料过于浅显,完整的内容请参照官方文档!