Spring Cloud提供了将Netflix开源产品集成到Spring Boot应用的能力,主要包括服务发现Eureka、熔断(Circuit Breaker) Hystrix、智能应用路由Zuul 和客户端负载均衡Ribbon。基于这个框架,开发人员可以非常容易地构建微服务应用。本示例已经Docker化,既可以在本地的测试环境中运行,也可以部署到阿里云容器服务上。
示例模拟的场景是企业内部应用服务化,服务之间通过API相互访问。foo服务和bar服务是两类基本服务,允许内网其他服务通过API访问,但不对外网提供服务。foobar对外提供服务,在处理时需要调用foo服务和bar服务。
服务发现机制由discovery-server提供,基于Eureka实现。由于discovery-server的业务无关性,开发人员可以直接使用Docker镜像。
foobar服务通过注册到智能应用路由gateway服务上对外提供服务,gateway基于Zuul,其代码业务无关,开发人员可以直接使用其Docker镜像,但由于zuul是通过配置文件来描述不同的服务对应的URL访问模式,所以在实际使用中需要改变镜像中的配置文件,或者通过挂载Volume实现配置文件的共享和修改。
foo, bar和foobar的代码中都包含了Eureka和Ribbon Client,实现了向Eureka的自注册和查询Eureka的能力,Ribbon实现了客户端的负载均衡。本示例中没有引入Hystrix。
服务间的逻辑架构如下图所示。
每个服务在运行时都可以根据负载水平扩展或收缩,所以在运行的时候服务间的逻辑关系视图可以表示如下。
在项目根目录下运行如下命令即可启动本地测试环境。
docker-compose up -d
使用MySQL,使用docker-compose.yml。使用RDS见下文。
数据库连接使用RDS的部署文件为(docker-compose.acs.yml)
docker-compose.acs.yml, 需要将{rds-name}
替换为RDS(MySQL)的名字,并将下面的数据库、用户名和口令进行更新。
mysql:
external:
host: {rds-name}.mysql.rds.aliyuncs.com
port: 3306
environment:
- MYSQL_ROOT_PASSWORD=passw0rd
- MYSQL_DATABASE=foodb
- MYSQL_USER=user1
- MYSQL_PASSWORD=passw0rd
如果在阿里云上开通了OSS,则可使用OSSFS。
bar:
image: registry.aliyuncs.com/jingshanlb/bar
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
- SERVER_PORT=8080
- MANAGEMENT_PORT=8081
volumes:
- 'foobar_upload:/upload'
./build-all.sh
运行前需要修改脚本中的REGPREFIX
变量。
./push-all-images.sh
运行前需要修改脚本中的REGPREFIX
变量,并Docker登录。
cd {service directory}
./gradlew build
cd {service directory}
java -jar build/libs/{service name}-0.0.1-SNAPSHOT.jar
cd {service directory}
docker build -t {service name} .
返回在Eureka中注册的服务实例信息,JSON格式。
curl -H "Accept: application/json" http://{discovery hostname}:8761/eureka/apps
用浏览器访问http://{discovery hostname}:8761/
显示Eureka页面。
通过Gateway访问foobar页面。
curl http://{gateway hostname}:8080/acs/index.html
通过Gateway访问foobar API。
curl http://{gateway hostname}:8080/acs
curl http://{gateway hostname}:8080/acs/message
Spring Eureka server. Code in discovery-server. Visit localhost:8761 to see which services are registered in.
curl http://{hostname}:{port}/
curl http://{hostname}:{port}/message
Foobar通过Discovery Server找到foo和bar,http://{hostname}:{port}/message
返回foo和bar组合消息。
curl http://{hostname}:{port}/message
Foo访问MySQL数据库,通过docker-compose文件中的参数配置变化,可以很容易地切换到阿里云RDS。
curl http://{hostname}:{port}/message
另外,Bar服务中包含spring actuator
。配置信息在services/bar/src/main/resources/application.yml
Actuator官方示例:Building a RESTful Web Service with Spring Boot Actuator