介绍
- 学习下SpringCloudAlibaba的使用,笔记主要是阿里云官网的Spring Cloud Alibaba 七天训练营中的内容和例子.
- 本地测试的demo地址在github上
SpringCloudAlibaba 体验-微服务开发入门教学
通过该教程,你将会:
- 使用 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
启动 Nacos 服务端
通过如下命令启动服务端
sh ~/prepare.sh
完成以上操作后,你将会获得链各个工程的代码,如下:
ls -l /home/shell/
drwxr-xr-x 5 shell shell 4096 Dec 15 14:26 client
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 服务端的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:65000
修改客户端配置
打开 客户端的 application.properties 文件
- 修改 Web 访问端口
将 server.port 的值改为 61000
要避免和服务端发生端口冲突,而60000已经被分配给了服务端,这里就用61000。
- 修改注册中心地址
将注册中心改为刚才启动的 Nacos 服务端的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:65000
- 修改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
本案例中的客户端通过两种方式调用服务端,所谓的”两种方式“具体来说是两种消费客户端的编程模型:
使用 OpenFeign 方式
参考:OpenFeignController,EchoService
-
OpenFeignController 作为web调用的入口,用于接收前端的调用请求,并向内调用业务与服务实现功能。
-
EchoService 是应用中对服务端所提供服务的引用接口。
在这个接口上,标注了 @FeignClient 注解,以表示这个接口的服务是哪个服务端提供的。
@FeignClient 注解的值代表了服务端应用的 服务端应用名,以便于在多个不同的服务提供者之间确定具体的服务。
使用 RestTemplate方式
参考: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 文件
启动服务端
1、开启新 console 窗口:
2、在新窗口中执行命令
java -jar /home/shell/server/target/server-0.0.1-SNAPSHOT.jar
启动客户端
1、开启新 console 窗口:
2、在新窗口中执行命令
java -jar /home/shell/client/target/client-0.0.1-SNAPSHOT.jar
访问应用程序
本节,你将通过浏览器访问在上一节运行起来的服务端程序和客户端程序
直接访问服务端程序
由于服务端使用http协议提供服务,所以可以直接使用浏览器访问,我们先来验证服务端的功能。
通过链接 访问地址 http://{ip}:60000/echo/theonefx
看到下面的内容代表服务端可以正常工作
hello Nacos Discovery theonefx
访问客户端程序
由于客户端提供2种调用方式,这里也分别请求者两个入口,参照访问服务端的方式,选择 61000 端口访问客户端。
- Openfeign
使用链接访问地址 http://{ip}:62000/echo-feign/{message} 其中 {message} 可以替换为你需要的信息,你可以看到下面的效果:
http://127.0.0.1:62000/echo-feign/feignclient
hello Nacos Discovery feignclient
- RestTemplate
使用链接访问地址 http://{ip}:62000/echo-rest/{message} 其中 {message} 可以替换为你需要的信息,你可以看到下面的效果:
http://127.0.0.1:62000/echo-rest/restclient
hello Nacos Discovery restclient