![深入理解Spring Cloud与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/869/41202869/b_41202869.jpg)
2.2 使用Alibaba Nacos体验第一个Spring Cloud微服务应用
Nacos是阿里巴巴集团在2018年7月开源的一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台,其在2019年4月发布了1.0.0 GA版本,可大规模投入生产环境使用。随着Spring Cloud Alibaba融入Spring Cloud生态,在Spring Cloud的注册中心选型上可以使用Nacos作为注册中心。
Nacos的架构如图2-6所示。其中,Provider应用注册服务到Nacos注册中心,Consumer从Nacos注册中心订阅服务。Nacos提供的Nacos Console可以完成各种运维操作。核心模块Nacos Server由以下4部分组成:
·Open API暴露各种操作,客户端可以调用Open API完成各项事宜。
·Config Service和Naming Service分别对应配置功能及服务注册/发现功能。
·Nacos Core是整个Nacos Server的核心,上层的Config Service和Naming Service底层都依赖Nacos Core。
·Nacos Core底层提供一致性协议算法。
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_50_1.jpg?sign=1739606537-UzwVI8czw6Ww6p9VdG7PApGJ3TOwIaRj-0-f5788beeee856898b528f9d8dbbcd528)
图2-6
2.2.1 下载并启动Nacos Server
进入Nacos的GitHub主页后打开releases页,就会显示所有版本的Nacos信息,如图2-7所示。
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_50_2.jpg?sign=1739606537-rX1fjt8XQk3Q6LM0jHdsDwL6zTOaCYnQ-0-a2f624f2c81746a4dc9d448637181e5e)
图2-7
下面以 Nacos 1.1.4 为例进行说明,下载完成后进行解压,解压后的 Nacos 目录结构如下:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_50_3.jpg?sign=1739606537-fqI8HSKZKnjk48o1oOBjg4EoJG1LDlMz-0-4ea9bec5397767b674f888d755521fa2)
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_51_1.jpg?sign=1739606537-g6JR3GKFQzuKuPQW5NyF1zKOfEkEKqWY-0-cc62c49feff3fc03759f996fb50b86ca)
其中:
·LICENSE表示开源协议,Nacos使用的是Apache-2.0协议。
·NOTICE表示注意点,包含 Nacos开发团队所使用的开源协议、使用了第三方的一些类库等信息。
·bin目录中是一些可执行文件,比如,startup.sh/shutdown.sh表示UNIX系统下的启动/关闭脚本,startup.cmd/shutdown.cmd表示Windows系统下的启动/关闭脚本。
·conf目录存放配置文件,包含Nacos日志级别、数据库相关配置、集群等相关配置、启动端口等。
·target目录存放Nacos生成的一些可执行文件,比如nacos-server.jar。startup.sh文件内部就会执行nacos-server.jar。
下载完Nacos之后,以单机部署的模式进行启动:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_51_2.jpg?sign=1739606537-veSn7Ju1LXB0Kkkqfbyp9tXjuF6xcYbB-0-c22c6879d53be9dec850339edb722bdf)
启动成功之后,使用浏览器访问http://localhost:8848 (默认端口是8848,可以通过conf/application.properties配置文件修改 server.port配置项改变端口号)。然后使用默认的账号和密码(nacos/nacos)进入控制台(默认情况下,如果要使用Nacos上的生产环境,建议将内置的Derby内存数据库更改成MySQL数据库),如图2-8所示。
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_51_3.jpg?sign=1739606537-9Gy7fsIQlqrVu4s9FJuPzspF1W7aJMOQ-0-5a45cb15235cab81e39ed7727458c6c4)
图2-8
2.2.2 启动Nacos Discovery Provider进行服务注册
在 Java 工程脚手架上选择 Nacos Service Discovery 和 Spring Web 模块,并创建 spring-cloud-alibaba-nacos-provider项目。
提示:Java 工程脚手架是适合中国开发者的 Spring Initializr 代码框架生成器,自带Demo Code,省去搜索引擎检索等复杂动作;有完善的工具链、免费的 IDEA插件,方便直接在IDE中生成,更适合国内用户的网络环境。
新建NacosProvider启动类:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_52_1.jpg?sign=1739606537-qqhPtpcNe0A54wjLaGjBMgz0jueXE33o-0-876de5168d3b80366c2cd115e05dd393)
上述代码中:
① 配合@SpringBoot注解启动一个Spring Boot应用。
②使用@RestController定义一个EchoController。
③/echo是EchoController对外暴露的访问路径。
④/echo返回"echo:#{name参数}"。
application.properties配置文件如下:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_53_1.jpg?sign=1739606537-2U2NdP9SxM8EVHpFqijYHniftzM9Ci1n-0-94977c7486c1ad846e2181884a942a9b)
启动NacosProvider后在应用控制台可以发现nacos-provider服务成功注册到Nacos的日志:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_53_2.jpg?sign=1739606537-flMbUdNNrWCu3s4bwHMLe2lLM86DJ87D-0-64e2b2085580913f76b6809cda6dbb34)
在Nacos控制台上也看到了服务注册成功的提示,如图2-9所示。
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_53_3.jpg?sign=1739606537-dbiYF3NcVx9DkJel7v21lvokSn5qTa00-0-1c799f7127660c8ff6b250102ad2eb23)
图2-9
2.2.3 启动Nacos Discovery Consumer进行服务发现
同样,在 Java 工程脚手架上选择 Nacos Service Discovery 和 Spring Web 模块,创建spring-cloud-alibaba-nacos-consumer项目。
新建NacosConsumer启动类:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_53_4.jpg?sign=1739606537-PxNumlQtcUF7hgoL7VCfceaF5wUSSQjT-0-fa0b67eb81be523f49e50828c258745f)
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_54_1.jpg?sign=1739606537-JrSG7wT4TwrqzfK9xcCeEiVFFBKeZwa9-0-ad1a9dc756c7fc438d94e1e43cfaf4bb)
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_55_1.jpg?sign=1739606537-vk63KG5Z9BagUiYBdsdl54BOOaQc2sHc-0-b43a5f4421d239dc0eeec841c34ff792)
上述代码中:
① 这是一个Consumer应用,设置不自动注册到注册中心。
②构造一个RestTemplate,后续用于访问HTTP服务。
③在HelloController中自动注入DiscoveryClient,这是Spring Cloud Commons模块提供的一个服务发现接口,Spring Cloud Alibaba Nacos Discovery模块内部会初始化一个它的实现类—NacosDiscoveryClient,用于后续的服务发现操作。
④在HelloController中注入前面构造的RestTemplate。
⑤使用DiscoveryClient获取my-provider服务对应的所有实例。
⑥使用lambda遍历获取的所有实例,去获取各个实例里的host和port信息。
⑦ 从所有的服务实例列表中任意获取一个,如果没有服务实例,则抛出 IllegalStateException异常。
⑧使用RestTemplate调用服务实例对应的节点信息中的/echo方法。
application.properties配置文件如下:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_55_2.jpg?sign=1739606537-O4UoA0rEDhwxDWy7ScCXEd3qAOCXBXQz-0-459f2a7409ca61ced0d5d55b72a97891)
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_56_1.jpg?sign=1739606537-rscykCYRyel4agzZM62srYXIWQk5UOHn-0-2bb17c4c11fd8f51bbd4d7a687c22259)
启动NacosConsumer后访问http://ip:port/8081/info,返回内容如下:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_56_2.jpg?sign=1739606537-L6HASIQSNfrFMlHMtHsYoKLiQgmBDS9E-0-9cafd8842b81ff1229533b4f2ed1b65a)
访问http://ip:port/8081/hello后,返回内容如下:
![](https://epubservercos.yuewen.com/8E18D1/21440186401518706/epubprivate/OEBPS/Images/39973_56_3.jpg?sign=1739606537-ZGtszzwRqW9mdqMjvBhgnYxqjaUi5B2B-0-c2618d35f229f6ed569c549e72b20da2)