目录
- 什么是 Spring Cloud
- 了解注册中心
- 挑选合适的注册中心
- 快速上手实践
什么是 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 间的请求,如果没有得到回应,可能是两种情况:
- 服务不可用,比如宕机,下线。
- 服务在忙,这个业务的流量比较大。
运维同学又需要对业务缝缝补补。那再加上一致性,感觉天塌了。
有没有一款一站式解决上方烦恼的好法子呢?有,就是本篇主角:注册中心。
只有服务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 作为本次实践的技术栈。
快速上手实践
搭建 Nacos
作为初次尝试,并不需要将 Nacos 嵌入到服务中,直接下载官方的Release包即可。解压后,的格式如下:
Nacos 2.4.3
│ LICENSE
│ NOTICE
├─bin 服务启停
├─conf 配置信息
└─target 生成的jar包
如果是 Windows 直接双击/bin/startup.cmd会得到以下结果
最后启动失败,黑框消失。
错误排查
黑框的提示中,上述方式启动,是以 集群(cluster)方式启动的,并且 IP 地址为空。
细节也可以根据日志文件来观察logs/nacos.log来查看。
回看官方的教学,正确单机打开方式是这样:
startup.cmd -m standalone
Windows 在对应目录按住 Shift + 鼠标右键,即可在当前目录下唤出命令行工具。
家用电脑还会出现如下的错误:
命令前追加./即可,完整命令如下:
./startup.cmd -m standalone
观察控制台
Nacos准备了一个以 8848 为端口的网页控制台:方便运维。在链接上按住 Ctrl + 鼠标左键 进入。
控制台权限很大,上线请配置安全访问。后续介绍。
注册与订阅
Nacos 来自 Spring cloud alibaba 体系,所以以下项目以来也围绕该体系来搭建。
截止 2024年11月6日,最新依赖如下:
| 框架 | 版本 |
|---|---|
| Spring Cloud Alibaba | 2023.0.1.0 |
| Spring Cloud | 2023.0.1 |
| Spring Boot | 3.2.4 |
| Nacos | 2.3.0 |
初始化与注册
Spring 官方的启动器是没有直接添加 Nacos 的,可以选择在 maven 仓库搜索或者使用国内的启动器。
⚠️版本有一定出入,自行更改
除了基础的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 面板的 服务管理/服务列表下可以找到对应服务。
发现服务
通过 Nacos 控制台,可以点击查询按钮,来重新检索。使用F12打开查看调用的API。
| key | value |
|---|---|
| 请求 URL | xxxx: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;
使用终端测试一下
到这里,算是成功访问。
开启保护
开头我们提到,现在的Nacos是没有开启登录控制的,控制台也给出了提示。点进去即可查看原因。
省流:2.2.2之后默认关闭,使用配置即可开启,默认访问用户是nacos/nacos
最后
本篇只是笔者在微服务上的自行探索,个别资料过于浅显,完整的内容请参照官方文档!