通过该教程,你将会:
- 使用 spring cloud alibaba 搭建一个最小化的微服务集群。
- 并完成客户端和服务端之间的调用示例。
案例学习时间预计15分钟左右。
本节,你将通过 git 命令下载程序代码,并启动 Nacos 服务端
请使用下面的命令获取客户端程序代码
cloudshell-git-open "https://start.aliyun.com/type=maven-project&language=java&architecture=none&bootVersion=2.3.4.RELEASE&baseDir=client&groupId=com.example&artifactId=client&name=client&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.client&packaging=jar&javaVersion=1.8&dependencies=sca-nacos-discovery,web,cloud-feign&demos=nacosdiscoveryconsumer/client.git" /home/shell/client
请使用下面的命令获取服务端程序代码
cloudshell-git-open "https://start.aliyun.com/type=maven-project&language=java&architecture=none&bootVersion=2.3.4.RELEASE&baseDir=server&groupId=com.example&artifactId=server&name=server&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.server&packaging=jar&javaVersion=1.8&dependencies=sca-nacos-discovery,web&demos=nacosdiscoveryprovider/server.git" /home/shell/server
通过如下命令启动服务端
sh /home/shell/sca_base_experience/prepare.sh
完成以上操作后,你将会获得链各个工程的代码,如下:
ls -l /home/shell/
drwxr-xr-x 5 shell shell 4096 Dec 15 14:26 client
drwxr-xr-x 3 shell shell 4096 Dec 15 14:26 sca_base_experience
drwxr-xr-x 5 shell shell 4096 Dec 15 14:26 server
通过如下命令观察nacos启动日志:
cat /home/shell/nacos/logs/start.out
待出现如下输出时,代表启动完成(如果未完成启动,可以重复执行上一条命令):
INFO Tomcat started on port(s): 65000 (http) with context path '/nacos'
......
INFO Nacos started successfully in stand alone mode. use embedded storage
本节,你讲修改代码的一些基本配置,让程序可以运行。
请认真按照本节的引导操作。在完成修改后,一定要记得保存哦。
-
打开 服务端的 application.properties 文件:
-
修改 Web 访问端口
将server.port
的值改为60000
(点我执行修改)
出于安全性和其他平台限制的考虑,目前外部只能使用6[0-5]000六个端口。 -
修改注册中心地址
将注册中心改为刚才启动的 Nacos 服务端的地址(点我执行修改)
-
打开 客户端的 application.properties 文件:
-
修改 Web 访问端口
将server.port
的值改为61000
(点我执行修改)
要避免和服务端发生端口冲突,而60000已经被分配给了服务端,这里就用61000。 -
修改注册中心地址
将注册中心改为刚才启动的 Nacos 服务端的地址(点我执行修改) -
修改OpenFeign方式调用的服务名称
打开文件 EchoService
将其中的nacos-discovery-provider-sample
替换为server
( 点我执行修改) -
修改RestTemplate方式调用的服务名称
打开文件 RestTemplateController
将其中的nacos-discovery-provider-sample
替换为server
( 点我执行修改)
对 EchoService 和 RestTemplateController 修改,会在下一节做详细说明;
本节主要是对内容的说明和介绍,没有对项目的操作内容;
在本案例中,服务端只提供一个服务,即:
EchoServiceController
该服务只有一个方法,接收字符串型的消息,并返回 "[ECHO] : " + message
内容。这里的逻辑实现,并不具有太多的业务意义,只是对服务端逻辑执行的演示。
可以看到, 在 EchoServiceController 上增加了 @RestController
注解。熟悉 spring 的同学应该知道,这代表了被标注类是一个 Rest 风格的 http 接口。
在 echo 方法上,由于标注了 @GetMapping("/echo/{message}")
注解,所以可以通过 http://ip:port/echo/{message}
来直接访问。
其中的 {message} 可以被替换为你需要的任何消息。
后面章节会对具体的访问做演示。
客户端程序自身并没有业务逻辑的实现,而是通过调用服务端的业务服务来实现业务,所以在本案例中需要重点关注如何使用客户端调用服务端。
在本案例中,客户端通过 nacos 的注册中心功能实现对服务端的发现。所以你会发现在客户端里并没有配置任何 服务端的地址
信息。
参考:客户端的 application.properties
本案例中的客户端通过两种方式调用服务端,所谓的”两种方式“具体来说是两种消费客户端的编程模型:
参考:OpenFeignController,EchoService
OpenFeignController
作为web调用的入口,用于接收前端的调用请求,并向内调用业务与服务实现功能。EchoService
是应用中对服务端所提供服务的引用接口。
在这个接口上,标注了@FeignClient
注解,以表示这个接口的服务是哪个服务端提供的。
@FeignClient
注解的值代表了服务端应用的服务端应用名
,以便于在多个不通过的服务提供者之间确定具体的服务。
参考:RestTemplateController
RestTemplate 是 spring 对所有 restful 服务调用的封装。
在 RestTemplateController 中,通过 restTemplate.getForObject 来调用服务端的 EchoServiceController.echo 方法。
通过前文的操作,将 getForObject 的第一个参数改为 "http://server/echo/" + message
。这看起来像是一个标准的url地址,但是其中的server
并不是域名,而是服务提供者的应用名。
前文说到,客户端并不关注服务端的地址
,但是需要关注服务端应用名
,这两个概念是有区别的:
服务端应用名
:是一个逻辑概念,代表可以被独立部署的一套应用程序;服务端的地址
:是物理概念,是实际部署以后具体的物理地址,例如IP;
每个服务端应用名
可以部署多份实例,每个实例都有自己的服务端的地址
。
本节,你需要使用 maven 的命令将程序代码编译打包为可执行的 jar 包
- 进入服务端目录
cd /home/shell/server
- 执行编译命令
mvn clean package -Dmaven.test.skip
tips: 第一次编译,因为本地 maven 仓库缺少相关的类库,编译可能会花 1-2 分钟的时间
- 进入服务端目录
cd /home/shell/client
- 执行编译命令
mvn clean package -Dmaven.test.skip
tips: 如果修改代码以后,需要重新执行编译命令
本节,你将使用 java 命令来运行上一步打包完成的 jar 文件
-
开启新 console 窗口:
点击我打开 -
在新窗口中执行命令
java -jar /home/shell/server/target/server-0.0.1-SNAPSHOT.jar
-
开启新 console 窗口:
点击我打开 -
在新窗口中执行命令
java -jar /home/shell/client/target/client-0.0.1-SNAPSHOT.jar
本节,你将通过浏览器访问在上一节运行起来的服务端程序和客户端程序
由于服务端使用http协议提供服务,所以可以直接使用浏览器访问,我们先来验证服务端的功能。
通过链接 访问地址 http://{ip}:60000/echo/theonefx
看到下面的内容代表服务端可以正常工作。
由于客户端提供2种调用方式,这里也分别请求者两个入口,参照访问服务端的方式,选择 61000 端口访问客户端。
- Openfeign
使用链接访问地址http://{ip}:61000/feign/echo/{message}
其中 {message} 可以替换为你需要的信息,你可以看到下面的效果:
- RestTemplate
使用链接访问地址http://{ip}:61000/call/echo/{message}
其中 {message} 可以替换为你需要的信息,你可以看到下面的效果:
如果你觉得还不过瘾,想在自己的环境中学习和调试前面的代码,可以在这里获得: